Unity中如何实现先执行Time.timeScale与UI文本设置后延迟2秒重新加载场景?
在Unity中实现Win/Lose后的延迟场景重载
我来帮你搞定这个延迟需求!在Unity里,要实现这种先执行部分代码、再延迟执行后续逻辑的功能,**协程(Coroutine)**是最常用也最灵活的方案,当然也可以用Invoke方法快速实现,下面给你两种靠谱的实现方式:
方法一:使用协程(推荐)
协程能让你在代码中插入延迟逻辑,同时不会阻塞主线程,非常适合这种分步执行的场景。我们可以把原来的Win和Lose函数改成协程的入口,然后在单独的协程里完成延迟加载:
using UnityEngine.SceneManagement; using UnityEngine; // 当玩家答对所有题目时调用 void Win () { // 先执行核心逻辑:恢复时间流速+显示结束文本 Time.timeScale = 1f; UI.instance.SetEndText(true); // 启动协程实现2秒延迟后加载场景 StartCoroutine(DelayedSceneLoad()); } // 当某道题剩余时间归零时调用 void Lose () { // 先执行核心逻辑:恢复时间流速+显示结束文本 Time.timeScale = 1f; UI.instance.SetEndText(false); // 启动协程实现2秒延迟后加载场景 StartCoroutine(DelayedSceneLoad()); } // 封装延迟加载逻辑的协程 IEnumerator DelayedSceneLoad() { // 等待2秒(此等待时长受Time.timeScale影响,刚好你已经将timeScale设为1,对应真实的2秒) yield return new WaitForSeconds(2f); // 延迟结束后执行场景重载 SceneManager.LoadScene("Game"); }
如果你的场景中Time.timeScale之前可能被修改过,且希望延迟时间不受时间流速影响,可以把等待语句换成:
yield return new WaitForSecondsRealtime(2f);
方法二:使用Invoke方法
如果你觉得协程有点繁琐,Invoke方法可以快速实现“延迟调用指定函数”的需求,代码更简洁:
using UnityEngine.SceneManagement; using UnityEngine; void Win () { Time.timeScale = 1f; UI.instance.SetEndText(true); // 2秒后调用LoadGameScene方法 Invoke(nameof(LoadGameScene), 2f); } void Lose () { Time.timeScale = 1f; UI.instance.SetEndText(false); // 2秒后调用LoadGameScene方法 Invoke(nameof(LoadGameScene), 2f); } // 单独封装场景加载逻辑 void LoadGameScene() { SceneManager.LoadScene("Game"); }
注意:Invoke的延迟时长同样受Time.timeScale影响,如果需要不受时间流速控制的延迟,这种方式不如协程灵活,所以更推荐第一种协程方案。
内容的提问来源于stack exchange,提问作者Antonio Silva




