You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中如何实现先执行Time.timeScale与UI文本设置后延迟2秒重新加载场景?

在Unity中实现Win/Lose后的延迟场景重载

我来帮你搞定这个延迟需求!在Unity里,要实现这种先执行部分代码、再延迟执行后续逻辑的功能,**协程(Coroutine)**是最常用也最灵活的方案,当然也可以用Invoke方法快速实现,下面给你两种靠谱的实现方式:

方法一:使用协程(推荐)

协程能让你在代码中插入延迟逻辑,同时不会阻塞主线程,非常适合这种分步执行的场景。我们可以把原来的WinLose函数改成协程的入口,然后在单独的协程里完成延迟加载:

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

火山引擎 最新活动