最近一直在头疼一个问题,自己写的小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://”)!!!!!
好了,下班回家!
Unity5.4的AssetBundle的打包和加载,是一个包含了打包资源包和更新下载资源包的简单框架, 可用于大部分游戏开发的初始化操作,实际项目可根据具体需求扩展。
项目详解参考项目中的ReadMe.txt说明。
PS:小弟分享自己苦心研究和整合的最新AssetBundle的使用流程,不求金钱,只求8分……望支持
Unity5增加了新的打包AssetBundle方式-> BuildPipeline.BuildAssetBundles,这种方式相对旧的来说,打包后的资源更碎片化,带来的好处也显而易见,每个资源都只打包一次不会造成依赖循环(不了解的同学可以看一下assetbundle
坑爹总结)。
思想上有点类似李总(李剑英)的资源热更新方案,将资源文件解析成json文本,使用的时候只需下
版本unity5.3.3android 小米pad1streamingAssets 这个目录在IOS下是可以同步读取的,但是在Android下必须用www来异步读取。。这就很恶心了~所以最近我就在想办法如何能在Android下也能同步读取。如下图所示,我把一个sprite打成assetbundle并且放在StreamingAssets目录下。assetbundle的压缩格式 ,我使用的是unity...
前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。
AssetBundles让你通过WWW类流式加载额外的资源并在运行时实例化它们。AssetBundles通过BuildPipeline.BuildAssetBundle创建。
看了雨凇MOMO的关于 AssetBundles的帖子,受益很多,但是他
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, //BuildTarget.StandaloneWindows64
BuildTarget...
string strABOutPathDIR = Application.streamingAssetsPath+"/Android";
BuildPipeline.BuildAssetBundles(strABOutPathDIR, BuildAssetBundleOptions.ChunkBasedCompression, Buil...
是因为unity4.x时代还是默认的lzma的压缩方式 直到unity5.3版本开始出现lz4的压缩方式,
所以就出现了本次问题,unity2019打包时默认使用lz4 比 unity4.7打出来的bundle大3倍, 2019在打包的时候改成lzma算法之后 bundle大小接近了4.7的水平(还是会略大一些,因为包含的内容多了),所以决定初始包继续用lzma算法.
[]unity2019打包assetBundle比unity4.7要大很多]
Unity中打包Texture到AssetBundle反而比原资源jpg格式还要大,该怎么减小空间?
将1000张的jpg图片拖入Unity,格式设为Texture,并且进行不压缩的方式打包成assetbundle格式。原本一共才50M的jpg,最后居然打包出来340M的assetbundle!!!翻了快7倍!!!
一、认识Assetsbundle
由Unity提供的AssetBundle,最早出现于2017版本。允许您通过Unity的WebRequest类下载资源,并在运行时实例化它们。
二、使用Assetsbundle
2.1 准备资源工作
新建Unity工程项目
工程命名:Assetsbundle(其他均可)
将必要的模型以预制件形式存储于资源文件夹内
选中对应预制件资源(可多选)
Inspector窗口会出现关于预制件资源的可视窗口。在窗口的正下方即为Assetsbundle