Unity3D:動態加載(AssetBundle)

讀取StreamAssetstxt文件的失敗方法

TextAsset text;
	BundleURL = "jar:file://" + Application.dataPath + "!/assets/" + "transform.unity3d";
using(WWW www = new WWW(BundleURL))
		{
			yield return www;		//I think, Equals to if(!www.isdone) Return
						if (www.error != null)
				throw new Exception("WWW download had an error:" + www.error);
						bundle = www.assetBundle;		
						text = (TextAsset)bundle.mainAsset;
			Debug.Log(text.text);
		}

或者更簡單,直接www.text就是文件中的內容。assetbundle都不需要。


cmd中,用logcat輸出android手機上的信息時,可能會輸出不完整,一定要注意。


LoadFromCacheOrDownload

www.LoadFromCacheOrDownload只能緩存讀取assetbundle數據,對於txt,只需要用普通的非緩存方法讀取即可。


Bundleversion

關於bundle的version。如果以前曾用同一版本的參數下載,該文件將只從磁盤高速緩存加載。通過增加應用程序的版本號,你可以強制緩存從URL下載一個新AssetBunlde的副本。貌似跟你打包沒關係,  LoadFromCacheOrDownload 是如果緩存中已經有的,不會再從服務器上加載.當你需要從服務器上加載時,那麼把version 改變下,unity3d一對比,版本號不同,就說明你要從服務器從新加載,而不是從緩存中讀。


打包

error: Object names must match the paths。打包Agulou_cumo的時候,出錯,經過排查,將數組長度改爲1,可以正常導出。string[] assetName = newstring[1];

BuildPipeline.BuildAssetBundleExplicitAssetNames(selection,assetName, path, BuildAssetBundleOptions.CollectDependencies |BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);

這種方式打的包,必須用自定義的名字去引用bundle,不能再用一個路徑名引用了。

 

unity3d,assetbundle.load或者LoadAsync的第一個參數,是asset的名字,也就是打包之前物體的名字,而不是.unity3d文件的文件名。切記


AssetBundle小結:

關鍵代碼:

GameObjectclone,P;//定義遊戲物體

P= GameObject.Find("Ajianzhu");//尋找場景內是“Ajianzhu”的物體

clone= (GameObject)Instantiate(b.Load(AssetName));  //初始化Cache中的物體

clone.transform.parent= P.transform;//將clone的父親設置爲P

print(clone.transform.localPosition);

clone.transform.localPosition=new Vector3 (352.8858F,-80.0F,-198.5447F);//設置clone相對於父物體的座標

     print(clone.transform.localPosition);
 

注意:將場景中的物體做成prefab之後,然後製成assetbundle,加載的時候,默認是放在場景的根目錄下,所以座標會產生偏差。如果直接將prefab直接拖入Hierarchy,必須拖入其原來所在的目錄,才能保證座標正確。

Note:BuildPipeline.BuildAssetBundle中最後一個參數,如果不設置的話,默認的平臺是webplayer,要設置成BuildTarget.Android,才能保證打包的時候不會跳轉到webplayer平臺

 

Assetbundle中的asset,比如一個gameobject,如果它的名字和texture或者material重名,使用assetname讀取的時候,會出現混亂,不一定能讀到gameobject。


加載路徑 :

    在android上,使用緩存加載機制的時候,有很多隱含的問題,bundleURL要使用如下形式,

"jar:file://" +Application.dataPath +"!/assets/" + AssetName +".unity3d";

 別忘了加後綴,否則找不到文件。在pc上用StreamingAsset的時候,可能會出現斜槓的問題,可以如下解決(system.String.Replace)。

//     BundleURL =Application.dataPath +"/StreamingAssets/" + AssetName;

//     BundleURL ="file://" +BundleURL.Replace("/", "\\") +".unity3d";





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章