手册:碰撞检测与射线投射

本手册将详细介绍对象的碰撞检测(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 > Floor > Snap Length(吸附距离)属性长度,或所用升降平台对象的速度进行调整。

射线偏移(ray_offset):

可设置为浮点数值,用于指定射线生成时从边角起始的像素偏移量。

如前所述,判定区域始终为矩形,但碰撞体形状可能是胶囊形、多边形或多个碰撞体组合,未必是矩形。通过设置偏移量,可使射线检测更贴近实际碰撞体形状。

偏移值表示从每条边两端起算的像素数。

例如,边长24像素、射线数量为3时,射线分布如下图所示:

坐标空间(coord_space):

用于指定以何种坐标系为基准进行方向判定。主要影响对象在“旋转”状态下接触时的判定方式。

例如,一个旋转180度、上下颠倒的对象接触地面时,判定其接触的是“下方”还是“上方”?这取决于你的需求。

若希望判定“头部接触”,则需选择“上方”;若仅需简单判定“落地”,则“下方”更合适。

此外,还存在对象本身未旋转、仅碰撞体旋转的情况。

此判定可从以下三种坐标系中选择:Global(全局坐标)、Local is Game Object(游戏对象局部坐标)、Local is Collision(碰撞体局部坐标)。以下图示说明:

① 游戏对象本身旋转45度后接触地面时

② 游戏对象保持原位,仅碰撞体旋转90度后接触地面时

  1. Global(全局坐标,以游戏场景整体坐标系判定)
    以游戏对象原点与接触对象原点的全局坐标进行判定。旋转完全不被考虑,因此无论图①或图②,均判定为“下方”接触。

  2. Local is Game Object(以游戏对象局部坐标判定)
    以游戏对象的局部坐标系进行判定,仅考虑游戏对象自身的旋转。

    • 图①:判定为“右”与“下”接触。
    • 图②:判定为“下”接触。
  3. Local is Collision(以碰撞体局部坐标判定)
    以碰撞体的局部坐标系进行判定,仅考虑碰撞体自身的旋转。

    • 图①:判定为“右”与“下”接触。
    • 图②:判定为“右”接触。

虽然概念稍显复杂,但熟练掌握后,你将能按自己的需求定制精确的碰撞判定。