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学习
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