Godot 4.1.2启动时body_entered重复触发问题求助
解决Godot 4.1.2中Area3D启动时重复触发body_entered的问题
可能的原因
- 玩家出生位置与Area3D初始重叠,物理引擎在初始化阶段会多次触发重叠检测信号
- 玩家的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
相关产品推荐
相关产品推荐

