Unity Addressable的基本使用

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/[email protected]/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类

https://docs.unity3d.com/Packages/[email protected]/api/UnityEditor.AddressableAssets.Settings.GroupSchemas.BundledAssetGroupSchema.html

ContentUpdateGroupSchema类

https://docs.unity3d.com/Packages/[email protected]/api/UnityEditor.AddressableAssets.Settings.GroupSchemas.ContentUpdateGroupSchema.html


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包然后加载物体

猜你喜欢

转载自blog.csdn.net/EdmundRF/article/details/130133242