Unity资源目录

当用Unity创建一个工程的时候,目录如下:

Assets:存放Unity工程实际的资源目录。
Library:存放Unity处理完毕的资源,由unity自动转化生成。
Log:存放日志文件。
Packages:统一管理各种packages组件,使用PackageManager进行管理。
ProjectSettings:存放Unity的各种项目设定。

当进行项目迁移时,只需要将Assets、Packages以及ProjectSettings三个目录拷贝即可。

Unity提供了Resource加载和AssetBundle加载两种方式

引用这篇文章的内容 Unity资源管理(二)-Resources文件夹

强烈不建议使用Resources系统,原因如下:
使用Resources文件夹将会使细粒度的内存管理变得更难
对Resources文件夹的不恰当使用会导致应用程序构架和启动时间变长
随着Resources文件夹数量的增加,在这些文件夹中管理Asset将会变得越来越难
使用Resources系统会降低项目向不同平台提供定制内容的能立,并且导致项目无法进行增量内容更新

AssetBundle学习

AssetBundle 官方API文档

AssetBundles的压缩方式:LZMA、LZ4、不压缩

1. 加载AssetBundles

AssetBundle.LoadFromMemory(Async optional) // 不推荐,此API会消耗两倍于AB大小的内存
AssetBundle.LoadFromFile(Async optional) // 推荐使用
UnityWebRequest.GetAssetBundle // 在Unity 5.2及更早版本中使用 WWW.LoadFromCacheOrDownload

2. 从AssetBundles中加载Assets

LoadAsset(LoadAssetAsync) // 加载单个或者少量时使用
LoadAllAssets(LoadAllAssetsAsync) // 加载多数或者所有Assets时使用
LoadAssetWithSubAssets(LoadAssetWithSubAssetsAsync)

3. 构建AssetBundls管线

BuildPipeline.BuildAssetBundles

4. 卸载不使用的AssetBundls

AssetBundle.unload(true) // false会有引用丢失的风险

tips:开发一个良好的分离下载系统是至关重要的


自动打包至指定文件夹

  • 自动添加label
using UnityEngine;
using UnityEditor;
using System.IO;namespace ABFW
{public class AutoSetLabels{[MenuItem("AssetBundleTools/Set AB Label")]public static void SetABLable(){// 清空标记AssetDatabase.RemoveUnusedAssetBundleNames();// AB根目录 调用文件ABPath.cs统一获取路径string strNeedSetlabelRoot = ABPath.GetABResourcesPath();// 通过根路径获取目录DirectoryInfo dirTempInfo = new DirectoryInfo(strNeedSetlabelRoot);DirectoryInfo[] dirSceneDirArray = dirTempInfo.GetDirectories();// 遍历所有路径foreach (DirectoryInfo currentDIR in dirSceneDirArray){Debug.Log("输出目录所有" + currentDIR);string tmpScenesDIR = strNeedSetlabelRoot + "/" + currentDIR.Name;int tmpIndex = tmpScenesDIR.LastIndexOf("/");string tmpScenesName = tmpScenesDIR.Substring(tmpIndex + 1);JudgeDIRorFileByRecursive(currentDIR, tmpScenesName);}// 刷新列表AssetDatabase.Refresh();Debug.Log("-----------------AB初始化完成--------------------");}/// <summary>/// 递归判断是否为目录/文件,修改AssetBundle/// </summary>/// <param name="fileSysInfo">目录信息</param>/// <param name="scenesName">场景名称</param>private static void JudgeDIRorFileByRecursive(FileSystemInfo fileSysInfo, string scenesName){if (!fileSysInfo.Exists){Debug.Log("文件或者目录名称:" + fileSysInfo + "不存在,请检查");return;}DirectoryInfo dirInfoObj = fileSysInfo as DirectoryInfo;FileSystemInfo[] fileSysArray = dirInfoObj.GetFileSystemInfos();// 遍历文件 设置标签foreach (FileSystemInfo fileInfo in fileSysArray){FileInfo fileInfoObj = fileInfo as FileInfo;if (fileInfoObj != null){// 文件类型 设置lableSetFilesABLabel(fileInfoObj, scenesName);}else{// 目录文件 递归JudgeDIRorFileByRecursive(fileInfo, scenesName);}}}/// <summary>/// 设置AB标签/// </summary>/// <param name="fileInfoObj">文件信息</param>/// <param name="scenesName">场景名称</param>private static void SetFilesABLabel(FileInfo fileInfoObj, string scenesName){if (fileInfoObj.Extension == ".meta") return;// AB名string strABName = GetABName(fileInfoObj, scenesName);// 获取文件的相对路径,从Assets/开始int tmpIndex = fileInfoObj.FullName.IndexOf("Assets");string strAssetFilepath = fileInfoObj.FullName.Substring(tmpIndex);AssetImporter tmpImporterObj = AssetImporter.GetAtPath(strAssetFilepath);// 设置AB名tmpImporterObj.assetBundleName = strABName;// 根据拓展名设置AB后缀if (fileInfoObj.Extension == ".unity"){tmpImporterObj.assetBundleVariant = "u3d";} else{tmpImporterObj.assetBundleVariant = "ab";}}/// <summary>/// 获取AB包的名称/// </summary>/// <param name="fileInfoObj"></param>/// <param name="scenesName"></param>/// <returns></returns>private static string GetABName(FileInfo fileInfoObj, string scenesName){string tmpWinPath = fileInfoObj.FullName;string tmpUnityPath = tmpWinPath.Replace("\\", "/");// 场景名称后面的字符数int tmpSceneNameposition = tmpUnityPath.IndexOf(scenesName) + scenesName.Length;// 拓展名区域string strABFileNameArea = tmpUnityPath.Substring(tmpSceneNameposition + 1);string strABName;if (strABFileNameArea.Contains("/")){string[] tmpStrArray = strABFileNameArea.Split('/');strABName = scenesName + "/" + tmpStrArray[0];}else{strABName = scenesName + "/" + scenesName;}return strABName;}}
}
  • 根据label进行打包
using System.IO;
using UnityEditor;
using UnityEngine;namespace ABFW
{public class BuildAssetsBundle{[MenuItem("AssetBundleTools/Build All AB")]public static void BuildAllAB(){// 创建目录string strABOutPathDIR = ABPath.GetABOutPath();if (!Directory.Exists(strABOutPathDIR)){Directory.CreateDirectory(strABOutPathDIR);}// 调用内置API打包BuildPipeline.BuildAssetBundles(strABOutPathDIR, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);}}}
  • 删除所有的AB包
using System.IO;
using UnityEditor;
using UnityEngine;namespace ABFW
{public class DeleteAssetsBundle : MonoBehaviour{[MenuItem("AssetBundleTools/Delete All AB")]public static void DeleteAllBundle(){string strNeedDeleteDIR = ABPath.GetABOutPath();if (!string.IsNullOrEmpty(strNeedDeleteDIR)){Directory.Delete(strNeedDeleteDIR, true);File.Delete(strNeedDeleteDIR + ".meta ");AssetDatabase.Refresh();} else{Debug.LogError("无可删除的AB文件");}}}
}

生成MD5校验文件

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using ABFW;namespace HotUpdateModel
{public class CreateVerifyFiles{[MenuItem("AssetBundleTools/Create Verify Files")]public static void CreateFileMethod(){string abOutPath = ABPath.GetABOutPath();string verifyOutPath = abOutPath + "/ProjectVerifyFile.txt";List<string> fileList = new List<string>();if (File.Exists(verifyOutPath)){File.Delete(verifyOutPath);}ListFiles(new DirectoryInfo(abOutPath), ref fileList);WriteVerifyFile(verifyOutPath, fileList);}private static void ListFiles(FileSystemInfo fileSystemInfo, ref List<string> fileList){DirectoryInfo dirInfo = fileSystemInfo as DirectoryInfo;FileSystemInfo[] fileSysInfo = dirInfo.GetFileSystemInfos();foreach (FileSystemInfo item in fileSysInfo){FileInfo fileInfo = item as FileInfo;if (fileInfo != null){// 文件类型string strFileFullName = fileInfo.FullName.Replace("\\", "/");string fileExt = Path.GetExtension(strFileFullName);if (fileExt.EndsWith(".meta") || fileExt.EndsWith(".bak")){continue;}fileList.Add(strFileFullName);}else{// 目录类型,继续递归ListFiles(item, ref fileList);}}}/// <summary>/// 把文件名称+对应的MD5写入文件/// </summary>/// <param name="verifyFileOutPath">验证文件的路径</param>/// <param name="fileLists">所有合法文件的相对路径集合</param>private static void WriteVerifyFile(string verifyFileOutPath, List<string> fileLists){Debug.Log("verifyFileOutPath" + verifyFileOutPath);using (FileStream fs = new FileStream(verifyFileOutPath, FileMode.CreateNew)){using (StreamWriter sw = new StreamWriter(fs)){for (int i = 0; i < fileLists.Count; i++){string strFile = fileLists[i];string strFileMD5 = Helps.GetMD5Value(strFile);string strTrueFileName = strFile.Replace(ABPath.GetABOutPath() + "/", string.Empty);sw.WriteLine(strTrueFileName + "|" + strFileMD5);}}}AssetDatabase.Refresh();}}
}

拷贝Lua脚本至指定文件夹

using UnityEngine;
using UnityEditor;
using System.IO;
using ABFW;public class CopyLuaFileToStreamAssets
{private static string _LuaIRPath = Application.dataPath + "/" + ABPath.LUA_RESOURCE_PATH;private static string _CopyTargetIR = ABPath.GetABOutPath() + "/" + ABPath.LUA_DEPLOY_PATH;[MenuItem("AssetBundleTools/Copy LuaFile To StreamAssets")]public static void CopyLuaTo(){DirectoryInfo dirInfo = new DirectoryInfo(_LuaIRPath);FileInfo[] files = dirInfo.GetFiles();if (!Directory.Exists(_CopyTargetIR)){Directory.CreateDirectory(_CopyTargetIR);}// 逐个拷贝foreach (FileInfo infoObj in files){File.Copy(infoObj.FullName, _CopyTargetIR + "/" + infoObj.Name, true);}Debug.Log("---------拷贝完成,Lua文件已拷贝至发布区--------");AssetDatabase.Refresh();}
}

贴一个工具 游戏/VR应用性能诊断与优化 UWA框架

Unity资源管理--AssetBundle学习相关推荐

  1. Unity资源管理——AssetBundle构建/打包

    1.为资源设置 assetBundleName 和 assetBundleVariant. 可以在资源的 Inspector 上手动设置,也可以通过 AssetImporter 进行设置. Asset ...

  2. Unity AssetBundle学习笔记

    文章目录 前言 一.AssetBundle是什么? 1.定义 2.为什么需要AssetBundle 3.AssetBundle内部格式 二.AssetBundle打包 1.设置资源AB名称 2.资源打 ...

  3. Unity资源管理(四)-AssetBundle使用模式

    Unity资源管理(四)-AssetBundle使用模式 英文原文:https://unity3d.com/cn/learn/tutorials/topics/best-practices/asset ...

  4. Unity中的资源管理-AssetBundle(1)

    本文分享Unity中的资源管理-AssetBundle(1) 在上一篇文章中, 我们简单介绍了Unity中的资源和基本的使用, 今天我们详细介绍下使用AssetBundle来管理资源. AssetBu ...

  5. 实力封装:Unity打包AssetBundle(大结局)

    →→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...

  6. unity DOTS的学习总结之Job System应用——绘制曼德勃罗集合

    接上回:DOTS的学习总结之Job System的介绍,这次就利用之前了解知识来做点效果. 上回在这:unity DOTS的学习总结之Job System 说到并行处理,那最适合拿来做实验的就是一些分 ...

  7. Unity超基础学习笔记(二)

    Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...

  8. unity地形模块学习

    unity地形模块学习: 问题一: 看不见自己抬高或拉低的操作结果 问题二: 制作地形过程中停止光照烘焙消耗内存 问题三: 加了direction light之后地形还是没有变亮 问题四: Unity ...

  9. Unity C# 网络学习(十二)——Protobuf生成协议

    Unity C# 网络学习(十二)--Protobuf生成协议 一.安装 去Protobuf官网下载对应操作系统的protoc,用于将.proto文件生成对应语言的协议语言文件 由于我使用的是C#所以 ...

最新文章

  1. 8.2 matlab曲线对象和曲面对象(曲线对象、曲面对象、光照处理、图形对象的反射特性)
  2. 使用多线程拷贝文件夹
  3. 大数据技术架构_架构大数据图
  4. 下载国外网站资料需java_Java开发必知道的国外10大网站
  5. Java新职篇:for循环
  6. cmmi3认证需要企业具备什么条件?
  7. 2022 CVPR 三维人体重建相关论文汇总(3D Human Reconstruction)
  8. 最新伯乐PHP个人在线自动发卡网源码V3.1版
  9. astar插件下载 就行_2020年视频编辑PR插件齐全了!包含了抠图调色磨皮降噪~
  10. 带你Dart带你Diao之类
  11. 机器学习笔记-阻尼牛顿法
  12. SCCM推送升级Win10
  13. 2012-8-18可樂美文分享《遗留在时…
  14. 视频制作和php,【艾奇电子相册视频制作软件和PHP 4.4.0 For Windows哪个好用】艾奇电子相册视频制作软件和PHP 4.4.0 For Windows对比-ZOL下载...
  15. 推荐 4 款超好用的内网穿透工具,总有一款适合你
  16. 如何增加微信朋友圈分享链接的小图片
  17. android中级开发师必备_【招聘】Android开发工程师 – 中级 – 陌陌
  18. python 爬取财经新闻_如何用 100 行 Python 代码实现新闻爬虫?
  19. undefined control sequence_control两个超级实用的短语解析
  20. linux weblogic 内存溢出,weblogic10内存溢出解决方法

热门文章

  1. java上机作业要注意什么_Java第八次上机作业
  2. python安卓开发实例_python服务器与android客户端socket通信实例
  3. 项目入口_新进展!石家庄地铁项目长安公园站出入口全部封顶
  4. JAVA回调函数的例子_javascript : 回调函数例子
  5. 关于mysql优化_关于MySQL优化的几点总结
  6. idb 怎么回复mysql_MysqliDb 库的一些使用简单技巧(php)
  7. django2与ajax,Python-Django-Ajax进阶2
  8. 群晖服务器性能测试,对群晖DS716+进行性能测试_群晖 DS716+_企业存储技术与评测-中关村在线...
  9. C语言逻辑运算符详解
  10. emmet插件使用(Css)