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即可,无需加载依赖了。
具体代码如下:(启动游戏先加载公共依赖,一样的加载方式)

  1. //原始资源引用
  2. UnityEngine.Object m_ResGameObj = null;
  3. //3个异步加载句柄:
  4. //资源包加载句柄,引用www加载ab时结果
  5. WWW m_LoadHandle = null;
  6. //资源包加载请求,引用loadfromfileasync和loadfrommemoryasync的结果
  7. AssetBundleCreateRequest m_Request = null;
  8. //资源加载请求,引用loadassetasync结果
  9. AssetBundleRequest m_AssetRequest = null;
  10. //资源包,引用各种加载出来的资源包
  11. AssetBundle m_AssetBundle = null;
  12. //资源相对路径且没有后缀,作为基础路径,方便后续的各种拼接
  13. public string V_AssetPath = null;//是否采用异步
  14. public bool V_UseAsync = true;
  15. //加载优先级
  16. public int V_Priority = ;
         /// <summary>
  17. /// 加载图片只能用www方式
  18. /// </summary>
  19. /// <param name="path">绝对路径</param>
  20. /// <returns></returns>
  21. IEnumerator LoadBundleImpImage(string path)
  22. {
  23. m_LoadHandle = new WWW(PathHelper.GetInstance().F_AddFilePro(path));
  24. yield return m_LoadHandle;
  25. if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.assetBundle != null)
  26. {
  27. m_AssetBundle = m_LoadHandle.assetBundle;
  28. string[] assets = m_AssetBundle.GetAllAssetNames();
  29. m_ResGameObj = m_AssetBundle.LoadAsset(assets[]);
  30. }
  31. else if (m_LoadHandle != null && string.IsNullOrEmpty(m_LoadHandle.error) && m_LoadHandle.texture != null)
  32. {
  33. m_ResGameObj = m_LoadHandle.texture;
  34. }
  35. if (m_LoadHandle != null) m_LoadHandle.Dispose();
  36. m_LoadHandle = null;
  37. }
  38.  
  39. /// <summary>
  40. /// 加载资源imp
  41. /// </summary>
  42. /// <returns></returns>
  43. IEnumerator LoadResImp()
  44. {
  45. ResourceRequest request = Resources.LoadAsync(V_AssetPath);
  46. yield return request;
  47. if (request != null && request.asset != null)
  48. {
  49. m_ResGameObj = request.asset;
  50. }
  51. m_AssetBundle = null;
  52. }
  53.  
  54.      /// <summary>
  55. /// 加载bundle
  56. /// </summary>
  57. /// <param name="path">绝对路径</param>
  58. /// <returns></returns>
  59. IEnumerator LoadBundleImp(string path)
  60. {
  61. m_Request = AssetBundle.LoadFromFileAsync(path);
  62. yield return m_Request;
  63. if (m_Request != null && m_Request.assetBundle != null)
  64. {
  65. m_AssetBundle = m_Request.assetBundle;
  66. string[] assets = m_AssetBundle.GetAllAssetNames();
  67. m_AssetRequest = m_AssetBundle.LoadAssetAsync(assets[]);
  68. yield return m_AssetRequest;
  69. m_ResGameObj = m_AssetRequest.asset;
  70. F_SendFinishEvent();
  71. m_Request = null;
  72. m_AssetRequest = null;
  73. }
  74. }
  75.      //加载入口
  76.      public void StartLoadAsset()
  77. {
  78. string absolutePath = GetPersistentAssetPath();
  79. if (V_UseAsync)
  80. {
  81. string abPath = string.Empty;
  82. if (PathHelper.GetInstance().F_CheckFileExists(absolutePath))
  83. {
  84. abPath = absolutePath;
  85. }
  86. if (abPath.EndsWith(PathHelper.ABFile))
  87. {
  88. AssetManager.GetInstance().StartCoroutine(LoadBundleImp(abPath));
  89. }
  90. else if (abPath.EndsWith(".jpg") || abPath.EndsWith(".png"))
  91. {
  92. AssetManager.GetInstance().StartCoroutine(LoadBundleImpImage(abPath));
  93. }
  94. else//加载安装包里的文件,或者编辑器下加载资源使用
  95. {
  96. AssetManager.GetInstance().StartCoroutine(LoadResImp());
  97. }
  98. }
  99. else
  100. {
  101. //同步加载
  102. try
  103. {
  104. if (m_ResGameObj == null)
  105. {
  106. m_AssetBundle = null;
  107. if (AssetManager.GetInstance().F_IsLoadByAb() &&
  108. absolutePath.EndsWith(PathHelper.ABFile))
  109. {
  110. m_AssetBundle = AssetBundle.LoadFromFile(absolutePath);
  111. }
  112. if (m_AssetBundle != null)
  113. {
  114. string[] assets = m_AssetBundle.GetAllAssetNames();
  115. m_ResGameObj = m_AssetBundle.LoadAsset(assets[]);
  116. }
  117. else
  118. {
  119. m_ResGameObj = Resources.Load(V_AssetPath);
  120. }
  121. }
  122. }
  123. catch
  124. {
  125.  
  126. }
  127. }
  128. }

unity5打包机制下,一种资源打ab和资源管理的方案的更多相关文章

  1. webpack 打包优化的四种方法(多进程打包,多进程压缩,资源 CDN,动态 polyfill)

    如今,webpack 毫无疑问是前端构建领域里最耀眼的一颗星,无论你前端走哪条路线,都需要有很强的webpack 知识.webpack 的基本用法这里就不展开讲了.主要探讨一下如何提高 webpack ...

  2. webpack配置:打包第三方类库、第三方类库抽离、watch自动打包、集中拷贝静态资源

    一.打包第三方类库 下面说2种方法: 第一种: 1.引入jQuery,首先安装: npm install --save-dev jquery 2.安装好后,在index.js中引入,用jquery语法 ...

  3. C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

    白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...

  4. Synchronized机制下偏向锁、轻量级锁、重量级锁的适用场景

    上次总结了Synchronized机制下的锁的种类和原理,这次总结一下几种锁的适用场景. 偏向锁 一个线程获取某个对象的偏向锁的成本是很低的,只需把对象头的偏向线程id改为自己就好,如果偏向线程id已 ...

  5. springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】

    restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...

  6. 集群/分布式环境下5种session处理策略

    转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...

  7. 【架构师之路】集群/分布式环境下5种session处理策略

    [架构师之路]集群/分布式环境下5种session处理策略   转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...

  8. 【转】分布式环境下5种session处理策略(大型网站技术架构:核心原理与案例分析 里面的方案)

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...

  9. 【转】集群/分布式环境下5种session处理策略

    转载至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处 ...

随机推荐

  1. Taurus.MVC 2.3.4 :WebAPI 文档集成测试功能升级:WebAPI批量自动化测试功能。

    前言: 最近升级了一下Taurus.MVC,现在最新版本是:Taurus.MVC 2.3.4,源码版本和nuget同步. 下面分三个步骤介绍下新版本的WebAPI批量自动化测试功能. 1.启用WebA ...

  2. xml schema杂谈

    有一些场景,我们需要写xml,又需要对内容进行约束,比如智能输入某个值范围,只能写入固定值 这个时候我们就需要xml schema 这个,百度解释为 XML Schema 的作用是定义 XML 文档的 ...

  3. tensorboard报错:AttributeError: ‘Value’ object has no attribute ‘metadata’

    tensorboard的网页可以访问,但是只能观察到graph数据,但是观察不到scalars数据. 原因:tensorflow版本需>=1.3.0 解决方法:升级tensorflow

  4. 搭建MyBatis开发环境及基本的CURD

    目录 一.MyBatis概述 1. MyBatis 解决的主要问题 二.快速开始一个 MyBatis 1. 创建mysql数据库和表 2. 创建maven工程 3. 在pom.xml文件中添加信息 4 ...

  5. C++socket编程write()、read()简介及与send()、recv()的区别

    1. write 函数原型:ssize_t write(int fd, const void*buf,size_t nbytes)write函数将buf中的nbytes字节内容写入文件描述符fd.成功 ...

  6. docker基础入门理解

    本文简单的介绍了一下docker的一些优点,以及使用方法 1. 理解docker 1.1 docker是什么? 1.2 为什么要使用Docker? 2. docker安装 3. docker-容器,镜 ...

  7. google protocol buffer——protobuf的基本使用和模型分析

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 1.什么是protobuf ...

  8. Python 读取word中表格数据、读取word修改并保存、替换word中词汇、读取word中每段内容,读取一段话中相同样式内容,理解Document中run

    from docx import Document path = r'D:\pywork\12' # word信息表所在文件夹 w = Document(path + '/' + 'word信息表.d ...

  9. vue a标签下载图片文档显示下载失败

    解决:把所要下载的文件放到static文件下,具体原因-静态文件放在static内,否则webpack会打包.

  10. 【转】Ubuntu下解决Depends: xxx(< 1.2.1) but xxx is to be installed

    在ubuntu下由于更新package不成功,或者误删除了一些文件会出现Depends: xxx(< 1.2.1) but xxx is to be installed解决方法是先试着安装所缺的 ...