Godot 2D平台游戏玩家与敌人碰撞检测失效问题求助
问题:2D平台游戏玩家与敌人碰撞仅在移动时触发
我正在开发一款简单的2D平台游戏,遇到了碰撞检测问题:只有玩家移动时,才能检测到与敌人(电锯)的碰撞并打印“Enemy”,玩家静止时完全无法触发检测。
我当前使用的碰撞检测代码如下:
func _physics_process(delta: float) -> void: velocity = move_and_slide(velocity, Vector2.UP) for i in get_slide_count(): var collision = get_slide_collision(i) if collision.collider.is_in_group("Enemy"): print("Enemy")
相关文件:
- 玩家脚本:Player.gd
- 项目仓库:Bitbucket仓库
解决方法
1. 替换检测逻辑:用重叠检测替代滑动碰撞
move_and_slide的get_slide_count()只记录位移过程中产生的滑动碰撞,静止时没有位移就不会触发。改用get_overlapping_bodies()可以检测当前所有与玩家碰撞体重叠的物体,无论是否移动:
func _physics_process(delta: float) -> void: velocity = move_and_slide(velocity, Vector2.UP) # 检测所有重叠的敌人,包括静止状态 for body in get_overlapping_bodies(): if body.is_in_group("Enemy"): print("Enemy")
2. 使用Area2D信号(更优雅的方式)
给玩家或敌人添加Area2D节点,利用Godot内置的碰撞信号来监听:
- 给玩家的碰撞体添加
Area2D节点,设置好碰撞层和掩码(确保能检测到Enemy组) - 连接
Area2D的body_entered和body_exited信号到玩家脚本 - 在回调函数中处理碰撞:
func _on_body_entered(body: Node2D) -> void: if body.is_in_group("Enemy"): print("Enemy") func _on_body_exited(body: Node2D) -> void: if body.is_in_group("Enemy"): print("Left Enemy")
3. 检查碰撞层与掩码配置
确认玩家和敌人的碰撞体:
- 碰撞层和掩码相互匹配(比如玩家掩码勾选敌人的碰撞层,敌人掩码勾选玩家的碰撞层)
- 碰撞体类型设置正确(KinematicBody2D和StaticBody2D/RigidBody2D的交互需要符合预期)
内容的提问来源于stack exchange,提问作者Flavio Silva
相关产品推荐
相关产品推荐

