You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:03