轉載請標明出處:http://www.cnblogs.com/zblade/
以前都是寫一些個人的調研博客,從今天開始,也寫一些個人在開發中遇到的一些可以分享的趟坑博客,為后續的開發人員提供一些綿薄之力的幫助吧。
好的,今天就分享一個困擾了一個晚上的assetbundle中如何加載ScriptableObject的坑。
一、ScriptableObject在assetbundle中的使用
作為可以顯示配置的數據格式,ScriptableObject類型數據目前已經大量的使用在項目中,具體使用方法不做過多的解釋,查看相關文章即可。我在使用的時候,首先構造一個繼承的類:
public class AppearanceData : ScriptableObject { [SerializeField] public AppearanceResourceData resourceData; [SerializeField] public string appearanceName; }
然后基於該類創建一些實例資源:
然后構建一個類存儲所有這些資源:
/// <summary> /// 角色外觀數據庫文件 /// </summary> public class AppearanceDataLib : ScriptableObject { public List<AppearanceData> appearanceList = new List<AppearanceData>(); }
二、將ScriptableObject打成assetbundle 包
利用打包接口,打成AssetBundle的數據包,利用AssetStudio, 查看打包的數據:
所有的資源都被打成一個bundle,好的,讓我們接下來測試加載:
private static IEnumerator GetAsset(string path) { AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path); yield return request; string[] names = request.assetBundle.GetAllAssetNames(); AssetBundle ab = request.assetBundle; Object[] objs = ab.LoadAllAssets(); UnityEngine.Debug.Log("objs: " + objs.Length); foreach (var item in names) { UnityEngine.Debug.Log(item); } ab.Unload(true); }
運行結果:
輸出顯示有資源名字,但是沒有資源!!!
嘗試了各種加載接口,都沒有將資源加載出來,網上搜索了一下,同樣的加載接口,別人能加載出來,這兒都沒有成功,頭皮都撓破了。
三、如何分析定位以及解決問題
首先,測試一下其他的ab資源是否一樣加載不出資源,發現其他的ab資源沒問題,那么問題肯定出在當前這個ab包上
其次,如果當前這個AppearanceLib的數據加載不出來,那我單獨打一個AppearanceData類型的數據作為一個ab包,是否可以加載?測試發現可以!
最后,問題很清楚,就是這個AppearanceDataLib的數據有問題,回到項目查看:
提示AppearanceDataLib找不到?
這是一個問題,在加載ab中資源的時候,也提示當前腳本missing
the referenced script on this behaviour is missing
這個腳本是如何放置的?
我將這個類放在AppearanceData.cs文件中,並沒有單獨的列出一個文件存放,所以ab找不到該文件,好的,問題定位了,解決辦法就是單獨新建一個文件AppearanceDataLib,
用來存放該類:
重新打ab包,測試加載:
得到該scriptableobject數據, done!
四、總結
Unity中的assetbundle,會包含當前數據/資源對應的腳本,這些.cs腳本需要單獨一一的列成一個文件,不能寫在其他文件中,不然assetbundle在加載的時候,會找不到這些腳本文件,在這兒的
問題就是找不到這些腳本對應的數據。