前回は、Unity のアセット TopDown Engine のサンプルゲームの一つ KoalaDungeon のマップを表示するための基本のコンポーネント Tilemap と TilemapRenderer を紹介しました。

Unity Grid と Tilemap 群の関係
今回は、タイルマップの種類ごとの特有のコンポーネントを紹介します。
※ Unity は 2021.3.14f1、TopDown Engine は 3.1.1 です。
各タイルマップ特有のコンポーネント
Ground タイルマップ
通行可能な床を配置するタイルマップです。
TilemapCollider2D コンポーネント
TimemapCollider2D コンポーネントはタイルマップに対応したコライダーです。
同じゲームオブジェクトに付加されている Timemap コンポーネントのタイル群の配置情報からコライダー形状を作ります。
Tilemap コンポーネントでタイルの変更があった場合は、バッチ処理により効率よく更新します。

KoalaDungeon Ground の TilemapCollider2D コンポーネント
Used By Composite にチェックがある場合、 Offset プロパティを除き、全ての制御を CompositeCollider2D コンポーネントに渡します。
詳しくは「Tilemap Collider 2D – Unity マニュアル」を参照してください。
Rigidbody2D コンポーネント
物理挙動を実現するコンポーネントです。 2D 版は 2 次元の移動と、その平面に垂直な方向への回転に制限されます。
また Collider2D コンポーネントがアタッチされている場合、衝突時の双方のコライダーの接点や動きを伝達します。
今回は出てきませんが Joint2D コンポーネントの物理的シミュレーションにも関係しています。

KoalaDungeon Ground の RigidBody2D コンポーネント
BodyType プロパティが Static な場合、基本的に動かないゲームオブジェクトであることを示します。
Simulated プロパティが有効な場合、 Collider2D, Joint2D コンポーネントを物理シミュレーションと相互作用させます。
無効にすると物理シミュレーションが行われないので、 Collider2D をつけていても衝突/トリガー判定は通知されなくなります。
詳しくは「Rigidbody 2D – Unity マニュアル」を参照してください。
衝突判定とトリガー判定の条件
二つのゲームオブジェクトの衝突判定により OnCollisionEnter2D イベント関数などが呼ばれるには次の条件を満たします。
- 少なくとも一方が Rigidbody2D コンポーネント (Simlated = true) を付加している。
- どちらも Collider2D 派生コンポーネントを付加している。
- isTrigger プロパティはどちらも false に設定されている。
衝突判定では、ぶつかった際にお互いの移動方向が変わるなどの物理挙動が演算されます。
isTrigger プロパティを有効にすると、衝突判定ではなく、トリガー判定となり、お互いのコライダーの領域の一部または全部が重なっていることを通知するだけになります。
ゴール地点にたどり着いたら、次のステージに移動などの処理では、トリガー判定を使うと良いでしょう。
二つのゲームオブジェクトのトリガー判定により OnTriggerEnter2D イベント関数などが呼ばれるには次の条件を満たします。
- 少なくとも一方が Rigidbody2D コンポーネント (Simlated = true) を付加している。
- どちらも Collider2D 派生コンポーネントを付加している。
- isTrigger プロパティはトリガー判定を受けたい側(片方または両方)で true に設定されている。
衝突判定と最初の 2 つの条件は同じですが、3 つめの isTrigger の設定は片側だけ true にしても、 true にしたほうのトリガー判定イベント関数が呼び出されます。
CompositeCollider2D コンポーネント
複数のコライダーの形状を合成して衝突/トリガー判定を制御します。
BoxCollider2D, PolygonCollider2D, TilemapCollider2D などが持つ Used By Composite プロパティで true が設定されているコライダー群が合成の対象です

KoalaDungeon Ground の CompositeCollider2D コンポーネント
GeometryType プロパティが Polygons の場合は、合成したコライダー形状はポリゴンで表されます。
PolygonCollider2D コンポーネントのように複雑な形をしているものに向いています。
Ground は移動可能な床を表すので、壁によりたくさん仕切られている場合複雑な形になるためポリゴンのほうが向いているようです。

Unity CompositeCollider2D の Polygons によるコライダー形状
GeometryType プロパティが Outlines の場合は、コライダー群の重なりに応じたアウトラインで表されます。
EdgeCollider2D コンポーネントのように線分の組み合わせで表され、ポリゴンと異なり領域が閉じている必要はありません。
詳しくは「Composite Collider 2D – Unity マニュアル」を参照してください。
GroundDecoration タイルマップ
Ground タイルマップの床に装飾(サンプルでは赤いじゅうたんをのせていました)をほどこすタイルレイヤーです。
よく見るとじゅんたんの角に隙間があり、そこに同じ位置の床のタイルが重なって表示されています。

KoalaDungeon の GroundDecoration タイルマップでは床の上に絨毯をのせていて、絨毯の隙間から床が少し見えます。
特有のコンポーネントはありませんでした。
Walls タイルマップ
通行不可能な壁を配置するタイルレイヤーです。
TilemapCollider2D, Rigidbody2D コンポーネントは Ground と同じ
TilemapCollider2D, Rigidbody2D コンポーネントの設定は Ground と同じでした。

KoalaDungeon Walls の TilemapCollider2D コンポーネント

KoalaDungeon Walls の Rigidbody2D コンポーネント
CompositeCollider2D コンポーネント
コンポーネント 3 つの構成は Ground タイルマップと同じです。
違いは、CompositeCollider2D コンポーネントの Geometry Type プロパティです。
Ground では Polygons でしたが、 Walls タイルマップでは Outlines が指定され、後続のパラメータの内容も一部異なります。
Ground で説明した通り、 Outlines を選ぶと EdgeCollider2D のような連続した複数の線分を用いて、対象のコライダー群のアウトラインをコライダー形状として合成します。

KoalaDungeon Walls の CompositeCollider2D コンポーネント
Ground と比べて Walls は直線的な形状が多く、Outlines のほうが適しているようです。

Unity CompositeCollider2D の Outlines によるコライダー形状
今回はここまで
意外と話が長くなってきたので Grid 直下にあるまだ紹介していない WallsShadow, Holes タイルマップ、 Props ゲームオブジェクトの説明は、次回行います。
コメント