统一,完全重新加载场景
Unity, reload scene completely
我有两个场景:每次启动时随机生成迷宫的菜单和游戏。
玩家在迷宫中死亡后,我加载场景菜单,玩家可以在其中按下开始按钮,这应该会生成一个新的迷宫,但它只会加载玩家早些时候死亡的带有迷宫的旧场景。
我想在每次按下开始按钮后生成新的迷宫。
此外,当我单独播放迷宫场景时,一切正常
对于场景加载,我使用:
SceneManager.LoadScene(sceneIndex);
具有在构建设置中定义的索引。
如果需要任何其他代码,请询问我,我会添加。
更新
我有一个 class MazeGenerator,其中有委托和事件:
public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;
事件在迷宫生成时触发,并在 MazeDirecives class 中用于在迷宫准备就绪时设置敌人和硬币。
所以我的 MazeDirectives 有行:
void Awake()
{
MazeGenerator.OnMazeReady += StartDirectives;
}
void StartDirectives()
{
for (int i = 0; i < mazeCoinPositions.Count; i++)
{
MazeCoin mazeCoin = Instantiate(mazeCoinPrefab, mazeCoinPositions[i],
Quaternion.identity) as MazeCoin;
mazeCoin.transform.SetParent(transform);
}
}
错误:
MissingReferenceException: The object of type 'MazeDirectives' has been destroyed but you are still trying to access it
出现在:
mazeCoin.transform.SetParent(transform);
有什么建议吗?
这有点蛮力,但应该可以解决问题。在加载迷宫场景之前,将从主菜单场景调用此例程。
int scenes = SceneManager.sceneCount;
if (scenes > 1)
{
for (int i = 0; i < scenes; i++)
{
if (SceneManager.GetSceneAt(i).name == "Name of Maze Scene")
{
SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(i).name);
}
}
}
自从
public static event MazeReadyAction OnMazeReady;
是static
如果有一个class被销毁的实例,它也会一直在那里。
所以之后
MazeGenerator.OnMazeReady += StartDirectives;
尽管您注册为侦听器的 MazeDirectives
对象由于 SceneManager.Load
而被销毁,但该侦听器仍被调用。因此,下次调用 OnMazeReady
时,您实际上注册了两个侦听器:第一个场景中的侦听器现在已被销毁,以及 "new" 场景中的侦听器。
您应该删除旧的侦听器
private void OnDestroy()
{
MazeGenerator.OnMazeReady -= StartDirectives;
}
或者甚至 "stack" 他们只指定一个听众
private void Awake()
{
MazeGenerator.OnMazeReady = StartDirectives;
}
这当然只适用于场景中没有其他听众的情况。
无论如何你应该重置它以确保
private void OnDestroy()
{
MazeGenerator.OnMazeReady = null;
}
一般注意:总是保存到调用
MazeGenerator.OnMazeReady -= StartDirectives;
即使之前没有添加监听器。这样做
private void Awake()
{
MazeGenerator.OnMazeReady -= StartDirectives;
MazeGenerator.OnMazeReady += StartDirectives;
}
还确保始终只能恰好添加一次侦听器。
我有两个场景:每次启动时随机生成迷宫的菜单和游戏。
玩家在迷宫中死亡后,我加载场景菜单,玩家可以在其中按下开始按钮,这应该会生成一个新的迷宫,但它只会加载玩家早些时候死亡的带有迷宫的旧场景。
我想在每次按下开始按钮后生成新的迷宫。
此外,当我单独播放迷宫场景时,一切正常
对于场景加载,我使用:
SceneManager.LoadScene(sceneIndex);
具有在构建设置中定义的索引。
如果需要任何其他代码,请询问我,我会添加。
更新
我有一个 class MazeGenerator,其中有委托和事件:
public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;
事件在迷宫生成时触发,并在 MazeDirecives class 中用于在迷宫准备就绪时设置敌人和硬币。
所以我的 MazeDirectives 有行:
void Awake()
{
MazeGenerator.OnMazeReady += StartDirectives;
}
void StartDirectives()
{
for (int i = 0; i < mazeCoinPositions.Count; i++)
{
MazeCoin mazeCoin = Instantiate(mazeCoinPrefab, mazeCoinPositions[i],
Quaternion.identity) as MazeCoin;
mazeCoin.transform.SetParent(transform);
}
}
错误:
MissingReferenceException: The object of type 'MazeDirectives' has been destroyed but you are still trying to access it
出现在:
mazeCoin.transform.SetParent(transform);
有什么建议吗?
这有点蛮力,但应该可以解决问题。在加载迷宫场景之前,将从主菜单场景调用此例程。
int scenes = SceneManager.sceneCount;
if (scenes > 1)
{
for (int i = 0; i < scenes; i++)
{
if (SceneManager.GetSceneAt(i).name == "Name of Maze Scene")
{
SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(i).name);
}
}
}
自从
public static event MazeReadyAction OnMazeReady;
是static
如果有一个class被销毁的实例,它也会一直在那里。
所以之后
MazeGenerator.OnMazeReady += StartDirectives;
尽管您注册为侦听器的 MazeDirectives
对象由于 SceneManager.Load
而被销毁,但该侦听器仍被调用。因此,下次调用 OnMazeReady
时,您实际上注册了两个侦听器:第一个场景中的侦听器现在已被销毁,以及 "new" 场景中的侦听器。
您应该删除旧的侦听器
private void OnDestroy()
{
MazeGenerator.OnMazeReady -= StartDirectives;
}
或者甚至 "stack" 他们只指定一个听众
private void Awake()
{
MazeGenerator.OnMazeReady = StartDirectives;
}
这当然只适用于场景中没有其他听众的情况。
无论如何你应该重置它以确保
private void OnDestroy()
{
MazeGenerator.OnMazeReady = null;
}
一般注意:总是保存到调用
MazeGenerator.OnMazeReady -= StartDirectives;
即使之前没有添加监听器。这样做
private void Awake()
{
MazeGenerator.OnMazeReady -= StartDirectives;
MazeGenerator.OnMazeReady += StartDirectives;
}
还确保始终只能恰好添加一次侦听器。