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

