Unity重要目录
工程中的几个重要目录
Assets | 存放资源、代码、配置 |
---|---|
Library | 大部分的资源导入到Assets目录之后,会转化成Unity认可的文件,转化后的文件会存储在这个目录 |
Logs | 日志文件 |
Packages | 第三方插件 |
ProjectSettings | 存放各种项目设定 |
UserSettings | 用户偏好设置,如编辑器的布局方式 |
当你要迁移一个工程,或者将工程复制给别人的时候,只需要将Assets、Packages以及ProjectSettings三个目录备份即可
Addressable
Addressable 是基于 Asset Bundle 的可寻址资源管理系统
优点:
- 自动化管理AB包打包、发布、加载
- 可以更方便的进行本地、远程资源的加载
- 分析资源关联性
- 内存管理更方便
资源分组
通过 Package Manager 安装 Addressable,然后点击 Groups
初次使用需要创建 Addressables Settings,创建后会在 Assets 目录下创建一个 AddressableAssetsData 文件夹保存相关配置
这些配置都使用了ScriptableObject
Addressables Groups 界面用于资源规划,空白处右键可以创建不同的 Group
每创建一个新的Group默认会生成对应的配置文件,记录打包和加载的设置,打包的时候一个Group会打成一个或多个AB包
直接把资源拖入某个Group,它就变成一个可寻址资源
也可以在 Inspector 中勾选 Addressable
默认会使用路径作为 Addressable Name(或者称为Address),也就是资源的唯一标识符,也可以手动修改
注意:
- C#代码无法作为可寻址资源
- Resources文件夹下资源如果变为可寻址资源,会移入Resources_ moved文件夹中
原因: Resources文件夹下资源会最终打包出去,如果变为可寻址资源意味着想通过Addressables进行管理
那么它就没有必要通过Resources方式去加载和打包,所以会自动迁移,避免重复打包
右边的 Labels 对资源添加标签,比如低清版,高清版,关卡1,关卡2,之后就可以只加载某个标签的资源
点击资源右键选项
Move Addressables to Group | 将资源移动到指定的Group |
---|---|
Move Addressables to New Group | 使用与当前Group相同的设置创建一 个新的Group,将资源移动到这个Group |
Rmove Addressables | 移除资源,变为不可寻址 |
Simplify Addressable Names | 简化可寻址资源名,会删除名称中的路径和扩展名,简化缩短名称 |
Copy Address to Clipboard | 将地址复制到剪贴板 |
Change Address | 改名 |
Create New Group | 创建新的Group |
点击分组右键选项
Remove Group(s) | 移除组,组中所有资源恢复为不可寻址资源 |
---|---|
Simplify Addressable Names | 简化名称 |
Rmove Addressables | 移除资源,变为不可寻址 |
Set as Default | 设置为默认组,当直接勾选资源中的Addressable时,会自动加入该组 |
Inspect Group Setting | 快速选中关联的组相关配置文件 |
Rename | 重命名 |
Create New Group | 创建新组 |
Profile 配置概述相关
Manage Profiles: 管理配置文件
配置打包平台、本地和远程的打包,加载路径信息
Tools工具相关
Inspect System Settings | 检查系统设置 |
---|---|
Check for content Update Restrictions | 检查内容更新限制 |
Window | 打开Addressables相关窗口 |
Groups View | Show Sprite and Subobject Addressable: 显示可寻址对象的精灵和子对象,一般想要 看到图集资源内内容时可以勾选该选项 |
Group Hierarchy with Dashes: 带破折号的组层次结构 |
Play Mode Script 编辑模式下如何加载资源
Use Asset Database (fastest) | 使用AssetDatabase相关接口直接加载资源,不会打ab包,开发阶段用 |
---|---|
Simulate Groups (advanced) | 测试阶段使用,不会打ab包,代码中加入了时间延迟,模拟下载的情况 |
Use Existing Build | 发布阶段使用,需要打ab包,配置远端下载路径 |
Build (构建打包相关)
New Build | 构建资源(相当于打包资源分组) ,提供了一个默认的打包脚本 |
---|---|
Update a Previour Build | 更新以前的版本 |
Clean Build | 清空之前的构建资源 |
加载资源
通过资源标识类加载
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class Test : MonoBehaviour
{
//通用资源标识类可以用来加载任意类型资源
public AssetReference assetReference;
//只能加载图集资源
public AssetReferenceAtlasedSprite asReference;
//只能加载prefab资源
public AssetReferenceGameObject prefabReference;
//加载精灵图片或图集中的某个图片
public AssetReferenceSprite spriteReference;
//只能加载贴图资源
public AssetReferenceTexture textureReference;
//指定资源类型
public AssetReferenceT<AudioClip> audioReference;
public AssetReferenceT <RuntimeAnimatorController> controller;
public AssetReferenceT<TextAsset> textReference;
private void Start()
{
AsyncOperationHandle<GameObject> handle = assetReference.LoadAssetAsync<GameObject>();
handle.Completed += OnLoadCompleted;
}
private void OnLoadCompleted(AsyncOperationHandle<GameObject> handle)
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
//handle.Result就是加载的对象
GameObject go = Instantiate(handle.Result);
}
}
}
点击右侧的圆圈选择指定的资源,拖动非可寻址资源上去会添加到默认的Group中
通过AddressableName加载卸载
Addressable加载相关的API都是异步的,同步方法已被废弃
异步加载和卸载,资源可以在本地也可以在远端服务器
private AsyncOperationHandle<GameObject> _asyncOperationRes;
private AsyncOperationHandle<GameObject> _asyncOperationInst;
private void Load()
{
//加载资源
Addressables.LoadAssetAsync<GameObject>("AddressableName").Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_asyncOperationRes = handle;
// 加载实例
Addressables.InstantiateAsync(handle.Result).Completed += (inst) =>
{
_asyncOperationInst = inst;
};
}
};
}
private void Unload()
{
// 释放实例
Addressables.ReleaseInstance(_asyncOperationInst);
// 释放资源
Addressables.Release(_asyncOperationRes);
}
加载卸载场景
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
public class Test2 : MonoBehaviour
{
SceneInstance _loadedScene;//场景句柄
public void LoadSceneAsync()
{
Addressables.LoadSceneAsync("SceneName", LoadSceneMode.Additive).Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_loadedScene = handle.Result;
//do something
}
};
}
public void UnloadSceneAsync()
{
Addressables.UnloadSceneAsync(_loadedScene).Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_loadedScene = new SceneInstance();
//do something
}
};
}
}
分析资源
分析窗口帮助我们分析项目中的资源冗余情况,这里分为可修复规则(Fixable Rules)和不可修改规则(Unfixable Rules),点击某个规则,然后点击Analyze Selected Rules就会进行分析。对于可修复规则,比如A引用C,B也引用C,点击Fix Selected Rules就会创建一个新的Group,把C放进去。
参考
Unity进阶之Addressable