Altseed2では物理演算を用いて,2Dの衝突判定を行う機構が備わっています。
Colliderクラスは自身のメンバの情報をもとに他Colliderのインスタンスとの衝突の有無を判定します。
Colliderと衝突判定の種類は以下の通りです。
Collider | 衝突判定のタイプ | 使用するメンバ |
---|---|---|
CircleCollider | 円形 | 中心,半径 |
PolygonCollider | 多角形 | 各頂点の座標 |
RectangleCollider | 短形 | 左上の座標,サイズ(縦・横) |
EdgeCollider | 線分 | 端点1,端点2 |
Colliderとの衝突判定はGetIsCollidedWith(Collider)メソッドを使用します。
指定したコライダと衝突していたらtrue,衝突していなかったらfalseを返します。
この2つのクラスによって,コライダの衝突判定を自動で行う事が出来ます。
このクラスはColliderクラスを内部に持っています。
また,この派生クラスにCircleColliderNode,PolygonColliderNode,
RectangleColliderNode, EdgeColliderNodeクラスがあり,それぞれCircleCollider,
PolygonCollider,
RectangleCollider, EdgeColliderクラスのインスタンスを内部に持っています。
これらのクラスのプロパティを通して,内部コライダのメンバの操作を行う事が出来ます。
Important
このクラスは,衝突判定を行いたいノード(シューティングゲームで言う自機や弾となるノード)の子ノードとして使用される必要があります。
このクラスではColliderNodeクラスのインスタンスが自動的に登録され,GetIsCollidedWith(Collider)メソッドを自動的に実行します。
Tip
GetIsCollidedWith(Collider)メソッドによる衝突判定は,同じColliderNodeの組み合わせに対して1フレームにつき1度しか行われません。
Important
このクラスは衝突判定を行いたいノードの親ノードの子として使用される必要があります。
また,1つのノードに対して,CollisionManagerNodeクラスのインスタンスは1つしか子として持つ事が出来ません。(登録しようとした場合は例外がスローされます。)
ColliderNodeクラスとCollisionManagerNodeクラスはそれぞれ以下の図のような関係でなければなりません。
Caution
ColliderNodeの自動登録には,シーンとなるノードに対して,CollisionManagerNodeが子ノードであり,かつColliderNodeが孫ノードである事が重要です。
それ以外の場合におけるColliderNodeの自動的な追加/削除は発生しません。
Note
衝突判定を行うノードがICollisionEventReceiverインターフェイスを実装している場合,
- 衝突の開始
- 衝突の継続
- 衝突の終了
においてそれぞれ対応したメソッドが呼び出されます。
以上の点を踏まえた実装は以下のサンプルコードの通りです。
[!code-csharpMain]
衝突を開始したときに色が赤くなり,以降衝突している間回転します。
衝突終了時には色が戻ります。
ColliderVisualizeNodeFactory.Create(ColliderNode)
を使用することで,衝突領域を描画できるノードを取得できます。
Important
得られたノードを,Node.AddChildNode(Node)
で登録しなければ衝突判定の視覚化は行われません。
生成元のColliderNodeをCollisionManagerNodeの子にすることで,描画範囲を衝突範囲に同期することが出来ます。
Caution
衝突範囲の描画の同期は,元となるColliderNodeがCollisionManagerNodeの管理下にある必要があります。
使い方は以下のサンプルコードを参考にしてください。
[!code-csharpMain]
このコードを実行すると以下のように円形の当たり判定が赤色で示されます。