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 之前執行就可以了!
大家試試看吧!
 
arrow
arrow
    文章標籤
    C# Unity AssetBundle Error
    全站熱搜

    岳 發表在 痞客邦 留言(0) 人氣()