1. 程式人生 > >Unity 移動端 The file 'none' is corrupted. 報錯解決

Unity 移動端 The file 'none' is corrupted. 報錯解決

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# 指令碼的索引屬性上。