Unity3d 新场景下的统一调用方法

Unity3d 新场景下的统一调用方法,unity3d,Unity3d,我有一个有很多场景的游戏,我加载它们,然后不破坏它们,所以我保持它们(第一次醒来/开始打电话) 假设我们有以下状态更改-菜单->游戏->游戏结束->菜单->游戏 我想在每次显示场景时调用一个方法来重置/设置一些值 最干净的方法是什么?目前我使用的是update方法,但这需要很多行,而且在不需要的时候在每个脚本中使用update()是浪费时间的。根据多场景编辑,建议避免DontDestroyOnLoad 建议避免使用DontDestroyOnLoad持久化管理器 您希望在场景负载中生存的游戏对象。

我有一个有很多场景的游戏,我加载它们,然后不破坏它们,所以我保持它们(第一次醒来/开始打电话)

假设我们有以下状态更改-菜单->游戏->游戏结束->菜单->游戏

我想在每次显示场景时调用一个方法来重置/设置一些值

最干净的方法是什么?目前我使用的是update方法,但这需要很多行,而且在不需要的时候在每个脚本中使用update()是浪费时间的。

根据多场景编辑,建议避免DontDestroyOnLoad

建议避免使用
DontDestroyOnLoad
持久化管理器 您希望在场景负载中生存的游戏对象。相反 创建一个包含所有管理者和用户的管理者场景
SceneManager.LoadScene(,LoadSceneMode.additional)
SceneManager.UnloadScene
管理游戏进度

因此,在您的情况下,您可以通过多种方式处理重置数据。但一种简单的方法是从“管理器”场景中的组件检查刚刚加载的场景的名称。例如,BaseSecene中的MySceneManager。在下面的代码中,我们使用了
SceneManager
sceneLoaded
委托

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;
}
注意:不幸的是,此方法不会对场景名称进行编译时检查,因此您必须小心确保场景名称与切换案例相对应

但是,要记住的另一件事是,新加载场景中的任何组件都将调用
Awake()
,因此您可以将所有场景初始化卸载到每个场景中的组件。这将使MySceneManager与每个场景中的数据分离


所以,你有很多选择,这只是其中的两个。“最佳”选项将是您满意的选项,并且适合您的需要。

考虑添加一些示例代码。您不能对场景对象调用
DoNotDestroy
。我猜你的意思是,你是在一个
游戏对象上做这件事的,它附带了一些脚本。在任何情况下,在代码的某个地方调用
LoadScene
,只需在从未销毁的对象上调用
ResetValues()
方法。是的,我在Awake()中完成所有操作,但是当我第二次加载场景时,我必须重置一些值,尽管MonoBehavior中有一个方法调用它,但没有。但不管怎么说,你刚才给我看的方式实际上是完美的!我在使用libGDX时就是这样做的。