我对Unity3d中的场景有些困惑,但找不到任何相关资源。
- 什么时候应该使用场景?例如,在平台游戏中,每个级别都必须是一个不同的场景吗?主菜单是否也是一个场景?
- 可以在场景上叠加其他场景吗?
- 资产在场景之间如何工作?它们附加到每个独立的场景并且必须每次重新加载。能否指定何时不再需要某个资产?
- 如何在场景之间发送数据/界面传递数据?我知道这是一个广泛的话题,但我不想用多个问题垃圾邮件轰炸你。
我对Unity3d中的场景有些困惑,但找不到任何相关资源。
GameObject
在新场景加载时都会被销毁(除非使用附加场景加载)。使GameObject
在场景之间存活的一种方法是使用DontDestroyOnLoad进行标记。GameObject
实例,可以使用DontDestroyOnLoad
让对象保留。GameObject
的配置数据,可以考虑在AssetDatabase中存储ScriptableObject并引用它。还有两种我不喜欢的方法,但只是列举:
因此,它们的加载(或重新加载)取决于您的实现方式,取决于您是否一次又一次地实例化/销毁它们,或者是否将其实例化的预制件放在缓存对象中,并稍后从中检索。
如何在场景之间发送数据/在场景之间进行接口通信?
Heisen涵盖了我能想到的那些方法。只是为了添加一点内容,这也取决于您希望如何构建项目的架构。因此,如果您有一个底层数据结构来保存命令,则可以在项目的任何部分自由使用它。
大多数游戏都会为每个级别(包括主菜单)设置场景,但这完全取决于您。 如果您将数据保存在文本文件或二进制文件中,则可以在一个场景中使用另一个场景的数据。有很多关于如何做到这一点的教程。我发现文档非常有帮助。 资产在项目中是通用的。 您不能覆盖场景。
默认情况下,使用SceneManager.LoadScene()时会删除资产。但是,如果您使用DontDestroyOnLoad(),则该对象将不会在进入新场景时被销毁。如果您只想在几个场景中保留一个对象而不是全部场景,请使用Destroy()和一些布尔逻辑。
如何在场景之间发送数据/在场景之间进行接口?我知道这是一个广泛的话题,但我不想用多个问题来垃圾邮件。
你可以通过使用前面提到的DontDestroyOnLoad()、在不同的脚本中引用数据、使用ScriptableObjects、使用JSON Serialization、使用StreamWriter()、使用PlayerPrefs(不要用于重要信息)等方式来通过场景发送数据。我个人建议使用ScriptableObjects来实现数据的可访问性,使用StreamWriter()来实现加密功能。