很难找到有关 AssetBundles 实际工作原理的大量信息。找不到任何有关如何通过游戏构建管理资源包的解释。
基本上,我的项目窗口中有一个名为
AssetBundles
的文件夹。我放入此文件夹中的所有资源都作为 AssetBundles 构建在构建目录中的文件夹中(例如 GameName/Data/AssetBundles),然后在需要时加载。
但是当我构建游戏本身时,它是否知道不要在游戏构建中包含 AssetBundles 中使用的这些资产?或者我需要以某种方式排除它们?
编辑:我已经取得了一些进展。
据我了解,只有驻留在构建设置中的场景中的资产才会通过游戏构建进行构建。脚本总是内置在游戏构建中(我不确定是否有办法解决这个问题,但这对我来说不是问题)。
所以我在游戏构建中有一个场景,它充当游戏的启动对象。该场景上有一个资产管理器脚本,并在
DontDestroyOnLoad
中指定了 Awake
。
我的资产管理器脚本基本上只处理捆绑包、资产和实例的加载/卸载。
我目前不太确定如何为场景构建资源包。我使用
LoadAllAssets
让它工作,然后执行 LoadLevel
,但是如果多个场景共享一些资源怎么办?场景构建最终会因为拥有可共享的资产副本而变得臃肿吗?我读到 Unity 5 中会自动处理依赖关系,但我不确定这是否与此相关。
我发现下面的帖子有一个示例项目,其中包含在 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 个场景,并且该场景只有一个资产管理器脚本,用于处理资产包,并且不会在加载时销毁。如果您将所有场景都作为资源包,则无需构建其他场景。
当您构建游戏时,它应该只使用构建中的资产,就像您使用的任何资产一样,或者是构建中使用的任何资产的依赖项。
我相信原来问题的答案是肯定的。排除的方法是删除已构建场景中资产的引用,前提是这些资产正在添加到资产包中并将从资产包中使用。
例如,如果目标是从
cube.prefab
在我的场景中实例化 CubeGenerator.cs
,则可能有 2 个选项
第一个选项是在场景中保留引用,以便我的脚本可以找到它
第一个选项会将
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的正确方法是