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

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内置的碰撞信号来监听:

  1. 给玩家的碰撞体添加Area2D节点,设置好碰撞层和掩码(确保能检测到Enemy组)
  2. 连接Area2D的body_entered和body_exited信号到玩家脚本
  3. 在回调函数中处理碰撞:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:24