【Unity】Tilemapをマスごとに識別して別々の判定を取る方法
どうもマカロンです。
先日作った僕のゲームアプリでTilemapを使用したのですが、ステージを作りやすくするためにTileの種類を識別して実装することにしました。
その際に、割とTIlemapを識別する方法載せてる人いないのなぁ...と思ったので今回記事にしてみました!
それではいきましょう!
まず宣伝
赤と緑を切り替えてゴールを進むスライドパズルゲームです。
単純にもちろん遊んでいただきたい気持ちもありますが、Tileごとに種類を判別し、判定を変えているのがわかるかと思います。(壁とワープは特に判定が違うのでわかりやすいかも)
▼iOS(上)、Android(下)
完成するもの
こんな感じで当たったTileが何なのかを識別、そのTileがどこの座標にあるかを検索することが出来ます。
これによって例えばif文で名称ごとに違う処理を書けば一つのTilemapで別々の処理を実現することが出来ます。
取得している名称が正しいことを証明するために各Tileの名称が載っている画像を下記に置いておきます。
Unity側での準備
まずTilemapの準備をします。
今回はおそらくTilemapの素材が含まれているもので一番有名な「Sunny Land」を使っていきたいと思います。
Tilemapの導入についてはこのサイトがとても参考になるかと思います。
一応このような画面になっていれば大丈夫だと思います。
次にプレイヤーの配置とステージを作ります。
とりあえず現在触れているタイルの名前を出すテキスト、プレイヤー、タイルを用意しました。より正確な判定を取るためにプレイヤーサイズはタイル一枚の大きさとだいたい同じ大きさにしてあります。
当たり判定を取るのでプレイヤーにはBoxCollider2D,Rigidbody2D
タイルにはTilemapCollider2Dを割り当てています。
※当たり判定を取るためのタイル「wall」と判定のない「back」にあらかじめ分けています。
一応プレイヤーが最低限Tileにぶつかって判定を取ることができるように上下左右に移動するプログラムも載せておきます。
using UnityEngine;
public class Player : MonoBehaviour
{
/*プレイヤーの持つパラメータを参照*/
private Vector3 pos;//プレイヤーの座標
[SerializeField] private float moveSpeed;//プレイヤーの移動速度
//=================================
//更新
//=================================
void Update()
{
pos = transform.position;
if (Input.GetKey(KeyCode.W)) { pos.y += moveSpeed; }
if (Input.GetKey(KeyCode.S)) { pos.y -= moveSpeed; }
if (Input.GetKey(KeyCode.D)) { pos.x += moveSpeed; }
if (Input.GetKey(KeyCode.A)) { pos.x -= moveSpeed; }
transform.position = pos;
}
}
検索方法
Timemapのマスを全てに検索をかけ、その中からプレイヤーに一番近いTileを選別してそのTileの座標と名前から当たり判定を取りプレイヤーとの処理を行います。
これによってTileごとで処理を分けることができ、実際自分が作成したゲームでは壁、ワープ、跳ね返りなど複数の処理を一つのScriptで処理しています。
全検索の範囲なのですが、Scene上で確認できる枠の範囲全てを検索するのでこの場合横10×縦20の合計200マスを検索します。
・利点
パズルゲームなどでステージを作る際などにTilemapで簡単にステージを作れる+Tileごとに処理を分けられるようになるのでギミックの配置もTimemapで可能になる。
・欠点
1つの画面で処理をするパズルゲームならともかくアクションゲームのようにステージが広いものになってしまうとそのTilemapを全検索する必要があるので処理が非常に重くなる恐れがあります。
以上を踏まえたうえでもし需要があれば実際のコードとその解説の部分についてご購入いただけると幸いです。
実際のコード(有料記事)
ここから先は
¥ 300
ゲームを作るにはやはりお金がないとできることが限られてしまいます。なのでよろしければどうか支援してくださるとうれしいです