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

Godot Engine中如何通过代码动态判断导出枚举Flags的选中状态?

在Godot中动态判断FLAGS枚举的选中项

要实现对任意大小FLAGS枚举的动态判断,无需硬编码,可利用GDScript的反射API获取枚举信息,结合位运算完成检测。

步骤1:确保枚举成员为2的幂次(FLAGS必备)

首先,FLAGS枚举的每个成员值必须是2的幂次(1、2、4、8...),这样位运算才能正确区分多个选中项。修正你的枚举定义:

enum eTextMode {
    CHAR = 1 << 0,        # 对应数值1
    NUMBER = 1 << 1,      # 对应数值2
    SYMBOLS_TEXT = 1 << 2,# 对应数值4
    SYMBOLS_ALL = 1 << 3  # 对应数值8
}

注:如果使用默认的连续数值(0、1、2、3),位运算会出现冲突,无法正确识别多选项。

步骤2:动态获取所有选中的枚举项

通过get_script().get_enum_dict()获取枚举的名称-值映射,遍历判断每个成员是否被选中:

export(eTextMode, FLAGS) var _id: int = 0

func get_selected_modes() -> Array:
    var selected_modes = []
    # 获取当前脚本中eTextMode枚举的键值对
    var enum_dict = get_script().get_enum_dict("eTextMode")
    
    for mode_name in enum_dict:
        var mode_value = enum_dict[mode_name]
        # 位与运算判断该选项是否被选中
        if _id & mode_value:
            selected_modes.append(mode_name)
    
    return selected_modes

调用这个函数会返回所有选中的枚举名称数组,比如选中NUMBER和SYMBOLS_TEXT时,返回["NUMBER", "SYMBOLS_TEXT"]。

步骤3:单独判断某个枚举项是否被选中

如果只需检测特定选项,可写一个通用函数适配任意枚举:

func is_flag_selected(enum_name: String, flag_name: String) -> bool:
    var enum_dict = get_script().get_enum_dict(enum_name)
    # 先检查枚举和成员是否存在
    if not enum_dict.has(flag_name):
        return false
    # 位与运算验证
    return (_id & enum_dict[flag_name]) != 0

使用示例:

if is_flag_selected("eTextMode", "NUMBER"):
    print("NUMBER选项已选中")

这种方式完全依赖枚举的定义动态生成判断逻辑,不管枚举新增或删除成员,代码都无需修改,完美适配任意大小的FLAGS枚举。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:40:31