添加全新的Effect配置方式

This commit is contained in:
Reed 2026-01-09 12:47:13 +08:00
parent d296b96d9b
commit 864965b3de
29 changed files with 188 additions and 121 deletions

View File

@ -13,9 +13,9 @@
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="9_648qh"]
[ext_resource type="PackedScene" uid="uid://1l06de041i40" path="res://_levels/l_level_1.tscn" id="10_25twt"]
[ext_resource type="PackedScene" uid="uid://c3mievyfhx6ni" path="res://_props/coin/coin.tscn" id="11_1t0dx"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="12_fyfyw"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="12_fyfyw"]
[ext_resource type="Script" uid="uid://jeybblac0kg2" path="res://addons/reedscene/prop/ReedTransition.gd" id="13_8hwae"]
[ext_resource type="PackedScene" uid="uid://mi4omkkocmc0" path="res://_props/_prefabs/camera/scene_static_camera.tscn" id="14_s6kod"]
[ext_resource type="PackedScene" uid="uid://b0xmcb5i4jey" path="res://_props/_prefabs/camera/scene_static_camera.tscn" id="14_s6kod"]
[sub_resource type="Resource" id="Resource_s6kod"]
script = ExtResource("6_fyfyw")

View File

@ -13,9 +13,9 @@
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="9_meuxg"]
[ext_resource type="PackedScene" uid="uid://1l06de041i40" path="res://_levels/l_level_1.tscn" id="10_xs4uh"]
[ext_resource type="PackedScene" uid="uid://c3mievyfhx6ni" path="res://_props/coin/coin.tscn" id="11_61x7c"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="12_jhhb1"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="12_jhhb1"]
[ext_resource type="Script" uid="uid://jeybblac0kg2" path="res://addons/reedscene/prop/ReedTransition.gd" id="13_5navl"]
[ext_resource type="PackedScene" uid="uid://mi4omkkocmc0" path="res://_props/_prefabs/camera/scene_static_camera.tscn" id="14_5navl"]
[ext_resource type="PackedScene" uid="uid://b0xmcb5i4jey" path="res://_props/_prefabs/camera/scene_static_camera.tscn" id="14_5navl"]
[ext_resource type="Resource" uid="uid://bm0iyvgqfrqoj" path="res://_props/_prefabs/camera/change_room_tween.tres" id="15_meuxg"]
[ext_resource type="PackedScene" uid="uid://bonrls3iuhdqb" path="res://_props/_prefabs/player/player_trigger_volumn.tscn" id="17_tr4o2"]

View File

@ -12,7 +12,7 @@
[ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="8_ol4mv"]
[ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="9_y37js"]
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="10_p6otn"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="10_ufowh"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="10_ufowh"]
[sub_resource type="Resource" id="Resource_2ccxp"]
script = ExtResource("6_p6otn")

View File

@ -1,10 +1,19 @@
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=2 format=3 uid="uid://bjjxh7g7iosla"]
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=6 format=3 uid="uid://bjjxh7g7iosla"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="1_828o8"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="1_4meba"]
[ext_resource type="Script" uid="uid://bf1qlvdbf8qdp" path="res://addons/reedscene/prop/Effect/EAT_CallFunc.gd" id="1_qrdf4"]
[ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="2_3vtsp"]
[sub_resource type="Resource" id="Resource_hrmrk"]
script = ExtResource("1_qrdf4")
func_name = &"pop_camera"
metadata/_custom_type_script = "uid://bf1qlvdbf8qdp"
[sub_resource type="Resource" id="Resource_1l138"]
script = ExtResource("2_3vtsp")
[resource]
script = ExtResource("1_828o8")
effect_type = 1
value = null
func_name = &"pop_camera"
script = ExtResource("1_4meba")
effect_target_type = SubResource("Resource_1l138")
effect_apply_type = SubResource("Resource_hrmrk")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"

View File

@ -1,10 +1,19 @@
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=2 format=3 uid="uid://458r8rf7x02p"]
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=6 format=3 uid="uid://458r8rf7x02p"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="1_87nse"]
[ext_resource type="Script" uid="uid://bf1qlvdbf8qdp" path="res://addons/reedscene/prop/Effect/EAT_CallFunc.gd" id="1_lgnrf"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="2_lgnrf"]
[ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="2_uvouv"]
[sub_resource type="Resource" id="Resource_uvouv"]
script = ExtResource("1_lgnrf")
func_name = &"push_camera"
metadata/_custom_type_script = "uid://bf1qlvdbf8qdp"
[sub_resource type="Resource" id="Resource_23e2i"]
script = ExtResource("2_uvouv")
[resource]
script = ExtResource("1_87nse")
effect_type = 1
value = null
func_name = &"push_camera"
script = ExtResource("2_lgnrf")
effect_target_type = SubResource("Resource_23e2i")
effect_apply_type = SubResource("Resource_uvouv")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"

View File

@ -1,11 +1,20 @@
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=2 format=3 uid="uid://dd4df6yjkeifa"]
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=6 format=3 uid="uid://dd4df6yjkeifa"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="1_bxu3h"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="1_bxu3h"]
[ext_resource type="Script" uid="uid://bf1qlvdbf8qdp" path="res://addons/reedscene/prop/Effect/EAT_CallFunc.gd" id="1_y2h7j"]
[ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="2_5kgl2"]
[sub_resource type="Resource" id="Resource_u8qhm"]
script = ExtResource("1_y2h7j")
func_name = &"call_deferred"
func_args = [&"set_monitoring", false]
metadata/_custom_type_script = "uid://bf1qlvdbf8qdp"
[sub_resource type="Resource" id="Resource_j4eed"]
script = ExtResource("2_5kgl2")
[resource]
script = ExtResource("1_bxu3h")
effect_type = 1
value = null
func_name = &"set_defer"
func_args = [&"monitoring", false]
effect_target_type = SubResource("Resource_j4eed")
effect_apply_type = SubResource("Resource_u8qhm")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"

View File

@ -1,11 +1,20 @@
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=2 format=3 uid="uid://b6iglvt36pm55"]
[gd_resource type="Resource" script_class="ReedPropEffect" load_steps=6 format=3 uid="uid://b6iglvt36pm55"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="1_3md03"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="1_3md03"]
[ext_resource type="Script" uid="uid://bf1qlvdbf8qdp" path="res://addons/reedscene/prop/Effect/EAT_CallFunc.gd" id="1_uj0dv"]
[ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="2_ju8qu"]
[sub_resource type="Resource" id="Resource_uj0dv"]
script = ExtResource("1_uj0dv")
func_name = &"call_deferred"
func_args = [&"set_monitoring", true]
metadata/_custom_type_script = "uid://bf1qlvdbf8qdp"
[sub_resource type="Resource" id="Resource_14rqm"]
script = ExtResource("2_ju8qu")
[resource]
script = ExtResource("1_3md03")
effect_type = 1
value = null
func_name = &"set_defer"
func_args = [&"monitoring", true]
effect_target_type = SubResource("Resource_14rqm")
effect_apply_type = SubResource("Resource_uj0dv")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@
[ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="9_fdfto"]
[ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="10_uerbs"]
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="11_w12cs"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="12_fmhh5"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="12_fmhh5"]
[ext_resource type="Resource" uid="uid://bjjxh7g7iosla" path="res://_props/_camera/camera_anchor_disable.tres" id="13_qg43s"]
[ext_resource type="Resource" uid="uid://458r8rf7x02p" path="res://_props/_camera/camera_anchor_enable.tres" id="14_nnp13"]
[ext_resource type="PackedScene" uid="uid://bonrls3iuhdqb" path="res://_props/_prefabs/player/player_trigger_volumn.tscn" id="15_lg3ok"]
@ -80,10 +80,10 @@ script = ExtResource("7_8ou3l")
position = Vector2(540, -400)
use_blend = true
zoom = Vector2(0.75, 0.75)
limit_top = -335.0
limit_bottom = 240.0
limit_left = -427.0
limit_right = 427.0
limit_top = -335
limit_bottom = 240
limit_left = -427
limit_right = 427
follow_player = true
[node name="[Prop_0000]" type="Node" parent="Props/CameraAnchor"]

View File

@ -13,7 +13,7 @@
[ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="9_03jph"]
[ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="10_6tjqf"]
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="11_vl8fy"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="12_dqcx2"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="12_dqcx2"]
[ext_resource type="Resource" uid="uid://bjjxh7g7iosla" path="res://_props/_camera/camera_anchor_disable.tres" id="13_86ew5"]
[ext_resource type="Resource" uid="uid://458r8rf7x02p" path="res://_props/_camera/camera_anchor_enable.tres" id="14_vq1vg"]
[ext_resource type="PackedScene" uid="uid://bonrls3iuhdqb" path="res://_props/_prefabs/player/player_trigger_volumn.tscn" id="15_g6605"]

View File

@ -14,7 +14,7 @@
[ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="9_0dl6r"]
[ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="10_sv1n5"]
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="11_rvnvs"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/ReedPropEffect.gd" id="12_3jyxx"]
[ext_resource type="Script" uid="uid://cdvgq0xqdbagk" path="res://addons/reedscene/prop/Effect/ReedPropEffect.gd" id="12_3jyxx"]
[ext_resource type="Resource" uid="uid://bjjxh7g7iosla" path="res://_props/_camera/camera_anchor_disable.tres" id="13_83bna"]
[ext_resource type="Resource" uid="uid://458r8rf7x02p" path="res://_props/_camera/camera_anchor_enable.tres" id="14_chfvl"]
[ext_resource type="PackedScene" uid="uid://bonrls3iuhdqb" path="res://_props/_prefabs/player/player_trigger_volumn.tscn" id="15_va12w"]
@ -82,6 +82,11 @@ script = ExtResource("5_qtvqv")
[node name="CameraAnchor" parent="Props" instance=ExtResource("8_6bhoi")]
position = Vector2(1277, -906)
use_blend = true
limit_top = -10000000
limit_bottom = 10000000
limit_left = -10000000
limit_right = 10000000
[node name="[Prop_0000]" type="Node" parent="Props/CameraAnchor"]
script = ExtResource("9_0dl6r")

View File

@ -4,9 +4,4 @@
[node name="CameraAnchor" type="Node2D"]
script = ExtResource("1_dhu66")
use_blend = null
use_camera_limit = true
limit_top = -10000000.0
limit_bottom = 10000000.0
limit_left = -10000000.0
limit_right = 10000000.0

View File

@ -0,0 +1,9 @@
class_name EAT_CallFunc extends EffectApplyType
@export var func_name: StringName
@export var func_args: Array[Variant] = []
func apply(target: Object) -> void:
if target.has_method(func_name):
target.callv(func_name,func_args)

View File

@ -0,0 +1 @@
uid://bf1qlvdbf8qdp

View File

@ -0,0 +1,7 @@
class_name EAT_SetValue extends EffectApplyType
@export var property_name: StringName
@export var value: Variant
func apply(target: Object) -> void:
target.set(property_name, value)

View File

@ -0,0 +1 @@
uid://dhqvx7xi5bydi

View File

@ -0,0 +1,8 @@
class_name ETT_Child extends EffectTargetType
@export var child_node_name: StringName
@export var recursive_found: bool
@export var owned_node_only: bool
func get_effect_target(owner: Node, prop_comp: Node) -> Object:
return owner.find_child(child_node_name,recursive_found,owned_node_only)

View File

@ -0,0 +1 @@
uid://xy63puo73qwo

View File

@ -0,0 +1,6 @@
class_name ETT_NodePath extends EffectTargetType
@export var target_node_path: NodePath
func get_effect_target(owner: Node, prop_comp: Node) -> Object:
return owner.get_node_or_null(target_node_path)

View File

@ -0,0 +1 @@
uid://c7q1ikmlfg0x8

View File

@ -0,0 +1,7 @@
class_name ETT_Owner extends EffectTargetType
func get_effect_target(owner: Node, prop_comp: Node) -> Object:
if owner:
return owner
return null

View File

@ -0,0 +1 @@
uid://8cqs3i8sr8b1

View File

@ -0,0 +1,5 @@
@abstract
class_name EffectApplyType extends Resource
@abstract
func apply(target: Object) -> void

View File

@ -0,0 +1 @@
uid://5w8doxmunmsa

View File

@ -0,0 +1,6 @@
@abstract
class_name EffectTargetType extends Resource
## 子脚本必须重写用来返回作用的对象的reference
@abstract
func get_effect_target(owner: Node, prop_comp: Node) -> Object

View File

@ -0,0 +1 @@
uid://bbggu2hn42cck

View File

@ -0,0 +1,31 @@
''' 此Resource定义了一系列的Prop可能需要的预设的简单Effect如果有更复杂的需求应该重写State的OnEnter
'''
@tool
@icon("uid://cw1yyc4oeph85")
extends Resource
class_name ReedPropEffect
##用来选择Effect作用的对象
@export var effect_target_type: EffectTargetType = ETT_Owner.new()
##用来选择Effect作用的具体效果
@export var effect_apply_type: EffectApplyType = EAT_SetValue.new()
## 运行时缓存
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
if not effect_apply_type:
return
effect_apply_type.apply(target)
##获取到组件或对象
func _resolve_target(owner: Node, prop_comp: Node) -> Object:
if effect_target_type == null:
return null
return effect_target_type.get_effect_target(owner,prop_comp)

View File

@ -1,71 +0,0 @@
''' 此Resource定义了一系列的Prop可能需要的预设的简单Effect如果有更复杂的需求应该重写State的OnEnter
'''
@tool
@icon("uid://cw1yyc4oeph85")
extends Resource
class_name ReedPropEffect
enum TargetType {
OWNER,
ChildNode,
NODE_PATH
}
enum EffectType {
SET_VALUE,
CALL_FUNC
}
##作用目标的类型默认为PropComp的拥有者
@export var target_type: TargetType = TargetType.OWNER
##如果选择了NodePath则会读取此字段默认不读取
@export var target_path: NodePath
##如果选择了ChildNode则会读取此字段默认不读取
@export var child_node_name: StringName
##如果选择了ChildNode则会读取此字段是否要递归的查找某个子节点
@export var recursive_found: bool = false
##如果选择了ChildNode则会读取此字段只检查该scene的子节点而忽略其他的外部添加的子节点
@export var owned_node_only: bool = true
##作用的具体效果类别,默认为设置某个数值
@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:
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.ChildNode:
if owner:
return owner.find_child(child_node_name,recursive_found,owned_node_only)
TargetType.NODE_PATH:
if owner:
return owner.get_node_or_null(target_path)
return null