63 lines
1.6 KiB
GDScript
63 lines
1.6 KiB
GDScript
''' 此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
|