手册:碰撞检测和射线检测设置

本节详细说明了在 ACTION GAME MAKER 中,对象墙体碰撞(CollisionShape2D) 如何与 瓦片墙其他对象碰撞 交互,以及如何精确配置它们。


墙体碰撞与射线检测行为概述

ACTION GAME MAKER 中,墙体碰撞检测通过根据对象的 CollisionShape2D 大小生成一个 矩形碰撞区域 来实现。
从该矩形的四条边向外发射 射线(Ray) ——这些是用于基于法线的碰撞检测的不可见检测线。

射线 可以理解为以固定间隔发射的不可见“子弹”。当其中一条射线接触到另一个墙体碰撞器或瓦片时,系统会将其识别为 碰撞
这种检测方法称为 射线检测(Raycast)


射线检测配置

射线检测参数可在以下条件中调整:

  • “对象墙体碰撞”
  • “瓦片碰撞”
  • “斜坡瓦片碰撞”

射线数量(ray_number

此参数为整数,决定在检测区域每条边上发射多少条射线。
射线在边的长度上 均匀分布

例如,若一边长 24 像素

  • 使用 3 条射线,则每 12 像素 一条。
  • 使用 4 条射线,则每 8 像素 一条。

射线数量越多,检测精度越高,
但也会增加处理负载——请注意性能影响。


检测方法(detect_method

可选择 Any(任意)All(全部)

  • Any:只要 至少一条 射线接触,即视为碰撞。
  • All仅当所有 射线均接触时,才视为碰撞。

例如,仅在角落接触时:

  • Any → “检测到碰撞。”
  • All → “未检测到碰撞。”

射线长度(ray_length

这是一个 浮点数,决定每条射线的 延伸距离(以像素为单位)
换句话说,它定义了对象在 多远距离内 仍能检测到碰撞。

这对 垂直移动 的对象(如 电梯或升降平台)尤为重要。
例如,当电梯下降时,角色位置可能在某一帧暂时与平台分离。
若射线长度过短,系统可能误判为 无接触

但若射线过长,可能导致系统在对象 实际未接触 时仍检测到碰撞。
建议根据以下参数调整:

  • GameObject > CharacterBody2D > FloorSnap Length 值,或
  • 所用移动平台的 速度

射线偏移(ray_offset

这是一个 浮点数,定义射线从各角点开始的 偏移距离

如前所述,碰撞检测区域 始终为矩形
但实际碰撞器可能是 胶囊体、多边形或多个形状组合
使用 偏移量 可使射线更贴合碰撞器的真实形状。

偏移值以 每条边两端起算的像素数 为单位。
例如,若一边长 24 像素 且发射 3 条射线,布局如下:


坐标空间(coord_space

此设置决定用于解释碰撞方向的 坐标空间

当对象 旋转 时尤其有用,因为它会改变接触方向的判定方式。
例如:

  • 若一个旋转 180° 的对象接触地面,应视为接触 底部 还是 顶部
  • 若需检测 头部碰撞,可能希望判定为“顶部”。
  • 若检查 地面接触,则应判定为“底部”。

有时 仅碰撞器旋转,而对象整体未旋转。

可选择三种坐标模式:
Global(全局)Local is Game Object(对象局部)Local is Collision(碰撞器局部)
我们来看两个例子:

① 当整个 GameObject 旋转 45° 并接触地面时:


② 当仅碰撞器旋转 90°,而 GameObject 未旋转时:


  1. Global(全局坐标空间)
    检测基于 GameObject 与目标碰撞器的 世界坐标
    不考虑旋转,因此案例①和②均被检测为接触 底部

  2. Local is Game Object(对象局部空间)
    检测基于 GameObject 的局部旋转

  • 案例①:检测为接触 右侧底部
  • 案例②:检测为接触 底部
  1. Local is Collision(碰撞器局部空间)
    检测仅基于 碰撞器自身的旋转
  • 案例①:检测为接触 右侧底部
  • 案例②:检测为接触 右侧

这乍看可能较复杂,
但掌握这些设置后,您即可构建 精确且灵活的碰撞行为,完美匹配您游戏的独特机制。

1 个赞