Unity中场景间的数据持久化会创建多个实例,而不考虑额外的游戏对象的条件破坏



我正在创建一款游戏,其中第一个场景将有一个生成的地图保存为2D数组,然后下一个场景将处理所有战斗。一旦完成,用户需要回到第一个场景并看到相同的地图。我遵循了Unity关于数据持久性的教程,正如你在下面的代码中看到的,我检查了两次实例是否为空,如果不是则销毁对象。

问题是,每次我从战斗场景回到地图场景时,它都会创建另一个WorldMapManager实例,并在现有的地图上生成另一个地图。

我在哪里出错,以停止创建不必要的额外副本的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();
}
}
}
}

我已经在这个问题上困了好几天,尝试了不同的方法,但是我已经没有主意了,所以非常感谢你的任何帮助。

从你的代码来看,你似乎从来没有设置过WorldMapManager.Instance。所以它总是null然后一直到DontDestroyOnLoad(gameObject);

所以把赋值也加到Instance

Instance = this;
DontDestroyOnLoad(gameObject);

出于同样的原因,void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)将执行InitMap()。当然,这里不需要设置Instance。

相关内容

最新更新