unity之——AssetBundle在安卓平臺的打包與載入解析(超大一個坑!今天給填了)
最近一直在頭疼一個問題,自己寫的小Demo,利用AssetBundle動態載入的方式在安卓平臺顯示一個圖片的預設。一直不成功的原因是:因為載入路徑的問題,在安卓平臺下載入不出來assetBundle物件。我是用的AssetBundle.LoadFromFile()的方法載入的,這個路徑是AssetBundle.LoadFromFile(Application.dataPath+"!assets/texture"); !!!!!!!!其中texture是我給打包資源取的名字。
下面我來詳細說一下AssetBundle在安卓平臺的打包與載入解析。
1.首先,我要顯示一個圖片的預設體,然後在程式碼中載入這個預設並顯示。這裡有兩種動態載入的方案:Resource.Load()的方式和AssetBundle.LoadFromFile()的方式,來自檔案就用這個,也可以來自Memory,用CreateFromMemory(byte[]),這個byte[]可以來自檔案讀取的緩衝,也可以用www的下載或者其他可能的方式。
其實WWW的assetBundle就是內部資料讀取完後自動建立了一個assetBundle而已。
2.給要打包的資源取個名字,因為只有一個圖片的預設,我在這裡起的是texture。這裡上個圖:
如上圖右下角,AssetBundle的名字是texture(對了,我的圖片預設名字是Texture,在這裡順便提一下)。
然後就可以進行資源打包了,打包的話,要注意:我把資源打包在了StreamingAssets目錄下,這是一個Assets下的特殊目錄,StreamingAssets也就是流式資源載入目錄,該目錄被拷貝到build資料夾中,不會修改,一般用於放置音訊檔案。
打包的程式碼如下:
using UnityEditor; public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { //BuildPipeline.BuildAssetBundles("Assets/StreamingAssets", BuildAssetBundleOptions.ChunkBasedCompression); BuildPipeline.BuildAssetBundles("Assets/StreamingAssets", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android); } }
在這裡我用的LZ4格式壓縮,Unity 5.3之後的版本增加了LZ4格式壓縮,由於LZ4的壓縮比一般,因此經過壓縮後的AssetBundle包體的體積較大(該演算法基於chunk)。但是,使用LZ4格式的好處在於解壓縮的時間相對要短。
若要使用LZ4格式壓縮,只需要在打包的時候開啟BuildAssetBundleOptions.ChunkBasedCompression即可。
注意:因為是打包到安卓平臺執行的,所以要加上BuildTarget.Android,指定平臺。如果是直接在WindowsPC端執行就不用加這個欄位。
還要注意:引用了unityEditor的類要放在Assets目錄下的Editor資料夾中,這也是一個特殊目錄。
打包後如圖所示:
3.接下來就是把工程build成apk檔案,然後在安卓平臺上測試運行了,這裡不再演示。現在我要說的重點來了:解析載入AssetBundle包!!!!!!!!!!
我先附上核心程式碼:
AssetBundle bundle;
bundle = AssetBundle.LoadFromFile(Application.dataPath+"!assets/texture");
UnityEngine.Object obj = bundle.LoadAsset("Texture") as UnityEngine.Object;
GameObject go = Instantiate(obj,transform.position,Quaternion.identity) as GameObject ;
bundle.Unload(false);
在這裡最坑爹的就是載入路徑,如果是在Windows下的PC平臺開發的話,直接
bundle = AssetBundle.LoadFromFile("Assets/StreamingAssets/texture");就可以了。
安卓平臺的載入路徑網上眾口不一,有好多個版本,我都試了結果都不行。經過多方面測試,只需要:
Application.dataPath+"!assets"+“/資源包名” 即可。
網上好多用的是Application.streamingAssetsPath+資源包名,Application.streamingAssetsPath其實就等於
“jar:file://” + Application.dataPath + “!/assets/”;
然而問題就出現在這個路徑上。我列印了一下LOG
Application.streamingAssetsPath = jar:file:///data/app/com.xxx.xxx-1.apk!/assets
Application.dataPath+”!assets” = /data/app/com.xxx.xxx-1.apk!assets
也就是說Application.streamingAssetsPath 多了一個 jar:file://
那麼如果想在Android上同步方法AssetBundle.LoadFromFile 就得用 Application.dataPath+”!assets”這個路徑。
好了,終於把這個大坑填完了,希望能夠幫到大家(別加“ jar:file://”)!!!!!
好了,下班回家!