You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity实现面板切换延迟的正确方法(新手求助)

延迟打开面板的正确协程实现方法

你的代码问题在于:启动协程后立刻执行了SetActive(true),协程里的等待逻辑根本没包裹面板激活的操作,所以延迟完全没生效。

下面是修正后的实现方式:

核心思路

把面板激活的逻辑放到协程内部,让协程先完成延迟等待,再执行激活操作。同时可以通过给协程传参数,实现复用同一个协程处理不同面板。

完整修正代码

public void OpenPanel(string name)
{
    switch (name)
    {
        case nameof(MainMenu):
            // 传入要激活的面板对象,启动延迟协程
            StartCoroutine(DelayedActivatePanel(MainMenuPanel.gameObject));
            break;
        case nameof(LevelsPanel):
            StartCoroutine(DelayedActivatePanel(LevelsPanel1.gameObject));
            break;
    }
}

// 通用延迟激活面板的协程
private IEnumerator DelayedActivatePanel(GameObject targetPanel)
{
    // 等待2秒(受Time.timeScale影响,若需要不受时间缩放影响,改用WaitForSecondsRealtime(2))
    yield return new WaitForSeconds(2);
    // 等待结束后激活目标面板
    targetPanel.SetActive(true);
}

进阶:面板切换时先关闭其他面板

如果需要在打开新面板前先关闭已有面板,再延迟打开,可以修改协程如下:

public void OpenPanel(string name)
{
    // 先收集所有需要关闭的面板(根据你的实际面板列表调整)
    GameObject[] allPanels = new GameObject[] { MainMenuPanel.gameObject, LevelsPanel1.gameObject };

    switch (name)
    {
        case nameof(MainMenu):
            StartCoroutine(DelayedSwitchPanel(MainMenuPanel.gameObject, allPanels));
            break;
        case nameof(LevelsPanel):
            StartCoroutine(DelayedSwitchPanel(LevelsPanel1.gameObject, allPanels));
            break;
    }
}

private IEnumerator DelayedSwitchPanel(GameObject targetPanel, GameObject[] allPanels)
{
    // 先关闭所有面板
    foreach (var panel in allPanels)
    {
        panel.SetActive(false);
    }
    // 延迟2秒
    yield return new WaitForSeconds(2);
    // 激活目标面板
    targetPanel.SetActive(true);
}

注意事项

  • 确保挂载该脚本的GameObject始终处于激活状态,否则协程无法正常运行。
  • 如果你的游戏有暂停功能(Time.timeScale = 0),WaitForSeconds会停止计时,此时改用WaitForSecondsRealtime(2)可以不受时间缩放影响。

内容的提问来源于stack exchange,提问作者Smth_Unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:31:16