Unity - 是否有必要从游戏构建中排除 AssetBundles 中使用的资源?

问题描述 投票:0回答:3

很难找到有关 AssetBundles 实际工作原理的大量信息。找不到任何有关如何通过游戏构建管理资源包的解释。

基本上,我的项目窗口中有一个名为

AssetBundles
的文件夹。我放入此文件夹中的所有资源都作为 AssetBundles 构建在构建目录中的文件夹中(例如 GameName/Data/AssetBundles),然后在需要时加载。

但是当我构建游戏本身时,它是否知道不要在游戏构建中包含 AssetBundles 中使用的这些资产?或者我需要以某种方式排除它们?

编辑:我已经取得了一些进展。

据我了解,只有驻留在构建设置中的场景中的资产才会通过游戏构建进行构建。脚本总是内置在游戏构建中(我不确定是否有办法解决这个问题,但这对我来说不是问题)。

所以我在游戏构建中有一个场景,它充当游戏的启动对象。该场景上有一个资产管理器脚本,并在

DontDestroyOnLoad
中指定了
Awake

我的资产管理器脚本基本上只处理捆绑包、资产和实例的加载/卸载。

我目前不太确定如何为场景构建资源包。我使用

LoadAllAssets
让它工作,然后执行
LoadLevel
,但是如果多个场景共享一些资源怎么办?场景构建最终会因为拥有可共享的资产副本而变得臃肿吗?我读到 Unity 5 中会自动处理依赖关系,但我不确定这是否与此相关。

unity-game-engine build assets assetbundle
3个回答
2
投票

我发现下面的帖子有一个示例项目,其中包含在 Unity 5 中使用 AssetBundles 的不同方法。

http://forum.unity3d.com/threads/new-assetbundle-build-system-in-unity-5-0.293975/

它包含构建/加载场景的示例,并且似乎工作正常(它自动确定依赖关系..因此您所要做的就是确保在共享资产包(或它们自己的包)中构建共享资产以提高效率)。

我在构建中做的唯一不同的事情是定义

AssetBundleBuild
(基本上我组织了我的项目文件夹,以便将资产存储在与其资产包名称相关的子文件夹中,然后在构建时检查这些文件夹并添加它们)。

出于某种原因,我这样做的方法似乎打破了依赖关系,而在编辑器 ui 中使用资源包功能似乎可以工作(为每个资源手动命名资源包..如果您在几个不同的资源中有数百个资源,这有点乏味)包),然后使用

BuildAssetBundles
而不使用 builds 参数。

我仍然没有真正回答我原来的问题

Is it necessary to exclude assets being used in AssetBundles from game build?

但为了安全起见,我在游戏构建中实际上只构建了 1 个场景,并且该场景只有一个资产管理器脚本,用于处理资产包,并且不会在加载时销毁。如果您将所有场景都作为资源包,则无需构建其他场景。


0
投票

当您构建游戏时,它应该只使用构建中的资产,就像您使用的任何资产一样,或者是构建中使用的任何资产的依赖项。


0
投票

我相信原来问题的答案是肯定的。排除的方法是删除已构建场景中资产的引用,前提是这些资产正在添加到资产包中并将从资产包中使用。

例如,如果目标是从

cube.prefab
在我的场景中实例化
CubeGenerator.cs
,则可能有 2 个选项

参考预制件

第一个选项是在场景中保留引用,以便我的脚本可以找到它

  1. 将预制件的实例放入场景中并在运行时找到它
  2. 将预制件引用为 GameObject 字段

第一个选项会将

cube.prefab
添加到构建中,因为 Unity 会将其识别为在构建场景中被引用

使用资源包

第二个选项是将

cube.prefab
内置到资产包
cube.ab
中。在
CubeGenerator.cs
通话中

AssetBundle ab = AssetBundle.LoadFromFile("path/to/cube.ab");
GameObject cubePrefab = ab.LoadAsset("asset/path/of/cube.prefab");
// Instantiate cubePrefab

第二个选项不会将

cube.prefab
内置到构建中。

所以我认为使用Asset Bundle的正确方法是

  1. 在资产包中构建资产
  2. 在脚本中加载资源
  3. 从构建的场景中删除资产引用
© www.soinside.com 2019 - 2024. All rights reserved.