TileColliderを使わない地形判定
概念(考え方)
サイドビュー型アクションゲームを作るうえで欠かせないのが地形判定だと思います。
ここでは下図のようにタイルマップを表示用と判定用を別々に作った場合について解説しようと思います。
(この概念は「レイヤー」と言います。)
今回はGridオブジェクトの子に「Terrain」と「MainTile」のタイルマップが付いています。
アクセスしたいのは「Terrain」とします。
Terrainの特定の座標のタイルを見るプログラムは次のとおりです。
TerrainのTilemapを受け取る
Init()関数では主に次のことをしています。
まずGridをヒエラルキー上のゲームオブジェクトから取得します。
grid = GameObject.FindObjectOfType<Grid>();
次にGridの子オブジェクトになっているTerrainオブジェクトを取得します。
オブジェクトはgrid.transform.GetChildの引数を指定します。
ヒエラルキーで上にあるものが0番、以下連番となります。
terrainObj = grid.transform.GetChild(0).gameObject;
最後にterrain変数にTerrainオブジェクトのTilemapを取得させます。
terrain = terrainObj.GetComponent<Tilemap>();
GetTerrainSpriteTypeAll(Tilemap tilemap, List<Sprite> spriteList)関数
地形に使っている地形スプライトをリスト化します。
ここに関してページ末に記載したサイトを参考にすると良いと思います。
GetPositionOnTilemap(Vector3 _pos)関数
実座標をタイル座標に変換します。
GetTerrainNumbur(Vector3Int _pos)関数
指定タイル座標のタイル番号を返します。
別途、このタイル番号を基に進入禁止などの処理を行います。
実際に動かしてみた動画です。
(キャラクターにも地形用の判定領域を付けています。)
おわりに
タイルマップに複合コライダーを付けた方法が一般的かと思いますが、
今回の考え方は従来のゲーム開発で非常に役に立ちます。
坂道の考え方などネット上には数学的な考え方などが載っていますので
ぜひ挑戦してみてはいかがでしょうか。
ネックはメモリを余計に食ってしまう部分ですが今時の環境なら気にならないでしょう。
それでは、また別の記事でお会いしましょう!
参考サイト
当記事は次のサイトの情報を参考に致しました。
貴重な情報を公開していただき有難うございます!
- Tilemapの情報をスクリプトから取得する【Unity】(にゃま氏)
https://nyama41.hatenablog.com/entry/get_tilemap_info