了解Unity3d中的场景

use*_*108 41 game-engine unity-game-engine scene

我对Unity3d中的场景有些困惑,我无法找到任何有关它们的资源.

  1. 什么时候应该使用场景?例如,在平台游戏中,每个级别都必须是不同的场景?主菜单会是一个场景吗?
  2. 可以叠加场景吗?
  3. 资产如何在场景之间起作用?它们是否与每个场景相关联,每次都必须重新加载.可以指定何时不再需要资产?
  4. 如何在场景之间的场景/界面之间发送数据?我知道这是一个广泛的主题,但我不希望垃圾邮件有多个问题.

Hei*_*bug 60

什么时候应该使用场景?例如,在平台游戏中,每个级别都必须是不同的场景?主菜单会是一个场景吗?

关于这一点没有一般规则.从理论上讲,整个游戏可能只有一个场景.如何组织场景完全取决于您,并且通常取决于您正在创建的游戏类型.

我认为使用场景至少要考虑3个功能:

  • 它们是所有预先实例化对象的逻辑容器,可能有助于将游戏划分为多个级别/部分.
  • 您可以序列化场景之间和场景内的交叉引用(如果GO A需要引用GO B,它们属于同一场景,引用可以序列化,您不再需要在运行时找到引用的对象)GameObjectsComponents
  • 当您加载(而不是以附加方式)另一个场景时,已经加载到内存中的资源会自动释放

可以叠加场景吗?

是的,您可以使用LoadAdditive.不幸的是,一旦将两个场景都加载到存储器中,就没有自动的方法来区分属于一个或另一个的对象.因此,如果您在第二级环境中加载添加剂,则由您来跟踪以前的环境,并在需要时明确销毁它.

资产如何在场景之间起作用?它们是否与每个场景相关联,每次都必须重新加载.可以指定何时不再需要资产?

默认情况下GameObject,一旦加载了新场景,每个场景都将被销毁(除非您使用加法场景加载).GameObject在场景中生存的一种方法是使用DontDestroyOnLoad标记它.

如果您需要共享GameObject的特定"配置",您可以将其存储为预制件,并在场景中引用它(但请记住,在场景中它曾经是一个预制实例,因此GO与预制件共享初始序列化而不是覆盖属性,但同一预制件的2个实例是不同的对象).

如何在场景之间的场景/界面之间发送数据?

有几种方法,具体取决于您要共享的持久数据类型.

  • 对于特定GameObject实例,让对象继续使用DontDestroyOnLoad.
  • 如果您有一些不需要附加到特定的配置数据,GameObject您可以考虑在AssetDatabase中存储ScriptableObject并引用它.
  • 如果您有必须在不同游戏会话中保留的数据,则可以考虑将它们存储到PlayerPref中.

还有其他两种我不喜欢的方式,但只是引用它们:

  • 使用静态字段有时可以帮助您完成此操作,但从我的角度来看,它有几个问题
  • 从磁盘保存和加载(在几种情况下可能很有用,但通常是依赖于平台的方式,尤其是在不同的移动平台上,您可能遇到一些问题)

这是一个广泛的主题顺便说一句,我希望这个答案可以是一个相当不错的概述.