Unity 移動端 The file 'none' is corrupted. 報錯解決
阿新 • • 發佈:2019-02-06
Editor 上不報錯,打成 ab 包在移動端報錯
1. 應用背景:
我出現此問題的背景環境是:
我使用一個自定義的列表元件來管理列表 item 的迴圈複用;
然後 item 做成一個預製體,跟列表介面預製體放在同一目錄下;
列表元件中通過一個
public GameObject itemPref;
的屬性索引 item 預製體,例項化的時候使用Instantiate(itemPref)
的方式實現;
這樣的流程在 Unity 編輯器上執行完全沒問題,然後打 android 包的時候,我將預製資源都打成了 AB 包,每個 .prefab
預製都打成一個 .assetbundle
The file 'none' is corrupted. Remove it and launch unity again [position out of bounds!]
大致意思,就是例項化 item 失敗了。
2. 問題分析:
直接檢視列表介面預製體打成 .assetbundle
對應的 ..assetbundle.manifest
檔案,在檔案末尾,可以看到該預製所需要引用到的資源列表:
...
Assets:
- Assets/res/Prefabs/ui/rank/PnlRank.prefab
Dependencies:
- C :/XXX/Assets/../resource/assets/res/common/materials.assetbundle
- C:/XXX/Assets/../resource/assets/res/ui/atlas/common.assetbundle
- C:/XXX/Assets/../resource/assets/res/ui/atlas/rank.assetbundle
- C:/XXX/Assets/../resource/assets/res/ui/atlas/roles.assetbundle
- C:/XXX/Assets/../resource/assets/res/ui/fonts/default.assetbundle
可以看到通過 C# 指令碼引用的預製資源並不會被記錄在此檔案中,所以例項化的時候自然也找不到對應的資源,從而導致例項化失敗。
3. 解決方案:
既然 AB 機制下,不同預製不能通過 C# 來索引,可以考慮一下兩個方案:
- 方案一:通過程式碼和資源路徑索引資源,然後再例項化;
- 方案二:不將 item 單獨做成預製體,而是直接放在列表 UI 的預製體中,設定為
active = false
(隱藏),然後再拖拽到 C# 指令碼的索引屬性上。