c# - Unity 在使用异步加载时有时会加载两次场景
问题描述
我有一个“持久场景”,它始终在后台通过 GameManager 脚本处理加载和卸载。激活此脚本的方法是输入触发器并按“E”,这将加载另一个场景。
加载到森林中的示例
触发器上的脚本:
public class ForestEnter : MonoBehaviour
{
void OnTriggerStay2D(Collider2D other)
{
if (Input.GetKey(KeyCode.E))
{
GameManager.instance.LoadForest();
}
}
}
GameManger 中的部分脚本:
public void LoadForest()
{
scenesLoading.Add(SceneManager.UnloadSceneAsync((int)SceneIndexes.CITY));
scenesLoading.Add(SceneManager.LoadSceneAsync((int)SceneIndexes.FOREST, LoadSceneMode.Additive));
spawnname = ("CityExit");
sceneName = ("Forest");
StartCoroutine(GetSceneLoadProgress());
}
以及它正在调用的协程(以确保它等到所有内容都加载完毕后再找到生成点并将场景设置为“活动场景”)
public IEnumerator GetSceneLoadProgress()
{
for(int i=0; i<scenesLoading.Count; i++)
{
while (!scenesLoading[i].isDone)
{
yield return null;
}
}
player = GameObject.Find("PC");
playerPOS = player.transform;
spawn = GameObject.Find(spawnname);
spawnPOS = spawn.transform;
playerPOS.position = spawnPOS.position;
SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName));
}
现在我的问题是有时它会加载两次场景,因为总共会播放 3 个场景,GameManager 场景、森林场景和森林场景。它只是偶尔发生,不是每次都发生。
我认为问题是如果我按住“E”太久,它会在卸载之前尽可能多地调用脚本,但我不知道我将如何停止它。
任何帮助或建议将不胜感激!
解决方案
正如@HassanOmar 所说,问题是您多次触发负载。这是因为您正在检查按键被按下的每一帧,但您实际上只想要按键被按下的第一帧。你这样做Input.GetKeyDown()
:
public class ForestEnter : MonoBehaviour
{
void OnTriggerStay2D(Collider2D other)
{
if (Input.GetKeyDown(KeyCode.E))
{
GameManager.instance.LoadForest();
}
}
}
推荐阅读
- c++ - C++ 类“请求和标识符”中的 int 方法
- flutter - 如何仅从颤动的字符串中提取数字?
- sql - SQL Server 代理作业 - 删除表并替换为 .bak 文件的脚本
- python - 使用 PIPE 从主进程读取子进程的标准输出导致子进程死亡
- assembly - 我的程序集冒泡排序出了什么问题?
- java - 在 ec2 上使用 java SDK 在 aws 中担任不同的角色,该 SDK 使用分配的 IAM 进行访问
- reactjs - 我不能在版本 5 中使用 this.props.navigation.navigate
- javascript - 从“文件树”中提取所有文件的递归函数
- mongodb - 两个 docker 镜像合并为一个 docker 镜像
- regex - 正则表达式删除全名中的中间首字母