Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一,完全重新加载场景_C#_Unity3d_Scene - Fatal编程技术网

C# 统一,完全重新加载场景

C# 统一,完全重新加载场景,c#,unity3d,scene,C#,Unity3d,Scene,我有两个场景:菜单和游戏,每次发射都会随机生成迷宫 在玩家在迷宫中死亡后,我加载场景菜单,玩家可以在其中按下开始按钮,这将生成一个新的迷宫,但它只是加载旧场景中的迷宫,玩家在此之前死亡 每次按下开始按钮后,我都要生成新的迷宫。 另外,当我单独使用迷宫播放场景时,一切都正常工作 对于场景加载,我使用: SceneManager.LoadScene(sceneIndex); 使用在生成设置中定义的索引 如果需要任何额外的代码,只要问我,我会添加它 更新 我有一个类MazeGenerator,其中我

我有两个场景:菜单和游戏,每次发射都会随机生成迷宫

在玩家在迷宫中死亡后,我加载场景菜单,玩家可以在其中按下开始按钮,这将生成一个新的迷宫,但它只是加载旧场景中的迷宫,玩家在此之前死亡

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

SceneManager.LoadScene(sceneIndex);
使用在生成设置中定义的索引

如果需要任何额外的代码,只要问我,我会添加它

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

public delegate void MazeReadyAction();
public static event MazeReadyAction OnMazeReady;
生成迷宫时触发事件,并在MazedReceives类中用于设置迷宫准备就绪时的敌人和硬币。
这样我就知道了,mazedirective有几行:

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

有什么建议吗?

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

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);
        }
    }
}
int scenes=SceneManager.sceneCount;
如果(场景>1)
{
对于(int i=0;i

public static event MazeReadyAction OnMazeReady;
静态的
如果该类的实例被销毁,它也会一直存在

所以以后

MazeGenerator.OnMazeReady += StartDirectives;
尽管注册为侦听器的
MazeDirectives
对象由于
SceneManager.Load
而被销毁,但仍会不断调用该侦听器。因此,下一次调用
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;
}

还要确保侦听器始终只能添加一次。

SceneManager.LoadScene()应该可以工作。你如何存储迷宫和玩家的数据?如果您使用的是可编写脚本的对象,您需要记住,在游戏过程中对它们所做的更改仍然存在。@Ethan我不保存任何数据。关键是每次加载场景时都随机创建一个新数据。我认为,对于一个阅读器来说,在多个类中包含多个静态元素可能会让人感到困惑。因此,我提出了一个在我看来更为实用的方法:使事件成为非静态的,并根据对象的生命周期,在onenable和ondisable,或WAKE和ondestroy中移动侦听器的添加和删除。
private void Awake()
{
    MazeGenerator.OnMazeReady -= StartDirectives;
    MazeGenerator.OnMazeReady += StartDirectives;
}