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

Godot 4.1.2启动时body_entered重复触发问题求助

解决Godot 4.1.2中Area3D启动时重复触发body_entered的问题

可能的原因

  1. 玩家出生位置与Area3D初始重叠,物理引擎在初始化阶段会多次触发重叠检测信号
  2. 玩家的CharacterBody3D节点下挂载了多个CollisionShape3D/CollisionPolygon3D,每个碰撞体进入区域都会独立触发一次body_entered信号

解决方案

方案1:过滤初始重叠的物体

通过在_ready()中记录初始就和区域重叠的物体,后续触发信号时跳过这些物体:

extends Area3D

signal door
var initial_overlapping_bodies = []

func _ready():
    # 记录初始化时就与区域重叠的所有物体
    initial_overlapping_bodies = get_overlapping_bodies()

func _on_body_entered(body):
    # 跳过初始重叠的物体,避免启动时误触发
    if body in initial_overlapping_bodies:
        initial_overlapping_bodies.erase(body)
        return
    
    if body is CharacterBody3D:
        door.emit()

方案2:添加初始化延迟

等待物理引擎完成初始化后再响应信号,避免启动阶段的误触发:

extends Area3D

signal door
var is_ready = false

func _ready():
    # 等待1帧确保物理初始化完成
    await get_tree().process_frame
    is_ready = true

func _on_body_entered(body):
    if not is_ready:
        return
    
    if body is CharacterBody3D:
        door.emit()

方案3:防止短时间重复触发

如果是多碰撞体导致的多次触发,可以添加一个锁机制,避免短时间内重复发射信号:

extends Area3D

signal door
var is_triggering = false

func _on_body_entered(body):
    if is_triggering:
        return
    
    if body is CharacterBody3D:
        is_triggering = true
        door.emit()
        # 0.5秒后解锁,可根据需求调整时长
        await get_tree().create_timer(0.5).timeout
        is_triggering = false

内容的提问来源于stack exchange,提问作者7ven Perks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:52:44