close
你是否有發生過載入 AssetBundle 時無回應的情況呢?
明明使用別的場景來測試時都正常,偏偏在遊戲中 AssetBundle 沒有反應?例如以下狀況:
// 已確定過 url 位置是正確的, version 版號也沒錯誤 WWW www = WWW.LoadFromCacheOrDownload( url, version ); // 但是程式到這一行後, 就都完全沒有消息了 yield return www;
也沒有 Error 訊息,網路也都正常,但偏偏程式就是卡在這邊。
其實這情況經常發生在轉場時的 Loading 頁面。
大家都會在 Loading 頁面中去下載或者載入 AssetBundle 的資源,該作法是正確的,但是可能順序錯了!
可能大家做法都跟下面一樣
// 開始載入場景 AsyncOperation asyncOperation = Application.LoadLevelAsync( levelName ); // 手動切換場景 asyncOperation.allowSceneActivation = false; // 檢查場景是否載入完成 while( !asyncOperation.isDone ) { yield return null; } // 開始載入 AssetBundle // ... // ... // ... // AssetBundle 載入完畢 // 都載入完畢了! 可以切換場景了 asyncOperation.allowSceneActivation = true;
看起來是沒錯,但是程式偏偏會卡在 "開始載入 AssetBundle" 這邊。
這是因為 asyncOperation.allowSceneActivation 被設為 false 了。
造意思看來,這句程式碼的意思是 "是否允許場景運作",這邊設為 false 的話,這樣場景就算載入完畢了,也不會馬上進入該場景中,而是可以讓我們決定近入場景的時間點。
因為我們可能需要 Loading 的相關過場畫面,可能是淡入淡出,可能是進度條展演等等。
但是 asyncOperation.allowSceneActivation 被設為 false 時,AssetBundle 的載入也會一併被暫停,所以才會發生 AssetBundle 無反應卻又無錯誤訊息的問題。
好吧,我不太確定這邊是否為 Unity 的 Bug 還是怎樣......
以上是官方的說明~一樣的簡潔有力,完全沒有提到 AssetBundle 會被暫停的問題。
不過問題也不大,大家只要換個順序就可以了。
以下為修正版:
// 開始載入 AssetBundle // ... // ... // ... // AssetBundle 載入完畢 // 開始載入場景 AsyncOperation asyncOperation = Application.LoadLevelAsync( levelName ); // 手動切換場景 asyncOperation.allowSceneActivation = false; // 檢查場景是否載入完成 while( !asyncOperation.isDone ) { yield return null; } // 都載入完畢了! 可以切換場景了 asyncOperation.allowSceneActivation = true;
只要你 "開始載入 AssetBundle" 這邊的程式碼,在 asyncOperation.allowSceneActivation 被設為 false 之前執行就可以了!
大家試試看吧!
文章標籤
全站熱搜