Unity3D:異步加載場景資源進度條?

Unity3D中很多時候需要用到異步加載場景或資源.如異步打開一個非常大的場景;兩個場景之間的一個過渡;遊戲關卡的加載等等,通過添加一個進度條場景的方式可以很好的增強客戶體驗,並讓客戶瞭解場景的加載進程.本文主要介紹進度條場景的實現方法和異步加載AsyncOperation

工具/原料

Unity3D,Visual Studio

方法/步驟

場景搭建:任意建兩個場景,分別命名為testScene1、testScene2,兩個場景中分別設置"切換場景"按鈕,便於立昂場景之間的相互切換,注意,兩個切換按鈕加載的的場景均是"loadScene";建loadScene場景,用於處理加載進度條.

Unity3D:異步加載場景資源進度條

Unity3D:異步加載場景資源進度條

導入NGUI資源包,在Unity3D菜單欄中選中NGUI-Open-Prefab Toolbar,在Prefab Toolbar窗口中,選中Control - Colored Progress Bar拖拽至Hierarchy面板,修改名字為"Loading";

Unity3D:異步加載場景資源進度條

Unity3D:異步加載場景資源進度條

在Hierarchy面板,Loading添加子物體Label,Label的Context內容為"loading",適當調整字體大小.創建腳本LoadingScripts,UI Root的攝像機Camera添加組件LoadingScripts

Unity3D:異步加載場景資源進度條

Unity3D:異步加載場景資源進度條

LoadingScripts腳本代碼如圖所示.

objProcessBar.GetComponent ().value = acOp.progress;

異步加載場景testScene2的速度直接決定了進度條的實際進展速度.

Unity3D:異步加載場景資源進度條

你會發現,加載場景loadScene一閃而過,迅速的就跳轉到了場景testScene2.完全無法看到進度條進展的過程.原因是,場景loadScene太小,加載場景loadScene的時間非常非常短,此時用加載場景的速度來控制進度條的進展速度就會讓加載場景失去它存在的意義.上述代碼簡單實用性強,非常適合加載大場景大資源等耗時長的情況

Unity3D:異步加載場景資源進度條

為了滿足小資源/場景加載時也顯示出進度條,使用如下圖所示代碼.AsyncOperation另一個重要的屬性AsyncOperation.allowSceneActivation

acOp.allowSceneActivation = false;

acOp.allowSceneActivation = true;

當 acOp.allowSceneActivation = false即使場景已經加載完成,也不會自動跳轉,直到acOp.allowSceneActivation = true;

Unity3D:異步加載場景資源進度條

實驗一下效果,進度條進展效果良好.仔細觀察,進度條1%、2%、3%到100%,完全按照i++的代碼設定執行.這時進度條的額進展速度與異步加載場景的速度無關

Unity3D:異步加載場景資源進度條

之所以能夠得到滿意的效果,每一個百分比的進度都能展示在我們眼前,是因為這個腳本中還有一個重要的語句. yield return new WaitForEndOfFrame();

Unity3D:異步加載場景資源進度條

將該語句移到while循環語句的大括號外面,再次運行Unity3D,看一下效果,你會發現,加載場景loadScene再次一閃而過.這是因為這裡的while循環只處理了一個判斷i 是否小於 100,一個i++,和一個賦值語句,電腦的執行速度是非常快的,快的有時人眼無法識別.這時

yield return new WaitForEndOfFrame();派上了大用場,每次複製完畢,都要等到幀渲染結束,才能進行下一次循環

Unity3D:異步加載場景資源進度條

Unity3D:異步加載場景資源進度條

Unity3D:異步加載場景資源進度條

賦值語句

objProcessBar.GetComponent ().value = i / 100;每次賦值一次,Loading-Thumb-Label的數值就要改變一次,Loading-Overlay的顯示面積也會改變一次,每次都要等這些幀渲染完畢,才能進行下一次的循環. yield return new WaitForEndOfFrame()就可以使進度條以肉眼可辨的速度進行變化

異步操作AsyncOperation只有四個屬性(Unity聖典中只介紹了三個,還有一個屬性是allowSceneActivation),靈活運用四個屬性,才能得到想要的效果

Unity3D:異步加載場景資源進度條

注意事項

Application.LoadLevelAsync("")與Application.LoadLevel("")原理相同,只不過前者是異步加載後者是同步加載

Application.LoadLevelAsync("")雙引號內為場景名稱,或者也可以使用int類型的場景索引,場景索引可以在file-Build Setting...中查詢

如果喜歡本文可以點擊下方的“收藏”和“關注”,也可以給作者投上寶貴的一票,您的支持將給作者莫大的動力

如果喜歡可以點擊右邊的兩個箭頭圖標分享給好友

場景, 資源, 進度條,
相關問題答案