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
相关产品推荐
相关产品推荐

