九、资产依赖,Addressables 如何与其他项目资产交互

当您在项目构建设置中包含场景并构建播放器时,Unity 会将该场景和场景中使用的任何资产包含在您的游戏或应用程序的内置数据中。类似地,Unity 将项目资源文件夹中的任何资产包含在单独的内置资产集合中。(不同之处在于场景中的资产仅作为场景的一部分加载,而资源中的资产可以独立加载。)

可寻址资产可以作为一组额外的“本地”资产内置到您的游戏或应用程序中,也可以作为托管在服务器上并在需要时下载的“远程”资产保存在游戏构建外部。您可以独立于应用程序本身更新远程资产(尽管远程资产不能包含代码,因此您只能更改资产和序列化数据)。

项目资产如何导出到播放器构建

但是,如果您在多个类别中使用相同的资产,那么 Unity 会在构建时复制资产而不是共享单个实例。例如,如果您在内置场景中使用了一种材质,并且还在位于资源文件夹中的预制件中使用了它,那么您最终会在构建中得到该材质的两个副本——即使材质资产本身不是位于资源中。如果您随后将相同的材料标记为可寻址,您最终会得到三个副本。(项目 StreamingAssets 文件夹中的文件永远不能被该文件夹外的资产引用。)

笔记

在构建播放器之前,您必须对可寻址资产进行内容构建。在播放器构建期间,Unity 将您的本地 Addressables 复制到 StreamingAssets 文件夹,以便它们与您放置在 StreamingAssets 中的任何资产一起包含在构建中。(这些资产在构建过程结束时被删除。)您有责任将内容构建生成的远程 Addressables 文件上传到您的托管服务。有关详细信息,请参阅构建。

当您在项目中使用 Addressables 时,Unity 建议您将资源文件夹中的场景和任何数据移动到 Addressable 组中,并将它们作为 Addressables 进行管理。

Build Settings 场景列表必须包含至少一个场景。您可以创建一个最小场景来初始化您的应用程序或游戏。

Resources 文件夹中的少量数据通常不会导致性能问题。如果您使用将资产放在那里的 3rd 方包,则无需移动它们,除非它们会导致问题。(可寻址资产不能存储在 Resources 文件夹中。)

引用子对象

Unity 根据您的资产和脚本相互引用的方式,部分确定内容构建中包含的内容。子对象引用使过程更加复杂。

如果 anAssetReference指向可寻址的资产的子对象,Unity 会将整个对象构建到AssetBundle构建时。如果指向直接引用子对象的AssetReferenceAddressable 对象(例如GameObjectScriptableObject或),Unity 仅将子对象构建为隐式依赖项。SceneAssetBundle

Asset 和 AssetBundle 依赖

当您将资产添加到 Addressables 组时,该资产会在您进行内容构建时打包到 AssetBundle 中。在这种情况下,资产明确包含在捆绑包中,换句话说,它是一项明确的资产。

如果资产引用其他资产,则引用的资产是原始资产的依赖项。这称为资产依赖性。如果资产被打包到 Assetbundle A 中,引用的资产被打包到 AssetBundle B 中,那么 bundle B 就是 bundle A 的依赖。这被称为 AssetBundle 依赖。有关详细信息,请参阅AssetBundle 依赖项手册页。

资产依赖关系的处理取决于它们是否也是可寻址的。可寻址的依赖项根据它们所在的组的设置打包到 AssetBundle 中——这可以是与引用资产相同的包,也可以是不同的包。不可寻址的依赖项包含在其引用资产的捆绑包中。引用的资产隐式包含在捆绑包中,换句话说,它是隐式资产。

提示

使用Bundle Layout Preview Analyze 规则查看将根据 Addressables 组的内容包含在 AssetBundles 中的显式和隐式资产。这在构建内容之前预览资产时很有用。使用构建布局报告工具显示有关内容构建生成的 AssetBundle 的更多详细信息。

如果多个 Addressable 引用相同的隐式资产,则隐式资产的副本将包含在每个包含引用 Addressable 的包中。

不可寻址的资产被复制到每个带有引用可寻址的包中

当一个隐式资产包含在多个包中时,可能会发生一个微妙的后果,即该资产的多个实例可以在运行时实例化,而不是您的游戏逻辑期望的单个实例。如果您在运行时更改实例状态,则只有来自同一包的对象才能看到更改,因为所有其他资产现在都有自己的实例,而不是共享公共实例。

要消除这种重复,您可以将隐式资产设为可寻址资产并将其包含在现有捆绑包之一中或将其添加到不同的捆绑包中。每当您加载引用它的 Addressables 之一时,资产添加到的包就会被加载。如果 Addressables 被打包到与引用资产不同的 AssetBundle 中,那么包含引用资产的包是一个 AssetBundle 依赖项。

请注意,当您加载当前包中的任何资产时,必须加载依赖包,而不仅仅是包含引用的资产。虽然没有加载其他 AssetBundle 中的任何资产,但加载一个 bundle 有其自己的运行时成本。有关更多信息,请参阅加载 AssetBundle 依赖项的内存影响。

提示

使用Check Duplicate Bundle Dependencies Analyze 规则来识别和解决由项目内容组织导致的不需要的资产重复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值