1. 程式人生 > >unity之——AssetBundle在安卓平臺的打包與載入解析(超大一個坑!今天給填了)

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://”)!!!!!

好了,下班回家!