unity5打包机制下,一种资源打ab和资源管理的方案
unity5打包机制下,一种资源打ab和资源管理的方案。
1.打ab:
1.设置平台
2.清楚所有资源的assetbundlename:
string[] abNameArr = AssetDatabase.GetAllAssetBundleNames();
AssetDatabase.RemoveAssetBundleName(abNameArr[i],true);
3.创建ab目录
4.根据配置把需要打包的资源找出来,对每一个setAbName
5.调用BuildPipeline.BuildAssetBundles(ab文件夹路径,BuildAssetBundleOptions.DeterministicAssetBundle,EditorUserBuildSettins.activeBuildTarget);
6.完成,但这里要对第4点做一些说明,因为依赖资源:
我们可以选择一种简单粗暴的方式处理依赖资源:搞几个公共依赖assetbundle,把一些公共资源打到这几个公共ab中,具体就是:
在第4步,我们设置一个资源的abName后,对其依赖进行:
string[] deps = AssetDatabase.GetDependencies(sourcePath);
if (deps[i] 需要打入公共依赖1)
AssetImporter aIt = AssetImporter.GetAtPath(deps[i]);
aIt.assetBundleName = 公共依赖1.assetBundle.
if (deps[i] 需要打入公共依赖2)
...
其他的依赖就不必继续分离了,即打到各个资源的ab里,虽然会增加ab的大小,但依赖资源管理会方便很多。
2.资源管理:
先加载各个公共依赖到内存,并且一直引用这不unload,其他正式资源加载时自己加载对应的ab即可,无需加载依赖了。
具体代码如下:(启动游戏先加载公共依赖,一样的加载方式)
- //原始资源引用
- UnityEngine.Object m_ResGameObj = null;
- //3个异步加载句柄:
- //资源包加载句柄,引用www加载ab时结果
- WWW m_LoadHandle = null;
- //资源包加载请求,引用loadfromfileasync和loadfrommemoryasync的结果
- AssetBundleCreateRequest m_Request = null;
- //资源加载请求,引用loadassetasync结果
- AssetBundleRequest m_AssetRequest = null;
- //资源包,引用各种加载出来的资源包
- AssetBundle m_AssetBundle = null;
- //资源相对路径且没有后缀,作为基础路径,方便后续的各种拼接
- public string V_AssetPath = null;//是否采用异步
- public bool V_UseAsync = true;
- //加载优先级
- public int V_Priority = ;
/// <summary>- /// 加载图片只能用www方式
- /// </summary>
- /// <param name="path">绝对路径</param>
- /// <returns></returns>
- IEnumerator LoadBundleImpImage(string path)
- {
- m_LoadHandle = new WWW(PathHelper.GetInstance().F_AddFilePro(path));
- yield return m_LoadHandle;
- if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.assetBundle != null)
- {
- m_AssetBundle = m_LoadHandle.assetBundle;
- string[] assets = m_AssetBundle.GetAllAssetNames();
- m_ResGameObj = m_AssetBundle.LoadAsset(assets[]);
- }
- else if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.texture != null)
- {
- m_ResGameObj = m_LoadHandle.texture;
- }
- if (m_LoadHandle != null) m_LoadHandle.Dispose();
- m_LoadHandle = null;
- }
- /// <summary>
- /// 加载资源imp
- /// </summary>
- /// <returns></returns>
- IEnumerator LoadResImp()
- {
- ResourceRequest request = Resources.LoadAsync(V_AssetPath);
- yield return request;
- if (request != null && request.asset != null)
- {
- m_ResGameObj = request.asset;
- }
- m_AssetBundle = null;
- }
- /// <summary>
- /// 加载bundle
- /// </summary>
- /// <param name="path">绝对路径</param>
- /// <returns></returns>
- IEnumerator LoadBundleImp(string path)
- {
- m_Request = AssetBundle.LoadFromFileAsync(path);
- yield return m_Request;
- if (m_Request != null && m_Request.assetBundle != null)
- {
- m_AssetBundle = m_Request.assetBundle;
- string[] assets = m_AssetBundle.GetAllAssetNames();
- m_AssetRequest = m_AssetBundle.LoadAssetAsync(assets[]);
- yield return m_AssetRequest;
- m_ResGameObj = m_AssetRequest.asset;
- F_SendFinishEvent();
- m_Request = null;
- m_AssetRequest = null;
- }
- }
- //加载入口
- public void StartLoadAsset()
- {
- string absolutePath = GetPersistentAssetPath();
- if (V_UseAsync)
- {
- string abPath = string.Empty;
- if (PathHelper.GetInstance().F_CheckFileExists(absolutePath))
- {
- abPath = absolutePath;
- }
- if (abPath.EndsWith(PathHelper.ABFile))
- {
- AssetManager.GetInstance().StartCoroutine(LoadBundleImp(abPath));
- }
- else if (abPath.EndsWith(".jpg") || abPath.EndsWith(".png"))
- {
- AssetManager.GetInstance().StartCoroutine(LoadBundleImpImage(abPath));
- }
- else//加载安装包里的文件,或者编辑器下加载资源使用
- {
- AssetManager.GetInstance().StartCoroutine(LoadResImp());
- }
- }
- else
- {
- //同步加载
- try
- {
- if (m_ResGameObj == null)
- {
- m_AssetBundle = null;
- if (AssetManager.GetInstance().F_IsLoadByAb() &&
- absolutePath.EndsWith(PathHelper.ABFile))
- {
- m_AssetBundle = AssetBundle.LoadFromFile(absolutePath);
- }
- if (m_AssetBundle != null)
- {
- string[] assets = m_AssetBundle.GetAllAssetNames();
- m_ResGameObj = m_AssetBundle.LoadAsset(assets[]);
- }
- else
- {
- m_ResGameObj = Resources.Load(V_AssetPath);
- }
- }
- }
- catch
- {
- }
- }
- }
unity5打包机制下,一种资源打ab和资源管理的方案的更多相关文章
- webpack 打包优化的四种方法(多进程打包,多进程压缩,资源 CDN,动态 polyfill)
如今,webpack 毫无疑问是前端构建领域里最耀眼的一颗星,无论你前端走哪条路线,都需要有很强的webpack 知识.webpack 的基本用法这里就不展开讲了.主要探讨一下如何提高 webpack ...
- webpack配置:打包第三方类库、第三方类库抽离、watch自动打包、集中拷贝静态资源
一.打包第三方类库 下面说2种方法: 第一种: 1.引入jQuery,首先安装: npm install --save-dev jquery 2.安装好后,在index.js中引入,用jquery语法 ...
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...
- Synchronized机制下偏向锁、轻量级锁、重量级锁的适用场景
上次总结了Synchronized机制下的锁的种类和原理,这次总结一下几种锁的适用场景. 偏向锁 一个线程获取某个对象的偏向锁的成本是很低的,只需把对象头的偏向线程id改为自己就好,如果偏向线程id已 ...
- springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...
- 集群/分布式环境下5种session处理策略
转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...
- 【架构师之路】集群/分布式环境下5种session处理策略
[架构师之路]集群/分布式环境下5种session处理策略 转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...
- 【转】分布式环境下5种session处理策略(大型网站技术架构:核心原理与案例分析 里面的方案)
前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...
- 【转】集群/分布式环境下5种session处理策略
转载至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处 ...
随机推荐
- python字符串和数字的基本运算符
python字符穿的4种表达方式 name='张三' name="张三" name='''张三''' name="""张三""&q ...
- C语言输出颜色
命令后界面输出颜色 嵌入式终端界面输出日志时,为了区分输出的有用信息.错误信息,可以给不同级别的输出加上不同的颜色,以方便查看. 下面是颜色的定义: //颜色宏定义 #define NONE &quo ...
- @RestController注解初步理解
一.在Spring中@RestController的作用等同于@Controller + @ResponseBody. 所以想要理解@RestController注解就要先了解@Controller和 ...
- Spring学习之——手写Spring源码V2.0(实现IOC、D、MVC、AOP)
前言 在上一篇<Spring学习之——手写Spring源码(V1.0)>中,我实现了一个Mini版本的Spring框架,在这几天,博主又看了不少关于Spring源码解析的视频,受益匪浅,也 ...
- 初识TypeScript:查找指定路径下的文件按类型生成json
如果开发过node.js的话应该对js(javascript)非常熟悉,TypeScript(以下简称ts)是js的超集. 下面是ts的官网: https://www.tslang.cn/ 1.环境配 ...
- Catalina 默认使用zsh了,你可习惯
zsh 成为默认 shell 淘汰掉我的旧MBP换新后,欢天喜地打开Terminal,感觉有点不对,提示符什么时候变成了 %. 查询了一些资料发现,原来在2019年WWDC期间,苹果推出了macOS ...
- JDK 1.8 中文 API CHM
链接: https://pan.baidu.com/s/1AiJn6RM1KoEL1n_96qoQhQ 提取码: n2ya
- NLP Github
作者:cstghitpku链接:https://zhuanlan.zhihu.com/p/51279338来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.分词 Wo ...
- 存储系列之 从ext2到ext3、ext4 的变化与区别
引言:ext3 和 ext4 对 ext2 进行了增强,但是其核心设计并没有发生变化.所以建议先查看上上篇的<存储系列之 Linux ext2 概述 >,有了ext2的基础,看这篇就是so ...
- day11面向对象 多态 静态方法 (三)
多继承 class 类名(父类1,父类2) ----- 默认使用第一个父类 重写父类方法 方法名和父类方法名一样 当父类和子类的方法名重名时,默认使用的是子类中的方法 调用被重写的父类的 ...