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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:25:53