Unity中如何通过索引随机切换Enum枚举值?
问题分析与解决
问题根源
你用Random.Range(0,2)的时候,Unity的这个方法是左闭右开的——意思是生成的随机数包含0,但不包含2,所以只会得到0(Morning)或1(Afternoon),永远碰不到2(Evening)。如果当前day已经是Morning/Afternoon,再生成相同的值时,AdjustDay的set方法里value != day条件不成立,就不会执行赋值和打印,看起来像是“没生效”。
正确实现方式
要覆盖枚举的所有三个值,你需要让随机数范围包含0、1、2,同时还要保证代码能适配枚举后续的修改(比如加新的时间段),推荐两种写法:
写法1:通过枚举长度生成索引
先获取枚举的总长度,再生成对应范围的随机数:
[ContextMenu("RandomDay")] void RandomDay() { // 获取枚举的总元素数量 int dayCount = Enum.GetValues(typeof(Day)).Length; // 生成0到dayCount之间的随机数(左闭右开,刚好覆盖0到dayCount-1的索引) AdjustDay = (Day)Random.Range(0, dayCount); }
写法2:直接随机取枚举元素(更直观)
直接把枚举转成数组,随机取其中的元素:
[ContextMenu("RandomDay")] void RandomDay() { Day[] allDays = (Day[])Enum.GetValues(typeof(Day)); AdjustDay = allDays[Random.Range(0, allDays.Length)]; }
额外优化(可选)
如果需要严格基于枚举的MinValue和MaxValue来生成范围(比如枚举不是从0开始的情况),可以这么写:
[ContextMenu("RandomDay")] void RandomDay() { int min = (int)Enum.GetValues(typeof(Day)).GetValue(0); int max = (int)Enum.GetValues(typeof(Day)).GetValue(Enum.GetValues(typeof(Day)).Length - 1); // 注意这里要用Random.Range(min, max + 1),因为要包含max AdjustDay = (Day)Random.Range(min, max + 1); }
内容的提问来源于stack exchange,提问作者aron kan
相关产品推荐
相关产品推荐

