版权声明:本文为博主原创文章,遵循 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加载的更多相关文章

  1. Unity5.x版本AssetBundle加载研究

    之前说了 “Unity5.x版本AssetBundle打包研究”,没看过的请先看一下:http://www.shihuanjue.com/?p=57 再来看本文,有一定的连接性. 先梳理一下思路: 要 ...

  2. Unity5系列资源管理AssetBundle——加载

    上次我们进行了AssetBundle打包,现在我们还把打包的资源加载到我们的游戏中.在加载之前,我们需要把打包好的Bundle包裹放到服务器上,如果没有,也可以使用XAMPP搭建本地服务器. 加载的A ...

  3. AssetBundle加载API

    AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...

  4. 一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版

    上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文 ...

  5. Entity Framework关联实体的三种加载方法

    推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...

  6. EF三种加载方法

    EF性能之关联加载   鱼和熊掌不能兼得 ——中国谚语 一.介绍 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和 ...

  7. U3D assetbundle加载与卸载的深入理解

    using UnityEngine; using System.Collections; using System; public class testLoadFromAB : MonoBehavio ...

  8. U3D assetbundle加载

    using UnityEngine; using System.Collections; public class testLoadFromAB : MonoBehaviour { IEnumerat ...

  9. iOS网络编程(三) 异步加载及缓存图片---->SDWebImage

    @SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https:// ...

随机推荐

  1. 安装centos8

    一.     镜像下载 国内源下载镜像:(推荐) http://mirrors.aliyun.com/centos/8.0.1905/isos/x86_64/CentOS-8-x86_64-1905- ...

  2. mysql 时间与字符串相互转换

    时间.字符串.时间戳之间的相互转换:date转字符串.date转时间戳.字符串转date.字符串转时间戳.时间戳转date,时间戳转字符串用法 涉及的函数 date_format(date, form ...

  3. Java 爬虫遇到需要登录的网站,该怎么办?

    这是 Java 网络爬虫系列博文的第二篇,在上一篇 Java 网络爬虫,就是这么的简单 中,我们简单的学习了一下如何利用 Java 进行网络爬虫.在这一篇中我们将简单的聊一聊在网络爬虫时,遇到需要登录 ...

  4. web前端之面试:自我介绍

    面试官您好, 首先很感谢贵公司的面试邀请, 让我有这个幸运机会能来到这里和您交流 : 接下来我做一个简单的自我介绍: 我的姓名是 XX, 祖籍是XX, 年龄是24, 学校是 XXX, 专业是XXX: ...

  5. 【Java】支付宝获取人脸采集认证的图片base64格式

    人脸识别结果查询接口zoloz.identification.user.web.query返回的imgStr图片字符串并不是标准的base64格式,解析不出图片. 由于标准的Base64并不适合直接放 ...

  6. IoC 之加载 Bean:总结

    上文中我们将bean已经加载到了IOC容器中,接下来我们将把IOC加载Bean出来进行代码解析 备注:(有些解释是参考别个博客的相关解释 )一起探讨请加我QQ:1051980588 bean 的初始化 ...

  7. Window下的VScode快捷键

    转载自4ark 全局 Ctrl + Shift + P, F1 显示命令面板 Ctrl + P 快速打开Ctrl + Shift + N 打开新窗口Ctrl + Shift + W 关闭窗口 基本 C ...

  8. B-概率论-熵和信息增益

    目录 熵和信息增益 一.熵(Entropy) 二.条件熵(Conditional Entropy) 三.联合熵(Joint Entropy) 四.相对熵(Relative Entropy) 4.1 相 ...

  9. cocos2dx 3.2 内存管理

    一.引用计数(cocos2d-x3.2的Node类中用到) 概念:记录当前对象被引用的次数.当次数为0时释放. 1 . retain  与 release 每调用一次retain()使计数+1 每调用 ...

  10. Java名词术语---持续更新

    在看技术文档的过程中,经常会出现新的java缩写术语,很多时候都不知道它们是什么,在这里记下,持续更新. ——————————————————————————————————————————————— ...