当前位置: 首页 > news >正文

Unity3D资源管理——Unity2017 Assetbundle依赖打包

Unity3D资源管理——Unity2017 Assetbundle依赖打包

http://gad.qq.com/article/detail/289272

一、运行环境

 

1.1编辑器版本

 

使用Unity2017.3.1f

 

1.2 dll

 

 

二、目的

 

预制体打包时会将一份资源进行多份打包,导致数据冗余,所以需要根据依赖,将被多处引用的资源独立达成一个包,建立依赖关心,优化冗余。

 

三、流程

 

1. 遍历所有资源文件,设置其包名为空

 

2. 遍历需要打包的文件夹下的所有文件,通过Unity资源接口获取所有依赖,统计对应的依赖数

 

3. 将在需要打包文件夹内的包名设置为文件名,将在需要打包文件夹外的依赖数大于2的文件设置包名为文件名

 

4. 调用Unity的打包接口,会将该工程下的所有被设置包名的资源进行AB打包。

 

四、代码实现

 

核心代码:

 

 

 
public class ABUtils
 
 
    /// <summary>
 
    /// 资源放置的文件夹路径
 
    /// </summary>
 
    private static List<string> resDircectoryPaths = new List<string>(){ "Assets/Resources" };
 
    private static List<string> needDependenyPaths = new List<string>() { "Assets/Resources/Materials" };
 
    /// <summary>
 
    /// 初始化打包环境,将所有的文件的ab属性都置空
 
    /// </summary>
 
    static List<string> InitBuildEnvironment()
 
 
        List<string> paths=new List<string>();
 
        string[] files = AssetDatabase.GetAllAssetPaths();
 
        for (int i = 0; i < files.Length; i++)
 
 
            for (int j = 0; j < resDircectoryPaths.Count; j++)
 
 
                if (files[i].Contains(resDircectoryPaths[j]))
 
 
                    AssetImporter importer = AssetImporter.GetAtPath(files[i]);
 
                    paths.Add(files[i]);
 
                    importer.assetBundleName = String.Empty;
 
 
 
 
        return paths;
 
 
    public static void BuildAllAbAboutDependency(string outPath)
 
 
        ResourceSystem.FileUtils.PrecessDirectoryExist(outPath);
 
        List<string> resPaths=InitBuildEnvironment();
 
        string fileName;
 
        string relationPath;
 
        ResourcesData data;
 
        bool isNeedDependcy;
 
        for (int i = 0; i < resPaths.Count; i++)
 
 
            isNeedDependcy = false;
 
            fileName = PathUtils.GetFileNameWithoutExtension(resPaths[i]);
 
            if (ResourceSystemFacade.Inst.ResDict.ContainsKey(fileName))
 
 
                data = ResourceSystemFacade.Inst.ResDict[fileName];
 
                relationPath = PathUtils.GetRelativePath("Assets", resPaths[i]);
 
                for (int j = 0; j < needDependenyPaths.Count; j++)
 
 
                    if (relationPath.Contains(needDependenyPaths[j]))
 
 
                        isNeedDependcy = true;
 
                        if (data.DependeciedNum > 1)
 
 
                            AssetImporter importer = AssetImporter.GetAtPath(relationPath);
 
                            importer.assetBundleName = data.Name;
 
                            importer.assetBundleVariant = ResourceSystemFacade.FileExtension;
 
 
 
 
                if (!isNeedDependcy)
 
 
                    AssetImporter importer = AssetImporter.GetAtPath(relationPath);
 
                    importer.assetBundleName = data.Name;
 
                    importer.assetBundleVariant = ResourceSystemFacade.FileExtension;
 
 
 
            else
 
 
                DebugUtils.DebugError("未包含文件" + fileName);
 
 
 
        DebugUtils.DebugRedInfo(outPath);
 
        BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneWindows64);
 
 
}<span style="white-space: normal;"> </span>

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • AssetBundle粒度与分配策略剖析
  • Unity Prerfab 环形依赖
  • Unity3D研究院之查找资源被哪里引用了
  • Unity VS 暂挂程序
  • xlua扩展第三方库记录
  • XLua-操作与使用
  • 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
  • Unity 无缘无故提示缺少类型解决方法
  • Eclipse 最底下有垃圾回收按钮
  • activity堆栈式管理
  • XLUA学习笔记之C#和Lua之间的相互调用
  • Lua 元表(Metatable)
  • XLua Lua访问C#中的方法(四)访问枚举
  • Unity中Shader和AssetBundle结合使用的注意事项
  • 解决打包AssetBundle时Shader(材质)丢失问题
  • Angular 4.x 动态创建组件
  • java2019面试题北京
  • js写一个简单的选项卡
  • leetcode46 Permutation 排列组合
  • Python_网络编程
  • 缓存与缓冲
  • 开源SQL-on-Hadoop系统一览
  • 转载:[译] 内容加速黑科技趣谈
  • HanLP分词命名实体提取详解
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (145)光线追踪距离场柔和阴影
  • (2)STM32单片机上位机
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (day 12)JavaScript学习笔记(数组3)
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (离散数学)逻辑连接词
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一) storm的集群安装与配置
  • (一)基于IDEA的JAVA基础10
  • (转)http-server应用
  • (转)Linux下编译安装log4cxx
  • (转)编辑寄语:因为爱心,所以美丽
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • @基于大模型的旅游路线推荐方案
  • @取消转义
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [bzoj1912]异象石(set)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C/C++] -- 二叉树
  • [C++] Windows中字符串函数的种类