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 = 0;     /// <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[0]);
            }
            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[0]);
                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[0]);
                        }
                        else
                        {
                            m_ResGameObj = Resources.Load(V_AssetPath);
                        }
                    }
                }
                catch
                {

                }
            }
        }
时间: 2024-10-03 23:06:57

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

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadOutApp尽量在使用单个executor的资源. 源码分析 org.apache.spark.deploy.master.Master 1.首先判断,master状态不是ALIVE的话,直接返回2.调度driver3. Application的调度机制(核心之核心,重中之重) 源码如下: 1 /*

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

白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :-). 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准.想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销.异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分.本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

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

转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时

全面剖析Smarty缓存机制一[三种缓存方式]

今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的几种方式,下篇文章着重讲解下设置缓存及清除缓存的技巧方法(其中包含缓存集合方法). 一.Smarty缓存的几种方式缓存机制中,分为全局缓存.部分缓存.局部缓存三种方式,后面会一一讲述,下面是缓存设置前,Smarty类方法基本目录设置如下:$smarty->Smarty();$smarty->tem

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

转载至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Sessi

springmvc&lt;一&gt;一种资源返回多种形式【ContentNegotiatingViewResolver】

restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三种形式     一.使用扩展名 http://localhost:8080/test/user.xml   以xml格式呈现 http://localhost:8080/test/user.json  以json格式呈现 http://localhost:8080/test/user     以默认

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

转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页

【原】ios打包ipa的两种实用方法(.app转.ipa)

总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选一,一般选后两个. 局限性:个人开发一般采用这种方法,但是当一个证书多人使用时就稍显麻烦.一般多人开发时都是采用provisioning profile+P12文件来进行真机调试.上述方法在最后导出ipa包时需要输入appleID,这时还要向团队的其他人要.采用provisioning profile+P12