ACTION GAME MAKERの衝突レイヤーシステムは、Godotのものをそのまま利用しています。
うまく活用することで様々な設定が可能です。
衝突の設定場所
壁判定
-
GameObject: CollisionObject2D>Collision
-
タイル: TileMapLayer>タイル設定(TileSet)>PhysicsLayers
攻撃判定
- AttackArea2D: CollisionObject2D>Collision
当たり判定
- HitArea2D: CollisionObject2D>Collision
Collision LayerとCollision Mask
Collision Layerはオブジェクトやタイルが自分がどのレイヤーに属しているか。
Collision Maskはオブジェクトやタイルが自分がどのレイヤーと衝突したいか。
となります。
コリジョンレイヤー名の整理
コリジョンレイヤーにはプロジェクト設定>一般>Layer Names>2D物理で名前をつけることができます。
設定後はレイヤー番号の上にカーソルを合わせると名前を確認することができます。
グループや属性判定との順番
- 衝突処理(Collision Layer/Collision Mask)
- グループ/属性処理
の順で判定が行われます。
そのため、衝突しないオブジェクト同士やタイルとはグループ/属性処理が行われません。
押し出されないオブジェクト
CollisionMaskは一方的なもののため
オブジェクトAがレイヤー1に所属し、マスクが1のみ
オブジェクトBがレイヤー2に所属し、マスクが1,2の場合。
オブジェクトAはオブジェクトBと接触を認識できないが、オブジェクトBはオブジェクトAに接触を認識できるという設定も可能です。
この場合、オブジェクトAはオブジェクトBを押すことができますが、オブジェクトBはオブジェクトAを押すことができません。
これがなぜかというと、少しむずかしい概念になりますが。
オブジェクトAはオブジェクトBとの衝突を認識できません・・・が、実際としてオブジェクトAは移動しているので、オブジェクトBはそのまま押されてしまいます。
一方、オブジェクトBはオブジェクトAとの衝突を認識しているので、オブジェクトAを押す処理を行います・・・が、オブジェクトAはBを認識していないためいくら押しても1pxも移動しません。
乗れる動くプラットフォーム
前述の特性を利用し、乗れる足場側のマスク設定を何も無い状態にすると、何にぶつかってもズレない押し出しに対して無敵の足場ができます。