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和资源管理的方案的更多相关文章

  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. FAT32文件系统下的文件、目录管理

    背景 FAT32作为一个文件系统,有着广泛的应用.在安装操作系统时,许多个人用户默认都选择FAT32文件系统,因此,了解FAT32文件系统下的文件.目录的管理方式就显得非常必要了. FAT32文件系统 ...

  2. Chrome划词翻译-Saladict

    Saladict 沙拉查词是一款专业划词翻译扩展,为交叉阅读而生.大量权威词典涵盖中英日韩法德西语,支持复杂的 划词操作.网页翻译.生词本.PDF,以及 Vimium 全键盘操作 . 迄今为止最好用的 ...

  3. 解惑4:java是值传递还是引用传递

    一.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:"传参数就是值传递,传对象就是引用传递",后面进一步查找了相关资料和文章以后, ...

  4. python操作Excel,你觉得哪个库更好呢?

    对比学习python,更高效~ Excel数据的类型及组织方式 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  5. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事

    一.前言 作者:Jack Cui 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...

  6. JS 鼠标、键盘事件对象

    鼠标事件对象     mouseEvent鼠标事件对象     e.clientX 在可视区的x和y的坐标     e.pageX 在页面文档的X和Y的坐标 <script> docume ...

  7. OS实现流程草稿

    实现一个OS需要现在网上搜索 不要在Windows环境下写 nasm等汇编编译器的语法 bois中断函数使用 内存分布 描述符 实模式与保护模式 从实模式到保护模式比较难,可以从网上找一些代码能运行自 ...

  8. java 启动Tomcat报错:The specified JRE installation does not exist

    启动TomCat服务报错: The specified JRE installation does not exist 解决方法: Eclipse:window->perferences-> ...

  9. Win10系统Jmeter+maven+Jenkins接口自动化环境搭建(一)

    Jmeter+maven+Jenkins实现接口自动化,需要使用idea或eclipse配置maven项目,这里我使用的是idea.具体步骤如下: 1.安装jmeter+jdk jmeter安装之前需 ...

  10. Flutter 打包程序 build android apk

    Step-1 Java 路径 找到java路径, 可使用[flutter doctor -v] Step-2: 进入目录 找到路径后 C:\Program Files\Java\jre1.8.0_23 ...