六、在编辑器中管理可寻址

虽然不可能对项目中组织资产的所有不同方式进行全面分类,但组织可寻址资产概述了在规划组织策略时需要考虑的几个注意事项。

在考虑如何管理您的资产时,您还应该了解Addressables 如何与您的项目资产交互。

可寻址是您管理可寻址资产的主要组织单位。使用 Addressables 时的一个重要考虑因素是将组打包到 AssetBundles 中的选项。

除了组设置之外,您还可以使用以下内容来控制 Addressables 在项目中的工作方式:

  • Addressable Asset Settings:项目级设置
  • 配置文件:定义构建路径设置的集合,您可以根据构建的目的在它们之间切换。(如果您计划远程分发内容,则主要感兴趣。)
  • 标签:编辑项目中使用的可寻址资产标签。
  • 播放模式脚本:选择在编辑器中进入播放模式时 Addressables 系统如何加载资产。

AssetReferences提供了一种 UI 友好的方式来使用可寻址资产。您可以在 MonoBehaviour 和 ScriptableObject 类中包含 AssetReference 字段,然后使用拖放或对象选择器对话框在编辑器中将资产分配给它们。

Addressables 系统提供了以下附加工具来帮助开发:

  • 分析工具:提供各种分析规则,您可以运行这些规则来验证您是否按照您想要的方式组织了您的资产,包括关于 Addressables 如何将您的资产打包成包的报告。
  • 事件查看器:提供一个配置文件视图,显示您的资产何时加载和释放。使用事件查看器来验证您是否正在释放资产并监控峰值内存使用情况。
  • 托管服务:提供一个简单的资产服务器,您可以使用它来托管本地开发的远程资产。
  • 构建布局报告:提供构建生成的 AssetBundle 的描述。
  • 构建配置文件日志:提供构建过程本身的日志配置文件,以便您可以查看哪些部分花费的时间最长。

组织可寻址资产

没有单一的最佳方式来组织您的资产;这取决于每个项目的具体要求。计划如何管理项目中的资产时要考虑的方面包括:

  • 逻辑组织:将资产保持在逻辑类别中可以更容易地了解您的组织并发现不合适的项目。
  • 运行时性能:如果您的包变得非常大,或者如果您有非常多的包,则可能会出现性能瓶颈。
  • 运行时内存管理:将一起使用的资产放在一起有助于降低峰值内存需求。
  • 规模:某些组织资产的方法可能适用于小型游戏,但不适用于大型游戏,反之亦然。
  • 平台特征:平台的特征和要求是如何组织资产的重要考虑因素。一些例子:
    • 与虚拟内存有限的平台相比,提供丰富虚拟内存的平台可以更好地处理大型捆绑包。
    • 一些平台不支持下载内容,完全排除了资产的远程分发。
    • 一些平台不支持 AssetBundle 缓存,因此尽可能将资产放在本地包中会更有效。
  • 分发:无论您是否远程分发您的内容,至少意味着您必须将远程内容与本地内容分开。
  • 资产的更新频率:将您希望经常更新的资产与您计划很少更新的资产分开。
  • 版本控制:处理相同资产和资产组的人越多,项目中发生版本控制冲突的可能性就越大。

常用策略

典型的策略包括:

  • 并发使用:将您同时加载的资产分组在一起,例如给定级别的所有资产。从长远来看,这种策略通常是最有效的,并且可以帮助减少项目中的内存使用峰值。
  • 逻辑实体:将属于同一逻辑实体的资产组合在一起。例如,UI 布局资产、纹理、音效。或角色模型和动画。
  • 类型:将相同类型的资产组合在一起。例如,音乐文件、纹理。

根据项目的需要,其中一种策略可能比其他策略更有意义。例如,在具有多个级别的游戏中,从项目管理和运行时内存性能的角度来看,根据并发使用进行组织可能是最有效的。同时,您可能会针对不同类型的资产使用不同的策略。例如,您的菜单屏幕 UI 资产可能在基于关卡的游戏中全部组合在一起,否则将其关卡数据单独分组。您还可以将包含某个级别的资产的组打包到包含特定类型资产的包中。

有关更多信息,请参阅为 AssetBundle 准备资产。

安全地编辑加载的资产

在以下情况下,您可以安全地编辑加载的资产:

  • 资产是从资产包中加载的。
  • 该应用程序在播放器中运行,而不是在编辑器中运行。
  • 当您在Play Mode Scripts中启用Use Existing Build (requires built groups)选项时。

在这些情况下,资产作为活动内存中的副本存在。对这些复制的资产所做的更改不会影响磁盘上保存的资产包,并且任何更改都不会在会话之间持续存在。

对于其他情况,包括当您在播放模式设置中启用使用资产数据库(最快)模拟组(高级)属性时,Unity 会直接从项目文件中加载资产。这意味着 Unity 会在运行时将对资产的任何修改保存到项目资产文件中,并且这些更改将在不同会话之间持续存在。

如果您想对资产进行运行时更改,Unity 建议您创建要修改的 GameObject 的新实例,并将副本用于任何运行时更改。这消除了您可能不小心修改原始资产文件的风险。以下代码示例演示了创建已加载资产的新副本:

var op = Addressables.LoadAssetAsync<GameObject>("myKey");
yield return op;
if (op.Result != null)
{
    GameObject inst = UnityEngine.Object.Instantiate(op.Result);
    // can now use and safely make edits to inst, without the source Project Asset being changed.
}

如果使用上述方法使用一个Asset的副本,需要注意以下几点:

  • 释放资产时,您必须使用原始资产或 AsyncOperationHandle,而不是资产的当前实例。
  • 当您以这种方式实例化引用其他资产的资产时,Unity 不会创建引用资产的新实例。新实例化副本的引用以原始项目资产为目标。
  • Unity 在新实例上调用 Start()、OnEnable() 和 OnDisable() 等 MonoBehaviour 方法。

猜你喜欢

转载自blog.csdn.net/youmangu/article/details/129831116