如何让Area2D持续监测物理体进入状态 解决仅触发一次的问题
Area2D 持续监测物理体方案
你的代码仅监听了body_entered进入信号,没有监听物理体离开区域的body_exited信号,导致状态无法正确重置。可按照以下方案修改:
方案1:单目标场景适用(仅存在1个Hero)
首先在Area2D的信号面板中,将body_exited信号绑定到当前脚本,再修改代码如下:
var hp = 10 var hero_in_me = false # 伤害间隔,单位:秒,可根据需求调整,此处设置为每秒扣1点血 var damage_interval = 1.0 var timer = 0.0 func _physics_process(delta): if hero_in_me: timer += delta if timer >= damage_interval: hp -= 1 print(hp) timer = 0.0 func _on_Area2D_body_entered(body): if body.name == "Hero": hero_in_me = true timer = 0.0 # 新增离开事件处理 func _on_Area2D_body_exited(body): if body.name == "Hero": hero_in_me = false
方案2:多目标场景适用(可能存在多个Hero重叠)
使用计数法避免多物体重叠时状态判断错误:
var hp = 10 var hero_in_area_count = 0 var damage_interval = 1.0 var timer = 0.0 func _physics_process(delta): if hero_in_area_count > 0: timer += delta if timer >= damage_interval: hp -= 1 print(hp) timer = 0.0 func _on_Area2D_body_entered(body): if body.name == "Hero": hero_in_area_count += 1 func _on_Area2D_body_exited(body): if body.name == "Hero": hero_in_area_count -= 1 # 异常防护,避免计数出现负数 hero_in_area_count = max(hero_in_area_count, 0)
注意事项
- 必须完成
body_exited信号的绑定,否则离开事件不会触发 - 可通过Area2D的碰撞掩码提前过滤不需要检测的物理层,减少不必要的性能消耗
- 不需要间隔伤害可以删除计时器相关代码,直接在判断条件内执行逻辑即可
内容的提问来源于stack exchange,提问作者NoNaMe
相关产品推荐
相关产品推荐

