首页 > 解决方案 > 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”太久,它会在卸载之前尽可能多地调用脚本,但我不知道我将如何停止它。

任何帮助或建议将不胜感激!

标签: c#unity3d

解决方案


正如@HassanOmar 所说,问题是您多次触发负载。这是因为您正在检查按键被按下的每一帧,但您实际上只想要按键被按下的第一帧。你这样做Input.GetKeyDown()

public class ForestEnter : MonoBehaviour
{    
    void OnTriggerStay2D(Collider2D other)
    {        
    
        if (Input.GetKeyDown(KeyCode.E))
        {
            GameManager.instance.LoadForest();
        }
    }
}

推荐阅读