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