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

好了,下班回家!

猜你喜欢

转载自blog.csdn.net/cgy56191948/article/details/81207184
今日推荐