我有一堆场景的游戏,我加载它们然后做DoNotDestroy所以我保留它们(唤醒/开始第一次调用)。
假设我们有以下状态更改 - 菜单 - >游戏 - >游戏结束 - >菜单 - >游戏...
我想在每次显示场景时调用一个方法来重置/设置一些值。
最干净的方法是什么?目前我正在使用更新方法,但它需要很多行,如果你不需要在每个脚本中使用Update()是浪费的。
答案 0 :(得分:2)
根据多场景编辑的Unity documentation,建议您避免使用DontDestroyOnLoad。
建议避免使用
DontDestroyOnLoad
来保留经理 想要在场景加载中存活的游戏对象。代替, 创建一个拥有所有经理和使用的经理场景SceneManager.LoadScene(<path>, LoadSceneMode.Additive)
和SceneManager.UnloadScene
来管理您的游戏进度。
因此,在您的情况下,您可以通过多种方式处理重置数据。但是一个简单的方法是检查刚刚加载的场景的名称,来自&#34; Manager&#34;现场。例如。 BaseScene中的MySceneManager。在以下代码中,我们正在使用sceneLoaded
的{{1}}代表。
SceneManager
N.B。遗憾的是,这种方法无法对您的场景名称进行编译时检查,因此您必须小心确保您的场景名称与切换案例相对应。
但是,另外要记住的是,新加载的场景中的任何组件都会调用using UnityEngine;
using UnityEngine.SceneManagement;
public class MySceneManager : MonoBehaviour
{
void OnEnable ( ) => SceneManager.sceneLoaded += OnSceneLoaded;
void OnSceneLoaded ( Scene scene, LoadSceneMode mode )
{
switch ( scene.name.ToLower ( ) )
{
case "menu":
// Do some "menu" initialisation here...
break;
case "game":
// Do some "game" initialisation here...
break;
case "gameover":
// Do some "gameover" initialisation here...
break;
}
}
void OnDisable ( ) => SceneManager.sceneLoaded -= OnSceneLoaded;
}
,因此您可以将所有场景初始化卸载到每个场景中的组件。这会将MySceneManager与每个场景中的数据分离。
所以,你有很多选择,这些只是其中两个。最好的&#34;选项将是您满意的选择,并且符合您的需求。