6-32 AssetBundle Unload And Browser tool
本章要來介紹AssetBundle的卸載機制,以及官方提供的AssetBundle瀏覽工具。首先,如果將遊戲物件從場景中Destroy,Unity也不會自動卸載AssetBundle,即便你後面都不使用,已載入的AssetBundle仍占用記憶體。 除非你更換場景(Scene),更換的時候Unity會自動Destroy所有場景中的遊戲物件,並接著呼叫Resources.UnloadUnusedAssets,這個函數會將沒有用到的Asset從記憶體中卸載。 所以,當我們想要手動卸載不需要的Asset時該怎麼做?可以使用AssetBundle.Unload(bool)這個函數。這個函數依據布林值有兩種用法: AssetBundle.Unload(true):卸載指定的AssetBundle中的Asset。 AssetBundle.Unload(false):卸載指定的AssetBundle中的Asset,但已加載到場景中的Asset將維持不變。 Unity官方並不建議使用AssetBundle.Unload(false),因為管理不當的話,有可能導致場景中有多份以上的相同Asset。 以下引用Unity官方文檔的圖進行解說。當使用AssetBundle.Unload(false)進行卸載時,場景中已使用的Material不會跟著卸載,AssetBundle與Material之間的Link會切斷。 重新讀取AssetBundle後,Unity不會重新將遺留在場景中的Material與AssetBundle連結起來。 假如場景中再度要使用AssetBundle內的Material時,此時的場景上會有兩份相同的Material,這樣就會有浪費記憶體的問題。 我們可以用程式碼來測試這個現象。首先,我使用AssetBundle讀取資源,使用Instantiate於場景中產生資源,接著呼叫assetBundle.Unload(false),使用false的話,不會影響場景中已經被產生出來的資源。 所以,於遊戲中可以看到,即便使用AssetBundle.Unload(false),房屋模型依舊存在。 接著我要再度載入相同的AssetBundle,並產生一個相同的房屋模型,放置在原本的房屋模型的旁邊。 這時的遊戲