Unity因疑似无限循环崩溃,求排查随机数生成器代码问题
0-29随机数选取器的无限循环问题修复与规则实现
问题根源
你的代码直接导致Unity卡死的原因有三个:
- 外层循环永远无法终止:
ENDINGVAR初始设为0,循环条件ENDINGVAR < 30,但整个循环里没有任何代码更新ENDINGVAR的值,这个while会无限跑下去。 - 数组初始化不完整:
ews30是长度30的数组,但初始化循环只遍历到索引28(i < ews30.Length -1),最后一个元素ews30[29]保留默认值0。当随机到0时,会被误判为已存在,内层循环会一直找不到可用数字。 - 随机数范围错误:
random.Next(0,29)是左闭右开区间,只能生成0-28的数字,永远选不到29。
另外原代码也没实现「选中17后需等所有其他数字选完才能再选」的规则,只是单纯做了一轮不重复选取。
修复并实现规则的代码
下面的代码用集合管理数字,既解决无限循环问题,又满足特殊数字的选取规则:
using System.Collections.Generic; using UnityEngine; public class NumberPicker : MonoBehaviour { // 设定特殊数字,这里以17为例 private readonly int _specialNum = 17; // 存储当前可用的普通数字(排除特殊数字) private List<int> _availableNums = new List<int>(); // 暂存已使用的普通数字,用于一轮选完后重置 private List<int> _usedNums = new List<int>(); // 标记特殊数字是否可被选取 private bool _canPickSpecial = true; private System.Random _random = new System.Random(); void Start() { // 初始化普通数字池:0-29除了17 for (int i = 0; i < 30; i++) { if (i != _specialNum) _availableNums.Add(i); } } // 获取下一个符合规则的随机数 public int GetNextNumber() { int selected = -1; // 满足条件时随机选择特殊数字 if (_canPickSpecial && _availableNums.Count > 0 && _random.Next(2) == 0) { selected = _specialNum; // 选完特殊数字后,需等普通数字一轮选完才能再选 _canPickSpecial = false; } else { // 从可用普通数字中随机选一个 int randIndex = _random.Next(_availableNums.Count); selected = _availableNums[randIndex]; // 移到已使用列表 _usedNums.Add(selected); _availableNums.RemoveAt(randIndex); // 普通数字一轮选完,重置可用池并允许再次选特殊数字 if (_availableNums.Count == 0) { _availableNums.AddRange(_usedNums); _usedNums.Clear(); _canPickSpecial = true; } } return selected; } // 测试:按空格获取随机数并打印 void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("选中数字:" + GetNextNumber()); } } }
代码说明
- 用
List替代数组管理数字,避免初始化和遍历的错误,逻辑更清晰。 - 特殊数字17被选中后,会锁定到普通数字全部选完一轮(可用池重置),才允许再次被选取。
- 随机数范围根据可用数字数量动态调整,不会出现漏选或误判的情况。
- 去掉了原代码中无意义的循环变量,从根源上避免无限循环。
内容的提问来源于stack exchange,提问作者hpethera
相关产品推荐
相关产品推荐

