「删除或修改只读 VariableSettings 节点的 taken_damage/value 后,如何制作伤害显示数字」//「求助:修改/删除只读 VariableSettings 节点的 taken_damage/value 后,如何创建伤害显示数字」//变量改变删除了伤害受到伤害变量怎么制作伤害显示

目前,我已修改或删除了只读 VariableSettings 节点中的 taken_damage/value,现在在制作伤害显示数字时遇到了困难。
我按照教程创建了一个简单的 Label,可以读取自身 VariableSettings 节点的 taken_damage/value,但目前面临两个问题:

  1. 不知道如何跨对象读取另一个对象的 VariableSettings 节点中的 taken_damage/value。
  2. 不清楚如何设置触发条件。

恳请赐教!


以下是当前代码:

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() 中直接读取伤害值,而应在伤害事件发生时触发显示。
  • 通过信号或函数调用确保伤害显示与实际伤害事件同步。

希望这些建议能帮助你解决问题!