特定の場所のタイル名を取得する
2022/12/10
Unity version : 2021.1.2.7f1 Personal(日本語化済み)

はじめに

タイルマップを作ったとき、特定の場所のタイルについて調べたいときどうするのでしょうか。
ここではマウスカーソルのポイント位置のタイル名を取得したいと思います。
※Unity2Dプロジェクトでの説明です。

※この記事は過去にアップロードしたものと関連しています。

>複数のタイルマップから一つを選ぶ
../20221110/main.html

主な手順

  1. タイルマップ機能でマップを描く
  2. マウスポインタの位置に対応したカーソルを作る
  3. カーソル位置のタイル情報を拾うスクリプトを作る
  4. 結果がわかるようにテキスト表示を加える
  5. Text(TMP)にアタッチするテキスト表示用のスクリプトを作る
  6. 最後の設定

1.タイルマップ機能でマップを描く

まず、タイルマップを準備します。

ヒエラルキーを右クリックし、「2Dオブジェクト」→「タイルマップ」→「矩形」をクリックします。
"Grid"オブジェクトが作られ、その子に"Tilemap"オブジェクトが生成されます。

次に、タイルの全体画像をUnityにインポートします。
念のため、"Assets"フォルダ以下に"TileMap"フォルダを作成し、そこにインポートすると良いでしょう。
※今回の全体画像の仕様 : 1タイルあたりの大きさ64*64ピクセルの矩形で10*10マス並ぶもの

インポートしたタイル全体画像を矩形で区切ります。
インスペクターから次の部分を変更します。

  • スプライトモード : 複数
  • ユニット毎のピクセル数 : タイル1枚あたりの1辺の長さ
  • メッシュタイプ : 完全な矩形

「適用する」ボタンをクリックして変更を確定します。

「Sprite Editor」ボタンをクリックしてスプライトエディタを開きます。

ウィンドウ上部の「スライス」をクリックします。
  1. 「タイプ」を「Grid by Cell Size」に変更します
  2. 「ピクセルサイズ」のX・Yの値ををタイル一枚のサイズに変更します
  3. 「スライス」をクリックします

画像がマス目に区切られます。(クリックで拡大)

ウィンドウ右上の「適用する」をクリックします。

スプライトエディタを閉じます。

次に、タイルパレットを設定します。

  1. 「ウィンドウ」→「2Dオブジェクト」→「タイルパレット」を開きます。
  2. タイルパレットウィンドウにタイル全体画像をドラッグ&ドロップする
  3. 保存先フォルダを聞かれるので、TileMapフォルダを開き
    「フォルダーの選択」ボタンをクリックする
  4. 「アクティブタイルマップ」を「Tilemap」に変更する


以上でタイルパレットの設定が終わりました。
タイルパレットウィンドウは開いたままで構いません。

ヒエラルキーで"TileMap"を選択し、タイルパレットウィンドウを使いながらタイルを塗っていきます。

2.マウスポインタの位置に対応したカーソルを作る

ヒエラルキーを右クリックし、「2Dオブジェクト」→「スプライト」→「正方形」をクリックします。
縦横の長さが"1"の正方形が作られます。
オブジェクト名を"SelectPlane"に変更します。なお、スプライトの色は任意です。

3.カーソル位置のタイル情報を拾うスクリプトを作る

プロジェクトウィンドウの"Assets"フォルダ以下にC#スクリプトを作成し、名前を"TestScript"にします。

"TestScript"の中身を記述し、"SelectPlane"オブジェクトにアタッチします。
まずスクリプト全体は次の通りです。

TestScript.cs


ポイントの部分を解説します。

//マウスポインタのスクリーン座標の位置からマウスポインタのワールド座標を得る。
var targetPos = UnityEngine.Camera.main.ScreenToWorldPoint(Input.mousePosition);
メインカメラから見たマウスのポイント座標を取得したいときは、
UnityEngine.Camera(以下略)と指定していきます。

//SelectPlane(四角いカーソル)の座標をグリッド座標に置き換える
transform.position = new Vector2(targetPosInt.x + 0.5f, targetPosInt.y + 0.5f);
今回は平面が扱えればよいので、Vector2型としました。
また、グリッドは標準で各軸に 0.5f のオフセットが設定されるので、スクリプトでも加えます。

//SelectPlaneの場所のスプライト情報を取得する
Sprite spr = tilemap.GetSprite(targetPosInt);
スプライト情報は GetSprite を使って spr に渡します。

sText = spr.name;
スプライト情報自体にタイル番号は載っていないのでスプライト名を取得します。
それは、スプライト名はタイル名と連動しているからです。

(例)左上から右へ番号が順番に振られる

4.結果がわかるようにテキスト表示を加える

スプライト名の確認ができるようにテキストUIをセットします。
"TextMeshPro"を使用したいので、メニューバーの「ウィンドウ」→「パッケージマネージャ」を開き、
"Unityレジストリ"内の"TextMeshPro"を探してインストールします。

ヒエラルキーを右クリックし、「UI」→「テキスト(TextMeshPro)」を選択します。
きっとシーン上に大きく「New Text」と表示されます。
マウスホイールで画面を引いてから好きな位置にセットします。

5.Text(TMP)にアタッチするテキスト表示用のスクリプトを作る

プロジェクトウィンドウの"Assets"フォルダ以下にC#スクリプトを作成し、名前を"SpriteText"にします。
スクリプトは下記のとおりです。
"SpriteText.cs"

注意点としては、"TextMeshPro"を使用するので宣言部に次の一文をを追記します。
using TMPro;

6.最後の設定

最後に”SpriteText.cs”ファイルは"SelectPlane"オブジェクトを使用するので、
インスペクターから追加します。


これで実行準備が整いました。

実行してみよう

シーンを再生すると、タイルが置いてある場所にポイントを合わせると、
タイルの名前が表示されます。
※カーソル部分のタイルが見えるように別途、カーソルを半透明にしました。

おわりに

今回は、私が作っているアクションゲームで必要に迫られて作成した機能です。
思ったことは、名前の取得までの工程が多く、一度に多数のキャラクターで使用するのは
良くないなと思いました。
私はタイル番号が知りたいので後々、int型で取れないかと考えてみます。

最後までお読みくださり有難うございました。


参考サイト

※Unityスクリプトリファレンス ver.2018.4
2D > タイル > スクリタブルタイル > その他の有用なクラス
https://docs.unity3d.com/ja/2018.4/Manual/Tilemap-ScriptableTiles-OtherClasses.html

※Unity3D上でマウスポインタの位置のグリッド座標を簡単に取得する(みにに氏)
https://crieit.net/posts/Unity3D

大変参考になりました。
ありがとうございました。

ページトップ