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

Unity中循环切换窗口时出现IndexOutOfRange错误的解决求助

解决Unity中IndexOutOfRange错误与UI窗口循环切换问题

错误根源

你的代码触发IndexOutOfRangeException的核心原因是:当切换到数组最后一个窗口时,currentWindow++会让索引值超出windows数组的有效范围(数组索引从0开始,最大索引为windows.Length - 1),此时访问windows[currentWindow]自然会报错。另外原ToggleWindow方法的逻辑也存在问题——它同时切换当前窗口和下一个窗口的激活状态,这会导致窗口状态混乱,不符合循环切换的需求。

修复方案

核心思路

  • 关闭当前激活的窗口
  • 使用取模运算计算下一个窗口的索引,实现循环(当索引到达数组末尾时自动回到开头)
  • 激活新的窗口

修正后的代码

int currentWindow = 0;

public GameObject theUI;
public GameObject[] windows;

void Update()
{
    // 切换菜单显示/隐藏
    if (Input.GetKeyDown(KeyCode.Escape))
    {
        if (theUI.activeInHierarchy)
        {
            theUI.SetActive(false);
        }
        else
        {
            theUI.SetActive(true);
            // 确保只有第一个窗口激活
            ResetAllWindows();
            windows[0].SetActive(true);
            currentWindow = 0;
            Refresh();
        }
    }

    // 循环切换窗口
    if (theUI.activeInHierarchy && Input.GetKeyDown(KeyCode.Tab))
    {
        ToggleToNextWindow();
    }
}

// 切换到下一个窗口的方法
public void ToggleToNextWindow()
{
    // 先判断数组是否为空,避免空引用错误
    if (windows == null || windows.Length == 0) return;

    // 关闭当前窗口
    windows[currentWindow].SetActive(false);
    
    // 计算下一个窗口索引,取模实现循环
    currentWindow = (currentWindow + 1) % windows.Length;
    
    // 激活下一个窗口
    windows[currentWindow].SetActive(true);
    Refresh();
}

// 重置所有窗口为未激活状态
private void ResetAllWindows()
{
    foreach (var window in windows)
    {
        if(window != null)
            window.SetActive(false);
    }
}

关键代码解释

  • currentWindow = (currentWindow + 1) % windows.Length;:取模运算保证索引永远在0到windows.Length - 1的范围内。比如数组长度为3,当currentWindow是2(最后一个索引)时,(2+1)%3=0,自动回到第一个窗口。
  • ResetAllWindows方法:在打开UI时重置所有窗口状态,避免多个窗口同时激活的问题。
  • 原ToggleWindow方法被替换为ToggleToNextWindow,逻辑更清晰,专注于切换到下一个窗口的单一功能。

额外注意事项

  • 确保在Inspector面板中给windows数组赋值,且数组元素不为空,否则可能触发空引用错误。
  • 如果需要支持反向切换(比如Shift+Tab),可以用currentWindow = (currentWindow - 1 + windows.Length) % windows.Length;来实现,加windows.Length是为了避免索引为负数的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17