1、设置
1.1 AddressableAssetSettings 基本配置
一般只需关注以下4个选项
- Disable Catalog Update On Startup
默认是没有勾选的,没有勾选,那么每次AddressableAsset(下称AA)系统初始化的时候,会自动更新catalog文件,勾选上,将不会自动更新catalog文件,也就意味着不会自动更新资源。AA系统的初始化会在任意接口第一次调用时初始化,也可以主动调用Addressables.InitializeAsync()初始化。 - Build Remote Catalog
默认没有勾选,只有勾选上才会创建catalog在指定目录(.hash和.json文件),记录着此次打包的资源信息,可用于在线更新,客户端通过下载这个catalog来进行对比更新。 - Send Profiler Events
调试用,允许加载资源的时候发送事件给EventViewer,可以通过这个工具查看资源的使用情况。 - Log Runtime Exception
输出加载资源时的异常,开启时如果资源加载发生异常,会直接抛出。如果关闭,我们也可以通过加载资源时返回的句柄,来获取到异常信息。同时我们也可以给项目添加宏ADDRESSABLES_LOG_ALL,来查看更多的日志信息。
1.2 资源管理窗口
Play Mode Script
- Use Asset Database(快速模式)
直接加载文件而不打包,快速但Profiler获取的信息较少。可以让你在完成游戏流程开发的同时也能快速运行游戏。它直接从asset database中加载资源,以便于游戏快速迭代,在这个过程中没有任何资源分析和asset bundle构建。 - Simulate Groups(虚拟模式)
在不打包的情况下模拟靠近AB的操作;与快速模式不同,您可以查看哪个AB包含资产。只会分析资源结构和依赖关系,但是不会创建asset bundle。资源是通过ResourceManager从asset database中加载而来,整个过程和从bundle中加载一样。所以可以在Addressables Event Viewer 窗口中查看资源的使用情况,以及bundle在游戏运行时的加载和卸载情况。
你可以通过Simulate Groups模式的模拟asset bundle加载来帮助你调整asset group,让整个资源结构在非常平衡状态下发布APP。 - Use Existing Build(打包模式)
非常接近发布版本的加载方式。但这需要先执行资源构建。在你没有修改资源的前提下,这将是最快进入游戏的模式,因为在运行时不需要处理任何数据。所以在这个模式下运行APP前,你需要在Addressables Groups窗口(Window > Asset Management > Addressables > Groups)中,选择菜单 Build > New Build > Default Build Script或者使用AddressableAssetSettings.BuildPlayerContent()来构建资源。
资源配置
- 1:资源名(可自定义)
- 2:标签(用于批量加载)
(后续可以通过标签或者名字加载资源)
1.3 Profiles 路径配置
(可自定义)
- LocalBuildPath
本地端打包路径 - LocalLoadPath
本地端加载路径 - RemoteBuildPath
远端打包的本地路径 - RemoteLoadPath
远端加载的地址路径
1.4 Group 资源组
Content Update Restriction
这个配置只有两个选项,用于表示这个包是静态的还是非静态的,
- Can Chang Post Release: 非静态包,可以在AB包发布后被修改
- Cannot Chang Post Release: 静态包,AB包在发布后不能再被修改
静态资源随APP一起发布(或者安装后立即下载),它们分散在少数非常大的bundle中。动态资源放在网络上,通常都是很小的bundle,以减少每次更新数量。所以Addressable Assets System的目标之一就是,更容易使用和修改,并且不需要修改你的脚本。
Content Packing & Loading
这个配置用于配置打包信息,告诉AA系统,这个Group将如何打包,打包粒度,以及打出来的AB包存放在哪个位置,还有就是这个包里面的资源,应该在哪里加载,最终打包后,这个Group的位置信息,加载地址,还会被catalog记录。
- Build And Load Paths: 决定AB包的存放位置和加载位置
- Assets Bundle Compression: AB包的压缩方式
- Include In Build: 默认勾选的,只有勾选上才会进行打包
- BundleMode: AB包打包粒度,有三种选项
– PackTogether: 把整个Group中的资源打包成一个AB包
– PackSeparately: 每个资源各自打包为AB包
– PackTogetherByLabel: 根据标签来决定哪些资源应该打成一个AB包 - Bundle Naming Mode: AB包文件名命名方式
– Filename: 文件名本身
– Append Hash to Filename(默认): 文件名+Hash值
– Use Hash of AssetBundle: AB包的Hash值
– Use Hash of Filename: 文件名的Hash值
Resources and Built In Scenes
这个配置只有两个变量,一般不太会使用这个配置,所以默认都只会添加前面两个Schema
- Include Resources Folders: 是否包含Resources文件夹中的资源,这个文件夹是Unity的一个特殊的文件夹,在这个文件夹下的资源在发布时都会包含在包体中,所以一般我们是不会包含这个文件夹中的资源的。
- Include Build Settings Scenes: 是否包含Build Setting 中拖入的场景,一般情况下我们可以直接把场景拖入到Group中,没必要使用这个选项来自动包含,反而不直观。
2、资源在线下载/更新
详见:https://blog.csdn.net/u011366226/article/details/104506802/
3、脚本化
官方文档:https://docs.unity3d.com/Packages/com.unity.addressables@1.3/api/index.html
- AddressableAssetSettings.BuildPlayerContent()
执行打包
3.1 Group
AddressableAssetSettings类
- 新建Group
AddressableAssetGroup group = setting.Createroup("Group Name", false, false, false,
new List<addressableAssetGroupSchema> {setting.DefaultGroup.Schemas[0], Setting.DefaultGroup.Schemas[1] });
- 查找Group(通过名字)
public AddressableAssetSettings setting;
AddressableAssetGroup group = setting.FindGroup("GroupName");
- 添加资源进group
(如果已有所属组,则移动到新组)
AddressableAssetEntry entry = setting.Create0rMoveEntry(guid, group):
AddressableAssetEntry类
- 获取/修改名字
entry.address = "Address Name";
也可以用
entry.SetAddress("Address Name");
AddressableAssetGroup类
- 获取Group上的组件
BundledAssetGroupSchema schema = group.GetSchema<BundledAssetGroupSchema>();
BundledAssetGroupSchema类
ContentUpdateGroupSchema类
3.2 Profile
- 获取 AddressableAssetProfileSetting
public AddressableAssetSettings setting;
AddressableAssetProfileSettings profileSet = setting.profileSettings;
- 改变当前profile
setting.activeProfileld = profileId;
AddressableAssetProfileSetting类
- 通过名字查找profile(返回id)
string id = profileSet.GetProfileld("Profile name")
- 新建profile
profileSet.AddProfile("NewProfile name", profileSet.GetProfileId("Default"));
- 修改profile的路径参数
profileSet.SetValue(id, "LocalBuildPath", "[UnityEngine.Application.streamingAssetsPath]/path01");
profileSet.SetValue(id, "LocalLoadPath", "{UnityEngine.Application streamingAssetsPath}/path0l");
注:有常量
AddressableAssetSettings.kLocalBuildPath = “LocalBuildPath”
AddressableAssetSettings.kLocalLoadPath = “LocalLoadPath”
建议使用
4、资源加载
- Addressables.LoadAssetAsync(“Group中的路径”)
(仅支持异步加载)
void Start()
{
var handle = Addressables.LoadAssetAsync<GameObject>("Assets/Res/prefab/obj.prefab");
handle.Completed += OnLoad;
}
void OnLoad(AsyncOperationHandle<Game0bject> handle)
{
Instantiate(handle.Result);
}
官方在最新版中也提供了一种同步加载的方法:使用.WaitForCompletion()进行阻塞等待
var handle = Addressables.LoadAssetAsync<GameObject>("Assets/Res/prefab/obj.prefab");
handle.WaitForCompletion();
Instantiate(handle.Result);
5、资源释放
卸载分为两种方式,一种用于卸载不能实例化的资源(如Mat),一种用于卸载能实例化的资源(如GameObject)
5.1 不能实例化的资源卸载方式
public static void Release<T>(T obj);
obj: 资源
直接释放T类型的资源,并且减少引用计数
public static void Release(AsyncOperationHandle handle);
handle: 上面加载时LoadAssetAsync得到的handle
释放由该handle加载出来的资源,并减少引用计数
5.2 能实例化的资源卸载方式
public static bool ReleaseInstance(GameObject instance);
instance: 实例化的资源
销毁游戏物体,并且减少引用计数。如果用该方法卸载不是由寻址系统实例化的物体,那么释放不会产生影响。
public static bool ReleaseInstance(AsyncOperationHandle handle);
handle:同上
释放由该handle加载出来的资源,并减少引用计数
6、注意
当一个Resources文件夹内的资源被标记为Addressable时,系统会自动将它从Resources文件夹移出到Resources_moved的新文件夹。
• 默认的关联位置会指向原来的旧路路径。
• 原本的加载代码会从Resources.LoadAsync (“xxx.prefab”)变成 Addressables.LoadAssetAsync ( “xxx.prefab”);
7、旧资源方案迁移到Addressable
当工程已有Asset Bundles设置时,第一次打开Addressables菜单会询问是否要全部转入Addressables群组。
- 使用资源有三种传统方法:
·直接引用:直接在组件上引用或者场景中使用。
·Resources文件夹:将资源添加到Resources文件夹并按文件名加载。
·Asset bundle:将资源打包到Asset bundle中,然后按文件路径加载它们和依赖项。
从直接引用迁移
要从这种方法迁移,按照下列步骤操作:
将对象的直接引用替换为AssetReference引用(例如,public GameObject obj; 变为public AssetReference obj;)。
将资源拖到对应组件的Inspector上,和原来直接引用一样(这个过程非addressable的资源会被自动标记为addressable)。
如果你要基于对象而不是字符串地址加载addressable资产,直接用AssetReference对象实例化该资产(例如AssetRefMember.LoadAssetAsync(); 或AssetRefMember.InstantiateAsync(pos, rot);)。
注意:addressable系统中是异步加载。当你将直接引用更新为AssetReference引用时,还必须将代码更新为异步操作。
从Resources文件夹迁移
当你将Resources文件夹中的资产标记为Addressable时,系统会弹框提示,你可以选择自动将资产从Resources文件夹移动到你项目中名为Resources_moved的新文件夹中。被移动的资产的默认地址是原来Resources目录下的旧路径,除了根目录变成了Resources_moved。
你的加载代码可能从Resources.LoadAsync(“desert/tank.prefab”); 变为Addressables.LoadAssetAsync(“desert/tank.prefab”);。
从Asset Bundle迁移
当你安装或打开Addressable系统窗口时,Unity会弹窗提示是否将所有Assetbundle包转换为Addressable组。
选择是的话会自动转换,每个ab包为一个Group;
如果你选择手动转换资产,选择”Ignore”。然后,使用前面介绍的直接引用或资源文件夹迁移方法。
一个资产的默认地址是它的文件路径。如果将文件路径用作资产的地址,则和之前用Assetbundle加载的方式相同。Addressable系统会处理加载asset bundle以及其依赖项。
8、与AssetBundle的差异
依赖项
无需再手动加载依赖包,Addressable会自动加载,并在无引用时自动释放(释放时机未知)。但要注意的是,手动释放只能释放手动加载的包,无法主动释放自动加载的依赖包。
加载路径
假设文件夹” Assets\Res\Effect\Logo\1001”为一个资源包,文件夹下有一个"1001.prefab"
则可以直接用” Assets\Res\Effect\Logo\1001\1001.prefab”来加载物体,无需再先加载ab包然后加载物体