本手册将详细介绍对象的碰撞检测(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度后接触地面时
-
Global(全局坐标,以游戏场景整体坐标系判定)
以游戏对象原点与接触对象原点的全局坐标进行判定。旋转完全不被考虑,因此无论图①或图②,均判定为“下方”接触。 -
Local is Game Object(以游戏对象局部坐标判定)
以游戏对象的局部坐标系进行判定,仅考虑游戏对象自身的旋转。- 图①:判定为“右”与“下”接触。
- 图②:判定为“下”接触。
-
Local is Collision(以碰撞体局部坐标判定)
以碰撞体的局部坐标系进行判定,仅考虑碰撞体自身的旋转。- 图①:判定为“右”与“下”接触。
- 图②:判定为“右”接触。
虽然概念稍显复杂,但熟练掌握后,你将能按自己的需求定制精确的碰撞判定。





