繁体   English   中英

统一,完全重载场景

[英]Unity, reload scene completely

我有两个场景:Menu和Game,每次发射时都会随机生成迷宫。

玩家在迷宫中死亡后,我加载了场景菜单,在该菜单中,玩家可以按启动按钮,这会生成一个新的迷宫,但它只是加载了旧场景,其中玩家早逝了。

我想在每次按下开始按钮后生成新的迷宫。
另外,当我分别用迷宫播放场景时,一切都可以正常工作。对于场景加载,我使用:

SceneManager.LoadScene(sceneIndex);

在构建设置中定义的索引。

如果需要任何其他代码,请问我,我会添加它。

UPDATE
我有一个MazeGenerator类,其中有委托和事件:

public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;

事件在迷宫生成时触发,并在迷宫准备就绪时用于MazeDirecives类中以设置敌人和硬币。
这样我的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);

有什么建议么?

以来

public static event MazeReadyAction OnMazeReady;

如果是static那么如果该类的实例被销毁,它也会一直存在。

这样之后

MazeGenerator.OnMazeReady += StartDirectives;

尽管您注册为侦听器的MazeDirectives对象由于SceneManager.Load而被破坏,但MazeDirectives继续调用该侦听器。 因此,下次调用OnMazeReady时,您实际上注册了两个侦听器:一个来自第一个场景(现在已销毁),另一个来自“新”场景。

您应该删除旧的监听器

private void OnDestroy()
{
    MazeGenerator.OnMazeReady -= StartDirectives;
}

甚至不“堆放”它们,只分配一个听众

private void Awake()
{
    MazeGenerator.OnMazeReady = StartDirectives;
}

当然,这仅适用于您的场景中没有其他听众的情况。

无论如何,您应该重置它以确保

private void OnDestroy()
{
    MazeGenerator.OnMazeReady = null;
}

一般说明:随时保存通话

MazeGenerator.OnMazeReady -= StartDirectives;

即使之前没有添加监听器也是如此。 这样做

private void Awake()
{
    MazeGenerator.OnMazeReady -= StartDirectives;
    MazeGenerator.OnMazeReady += StartDirectives;
}

还确保始终只能将监听器添加一次。

这有点蛮力,但应该可以解决。 在加载迷宫场景之前,将从主菜单场景中调用此例程。

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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM