''' 此Resource定义了一系列的Prop可能需要的预设的简单Effect,如果有更复杂的需求,应该重写State的OnEnter ''' @tool @icon("uid://cw1yyc4oeph85") extends Resource class_name ReedPropEffect enum TargetType { OWNER, NODE_PATH } enum EffectType { SET_VALUE, CALL_FUNC } ##作用目标的类型,默认为PropComp的拥有者 @export var target_type: TargetType = TargetType.OWNER ##如果选择了NodePath,则会读取此字段,默认不读取 @export var target_path: NodePath ##作用的具体效果类别,默认为设置某个数值 @export var effect_type: EffectType = EffectType.SET_VALUE ## SetValue 用 @export var property_name: StringName @export var value: Variant ## CallFunc 用 @export var func_name: StringName @export var func_args: Array[Variant] = [] ## 是否在退出 state 时恢复 @export var restore_on_exit: bool = false ## 运行时缓存 var _cached_old_value: Variant ##应用效果 func apply(owner: Node, prop_comp: Node, ctx: Dictionary) -> void: var target := _resolve_target(owner, prop_comp) if target == null: return match effect_type: EffectType.SET_VALUE: # 你也可以加 has_property 检查,但 Godot 没有统一 API,这里先直接 set target.set(property_name, value) EffectType.CALL_FUNC: if target.has_method(func_name): target.callv(func_name, func_args) ##获取到组件或对象 func _resolve_target(owner: Node, prop_comp: Node) -> Object: match target_type: TargetType.OWNER: return owner TargetType.NODE_PATH: if owner: return owner.get_node_or_null(target_path) return null