0

我的游戏项目中有几个区域被分成几个场景,例如,假设有一个名为“地下室”的第一个区域,它被分成 Basement_1、Basement_2 和 Basement_3 场景;另一个区域“阁楼”分为 Attic_1 和 Attic_2。

一些资产(纹理图集和声音)在一个区域的所有场景中共享,所以我认为我可以为“地下室”制作一个包含所有共享资产的 AssetBundle,并为“阁楼”区域制作另一个包含共享资产的 AssetBundle . 然后当我的播放器即将进入“Basement”区域时,我会加载“Basement” AssetBundle,这样当我调用 Application.LoadLevel("Basement_1")、Application.LoadLevel("Basement_2") 或 Application.LoadLevel (“Basement_3”),共享资源(已加载到包中)不会不必要地重新加载,只会加载特定于场景的资源。然后,如果我到了游戏知道不再需要地下室资产的地步,或者至少在很长一段时间内都不需要,那么我会卸载捆绑包,

我的问题是:它是这样工作的吗?例如,假设我即将进入“Basement”,所以如果我从磁盘加载我的“Basement”AssetBundle,并且基本上只是在其上调用 LoadAllAssets(),Application.LoadLevel("Basement_1") 会“自动”查找我已加载的捆绑包中的资产?还是 Application.LoadLevel 只是重新加载它需要的资产?

我目前的理解是 Application.LoadLevel 不会自动在 AssetBundle 中查找。如果是这样,有没有办法让它看起来在加载的 AssetBundle(s) 中?还有另一种我看不到的方法吗?

这个想法是尝试减少加载时间,因为例如进出门可能会触发对 Application.LoadLevel("Basement_X") 和 Application.LoadLevel("Basement_Y") 的来回调用。

在此先感谢您的任何见解;)

干杯!

4

1 回答 1

0

资产包可以按照您提议的方式使用,但它们主要用于解决从服务器下载内容的问题。基本上,如果您不打算下载任何内容,那么您没有太多理由使用资产包。

另一方面, Prefabs似乎是您所需要的。它们是您“打包”到可重复使用的预制件中的游戏对象。如果您想在相同场景或不同场景中重用游戏对象,预制件是您的最佳选择。

如果您以编程方式实例化和定位游戏对象,您可以这样做:

GameObject myItem = Instantiate(Resources.Load("myPrefab")) as GameObject;

鉴于myPrefab是名为Resources的文件夹中的预制件。

如果您在编辑器中创建场景,您只需将预制件拖放到场景中,它们就会成为常规游戏对象。

Object.DontDestroyOnLoad您可以通过使用防止对象被破坏来优化场景之间的游戏对象使用。我强烈建议您仅在它们绝对不变的情况下使用它。这种过早的优化(重用对象)可能会导致意想不到的问题并延迟游戏的开发。

也就是说,还要记住,如果您保留对加载的预制件、资产包、游戏对象或其他任何东西的引用,它将永远不会被垃圾收集,因此您可以使用Object.DontDestroyOnLoad和/或静态引用将它们保存在内存中。

于 2015-06-19T01:45:53.207 回答