首页 > 解决方案 > 使用 DontDestroyOnLoad 调用场景加载方法

问题描述

我正在使用带有 DontDestroyOnLoad() 的 GameObject 来存储玩家数据和场景之间的转换。有没有办法让它在场景改变时调用 Start() 或等效方法(在新场景中填充玩家数据)或者我需要在每个场景中放置一个实用程序对象来调用适当的设置方法它自己的 Start()

标签: c#unity3d

解决方案


您可以使用例如SceneManager.sceneLoaded并附加回调,例如

void Awake()
{
    DontDestroyOnLoad (gameObject);

    SceneManager.sceneLoaded += OnSceneLoaded;
}

// called second
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    // Find your player and populate the data like e.g.
    var player = FindObjectOfType<Player>();

    player.SetData(....);       
}

private void OnDestroy ()
{
    SceneManager.sceneLoaded -= OnSceneLoaded;
}

当然,您也可以反过来,简单地让您的播放器获取您提到自己的数据

public class Player : MonoBehaviour
{
    private void Start ()
    {
        var manager = FindObjectOfType<PlayerManager>();

        var data = manager.GetData();

        ...
    }
}

在这种情况下,虽然问题是为什么还要打扰DontDestroyOnLoad它,它必须是一个MonoBehaviour吗?

你也可以简单地让你的数据容器static

public static class PlayerData
{
    public static int someValue = 5;
}

并让您的播放器像访问它们一样

if(PlayersData.someValue <= 0)
{
    PlayerData.someValue = 10;
}

有关更多选项,请参阅如何在 Unity 中的场景之间传递数据


推荐阅读