我正在创建一个游戏,其中第一个场景将生成一个保存为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();
}
}
}
}
我已经坚持了几天,尝试不同的方法,但我的所有想法,所以非常感谢你的任何帮助。
1条答案
按热度按时间zazmityj1#
从代码的外观来看,似乎您从未设置过
WorldMapManager.Instance
,因此它将始终为null
,并一直转到DontDestroyOnLoad(gameObject);
。因此,也将赋值添加到
Instance
。由于同样的原因,在
void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
中,InitMap()
将被执行。当然,这里不需要设置任何示例。