Unity5-ABSystem(三):AssetBundle加载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lodypig/article/details/51872595
Unity特殊路径
Resources
StreamingAssetsPath
PersistentDataPath
DataPath
同步加载
核心函数
安卓平台下不能同步加载问题
示例
异步加载
核心函数
示例
WWW异步加载
资源加载
核心函数
加载一事,就要先从路径说起了。
Unity特殊路径
在加载AssetBundle时,要给出AssetBundle文件路径,Unity有很多特殊路径,这里列出部分与加载相关的路径。这些路径在不同平台下是不相同的,并可能包含项目或公司名字。下文中出现的类似myProject、myCompany应换成你工程所对应的名字。
Resources
Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好。Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources目录在应用中也就不复存在,但加载时仍使用曾在Resource下的路径。
该目录下所有资源会被压缩,只读不可写,使用Resources.Load()接口加载。
StreamingAssetsPath
StreamingAssets目录必须在Assets根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。Unity基本也没有提供从该路径下直接读取资源的方法,只有www可以加载audioClip、texture和二进制文件。但Unity提供了从该目录加载AssetBundle的方法,我们一般直接在这个目录下存放AssetBundle文件。可以通过Application.streamingAssetsPath访问该路径。
各平台StreamingAssets路径打印:
Win:E:/myProj/Assets/StreamingAssets
Mac : /myProj/Assets/StreamingAssets
Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw
PersistentDataPath
该目录为应用程序沙盒目录,应用程序安装后才会出现。该目录独特之处在于是可写的,所以我们一般将下载的AssetBundle存放于此。使用Application.persistentDataPath访问。
各平台PersistentDataPath路径打印:
Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj
Mac : /Users/lodypig/Library/Application Support/myCompany/myProj
Andorid:/data/data/com.myCompany.myProj/files
iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents
DataPath
应用程序目录,即Assets目录。使用Appliction.dataPath访问。
各平台DataPath路径:
Win:E:/myProj/Assets
Mac : /myProj/Assets/
Andorid:/data/app/com.myCompany.myProj-1/base.apk!
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data
同步加载
核心函数
AssetBundle AssetBundle.LoadFromFile(string path);
1
安卓平台下不能同步加载问题
安卓平台下,直接使用Application.streamingAssetsPath进行加载会报cannot open archive的错误,原因是加载时路径不对。可以返回上面看一下,安卓平台下Application.streamingAssetsPath以jar:file://开头,跟其他人都不一样。将这段去掉就能够正常加载。而去掉后等价于Application.dataPath + “!assets”,所以在Android下我们用该路径加载。
示例
public class AssetBundleLoader {
// 根据不同平台,声明StreamingAssetsPath路径
public static readonly string STREAMING_ASSET_PATH =
#if UNITY_ANDROID
Application.dataPath + "!assets"; // 安卓平台
#else
Application.streamingAssetsPath; // 其他平台
#endif
// 从StreamingAssetsPath加载
public static AssetBundle LoadFromStreamingAssetsPath(string assetbundle) {
return AssetBundle.LoadFromFile(STREAMING_ASSET_PATH + "/" + assetbundle);
}
// PersistantDataPath加载
public static AssetBundle LoadFromPersistantDataPath(string assetbundle) {
return AssetBundle.LoadFromFile(Application.persistentDataPath+ "/" + assetbundle)
}
}
异步加载
核心函数
AssetBundleCreateRequest AssetBundle.LoadFromFileAsync(string path, uint crc = 0, ulong offset = 0);
示例
public class AssetBundleLoader : MonoBehaviour {
// 声明StreamingAssetsPath如上
public static readonly string STREAMING_ASSET_PATH = ...
// 协程实现
static IEnumerator LoadAsyncCoroutine(string path, Action<AssetBundle> callback) {
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(path);
yield return abcr;
callback(abcr.assetBundle);
}
// 开启协程
static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback)
{
StartCoroutine(LoadAsyncCoroutine(finalPath, callback));
}
// 从StreamingAssetsPath异步加载
public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) {
return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle);
}
// PersistantDataPath异步加载
public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) {
return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle)
}
}
WWW异步加载
除了使用AssetBundle.LoadFromFileAsync外,还可以使用www异步加载AssetBundle。
public class AssetBundleLoader : MonoBehaviour {
// WWW加载时StreamingAsset各平台路径
public static readonly string WWW_STREAM_ASSET_PATH =
#if UNITY_ANDROID
Application.streamingAssetsPath; // 路径与上面不同,安卓直接用这个
#elif
"file://" + Application.streamingAssetsPath; // 反而其他平台加file://
#endif
// www协程实现
static IEnumerator LoadFromWWWCoroutine(string path, Action<AssetBundle> callback)
{
WWW www = new WWW(path);
yield return www;
callback(www.assetBundle);
www.Dispose();
www = null;
}
//开启协程
static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback)
{
StartCoroutine(LoadFromWWWCoroutine(finalPath, callback));
}
// 从StreamingAssetsPath异步加载
public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) {
return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle);
}
// PersistantDataPath异步加载
public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) {
return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle)
}
以上三种方式都可以从一个完整的StreamingAssetsPath下,加载到一个AssetBundle对象。接着我们要从AssetBundle对象中,加载出可爱的资源们资源加载
核心函数
Object AssetBundle.LoadAsset(string assetName, Type resType);
AssetBundleRequest AssetBundle.LoadAssetAsync(string assetName, Type resType);
没什么好说的,上代码吧,看参数名和接口应该就能明白。同样是同步和异步两种方式。
// 同步
public UnityEngine.Object Load(AssetBundle assetbundle, string assetName, Type resType)
{
return assetBundle.LoadAsset(assetName, resType);
}
// 一部
IEnumerator LoadAssetAsyncCoroutine(AssetBundle ab, string name, Type resType, Action<UnityEngine.Object> callback)
{
AssetBundleRequest request = ab.LoadAssetAsync(name, resType);
// 等待加载完成
while (!request.isDone)
{
yield return false;
}
callback(request.asset); // 回调上层
}
除了这些外,加载资源还有LoadAllAssetsAsync、LoadAllAssets等方法,加载AssetBundle还有LoadFromMemory、LoadFromMemoryAsync方法。原理类似,不再赘述。详情见Unity官方网站。
————————————————
版权声明:本文为CSDN博主「lodypig」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lodypig/article/details/51872595
Unity5-ABSystem(三):AssetBundle加载的更多相关文章
- Unity5.x版本AssetBundle加载研究
之前说了 “Unity5.x版本AssetBundle打包研究”,没看过的请先看一下:http://www.shihuanjue.com/?p=57 再来看本文,有一定的连接性. 先梳理一下思路: 要 ...
- Unity5系列资源管理AssetBundle——加载
上次我们进行了AssetBundle打包,现在我们还把打包的资源加载到我们的游戏中.在加载之前,我们需要把打包好的Bundle包裹放到服务器上,如果没有,也可以使用XAMPP搭建本地服务器. 加载的A ...
- AssetBundle加载API
AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...
- 一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版
上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文 ...
- Entity Framework关联实体的三种加载方法
推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...
- EF三种加载方法
EF性能之关联加载 鱼和熊掌不能兼得 ——中国谚语 一.介绍 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和 ...
- U3D assetbundle加载与卸载的深入理解
using UnityEngine; using System.Collections; using System; public class testLoadFromAB : MonoBehavio ...
- U3D assetbundle加载
using UnityEngine; using System.Collections; public class testLoadFromAB : MonoBehaviour { IEnumerat ...
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https:// ...
随机推荐
- Circular RNA的产生机制、功能及RNA-seq数据鉴定方法
推荐关注微信公众号:AIPuFuBio,和使用免费生物信息学资源和工具AIPuFu:http://www.aipufu.com. [Circular RNA的产生机制] Circular RNA,缩写 ...
- spring 定时器知识点
一.各域说明 字段域 秒 分 时 日 月 星期(7为周六) 年(可选) 取值范围 0-59 0-59 0-23 1-31 1-12或JAN–DEC 1-7或SUN–SAT 1970–2099 可用字符 ...
- 序列标注(HMM/CRF)
目录 简介 隐马尔可夫模型(HMM) 条件随机场(CRF) 马尔可夫随机场 条件随机场 条件随机场的特征函数 CRF与HMM的对比 维特比算法(Viterbi) 简介 序列标注(Sequence Ta ...
- 孙悟空的七十二变是那般?--java类型的七十二变揭秘
故事背景 在<西游记>原著第六回,孙悟空大闹天宫反下界,玉帝派十万天兵围剿,却被打得落花流水.玉帝不得不放下架子,请自己外甥二郎神回来支援.孙悟空与二郎神本事差不多,两人斗得不分胜负,但二 ...
- 基于elasticsearch的自定义业务告警的设计思路
A系统与B系统之间有很多接口交互,但是有一段时间接口经常报错,作为开发如果不能第一时间知道问题且及时解决的话就会收到业务投诉,当月绩效凉凉. 如果你也有这种场景,那么你就需要一个及时告警的功能. 实现 ...
- 使用gtest(googletest)进行c++单元测试
这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/1158 ...
- Thinkphp5.0第五篇
原样输出 使用literal标签防止模板标签被解析 例如 {literal} {$name}<br/> {/literal} 模板单行注释 {//注释内容} 多行注释 {/*注释内容*/} ...
- react 首屏性能优化
首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ...
- e课表项目第二次冲刺周期第十天
昨天完成了什么? 昨天还有一天第一次冲刺周期就结束了,我们的工作也接近尾声了,所以今天我利用之前的方法,完成了对监听的设置,以及对修改界面的编写,可以实现相应的删除和修改的功能,然后我和我们组的成员商 ...
- MOV与LEA
MOV 格式:MOV dest, src 作用:赋值,且不改变标记位的值 特点:可以从寄存器到寄存器.从立即数到寄存器.从存储单元到寄存器.从立即数到储存单元.从寄存器到存储单元.从寄存器或存储单元到 ...