unity3d Unity中场景之间的数据持久性创建多个示例,而不考虑额外游戏对象的条件销毁

uqjltbpv  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在创建一个游戏,其中第一个场景将生成一个保存为2D数组的Map,然后下一个场景将处理所有的战斗。完成后,用户需要返回到第一个场景,并看到相同的Map。我已经遵循了Unity的数据持久性教程,正如你在下面的代码中看到的,我检查了两次示例是否不为空,如果不是,则销毁对象。
问题是,每次我从战斗场景回到Map场景时,它都会创建另一个WorldMapManager示例,并在现有Map的基础上生成另一个Map。
在停止创建WorldMapManager对象的不必要的额外副本方面,我哪里出错了?

public class WorldMapManager : MonoBehaviour
{
    public static WorldMapManager Instance { get; private set; }
    public static int _mapSizeX = 4;
    public static int _mapSizeY = 4;
    public static int _playerScore;
    public static int _playerCells;
    public static int _enemyScore;
    public static int _enemyCells;
    public static GameObject[,] _map;
    public static GameObject _startingPoint;
    public static Vector2Int _playerBase;

    // Awake is called before Start
    void Awake()
    {
        if (WorldMapManager.Instance != null)
        {
            Destroy(gameObject);
        }
        else
        {
            DontDestroyOnLoad(gameObject);
        }
        SceneManager.sceneLoaded += OnLevelFinishedLoading;
    }

    // Initialize the map
    public void InitMap()
    {
        // Map Generation happens here
    }

    // OnSceneLoaded is called when a scene is loaded
    void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
    {
        if (scene.name == "WorldMap")
        {   
            if (WorldMapManager.Instance != null)
            {
                Destroy(this);
            } else
            {
                InitMap();
            }
        }
    }
}

我已经坚持了几天,尝试不同的方法,但我的所有想法,所以非常感谢你的任何帮助。

zazmityj

zazmityj1#

从代码的外观来看,似乎您从未设置过WorldMapManager.Instance,因此它将始终为null,并一直转到DontDestroyOnLoad(gameObject);
因此,也将赋值添加到Instance

Instance = this;
DontDestroyOnLoad(gameObject);

由于同样的原因,在void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)中,InitMap()将被执行。当然,这里不需要设置任何示例。

相关问题