目前,我已修改或删除了只读 VariableSettings 节点中的 taken_damage/value,现在在制作伤害显示数字时遇到了困难。
我按照教程创建了一个简单的 Label,可以读取自身 VariableSettings 节点的 taken_damage/value,但目前面临两个问题:
- 不知道如何跨对象读取另一个对象的 VariableSettings 节点中的 taken_damage/value。
- 不清楚如何设置触发条件。
恳请赐教!
以下是当前代码:
extends Node2D
@onready var label: Label = $Label
@onready var variable_settings = $"VariableSettings" # 假设 VariableSettings 是父节点中的同级节点
var position_tween: Tween
var scale_tween: Tween
var fade_tween: Tween
func _ready() -> void:
scale = Vector2.ZERO
# 从 VariableSettings 节点获取 taken_damage/value 值
var damage_amount = variable_settings.get("taken_damage/value")
display_damage_text(damage_amount)
func display_damage_text(damage_amount: float) -> void:
# 清除可能存在的旧动画
if position_tween != null and position_tween.is_valid():
position_tween.kill()
if scale_tween != null and scale_tween.is_valid():
scale_tween.kill()
# 设置伤害文本
label.text = str(damage_amount)
label.modulate = Color.WHITE # 重置透明度
# 生成随机偏移量(X方向-10到10像素,Y方向不变)
var random_offset = Vector2(randf_range(-10, 10), 0)
# 创建所有动画
position_tween = create_tween().set_parallel(false) # 串行动画
scale_tween = create_tween().set_parallel(false)
fade_tween = create_tween()
# 第一阶段:弹出效果(缩放+上移+随机偏移)
scale_tween.tween_property(self, "scale", Vector2.ONE, 0.2)
position_tween.tween_property(
self, "global_position",
global_position + Vector2.UP * 16 + random_offset,
0.3
)
# 第二阶段:继续上移+渐隐
position_tween.tween_property(
self, "global_position",
global_position + Vector2.UP * 40 + random_offset,
0.3
)
fade_tween.tween_property(label, "modulate:a", 0.0, 0.4) # 透明度降到0
# 第三阶段:缩小(与渐隐同步)
scale_tween.tween_property(self, "scale", Vector2.ZERO, 0.4)
解答建议:
1. 跨对象读取另一个对象的 VariableSettings 节点的 taken_damage/value
你需要通过引用或信号机制获取其他对象的 VariableSettings 节点。例如:
-
方法一:通过路径引用
# 假设你要读取的另一个对象路径为 "Enemy/VariableSettings" var enemy_var_settings = get_node("Enemy/VariableSettings") var enemy_damage = enemy_var_settings.get("taken_damage/value") -
方法二:通过信号传递
在伤害发生时,从目标对象发出信号,传递伤害值:# 在目标对象中(如 Enemy.gd) signal damage_taken(amount) func take_damage(amount: float): # 更新自身变量 $VariableSettings.set("taken_damage/value", amount) # 发出信号 emit_signal("damage_taken", amount) # 在显示伤害的脚本中连接信号 func _ready(): var enemy = get_node("Enemy") enemy.connect("damage_taken", Callable(self, "display_damage_text"))
2. 设置触发条件
你当前的代码在 _ready() 中执行,意味着只在节点初始化时运行一次。你需要在伤害发生时触发显示。
-
推荐做法:使用信号或函数调用
# 在伤害发生时调用 display_damage_text func on_damage_taken(damage_amount: float): display_damage_text(damage_amount)然后在伤害逻辑中调用:
# 例如在敌人被击中时 on_damage_taken(50.0)
总结:
- 使用
get_node()或信号机制跨对象读取数据。 - 不要在
_ready()中直接读取伤害值,而应在伤害事件发生时触发显示。 - 通过信号或函数调用确保伤害显示与实际伤害事件同步。
希望这些建议能帮助你解决问题!