【Unity】2Dタイルマップ11 ScriptからTileを自動的に配置する
Unity 2020.2.1f1 Personal(2021年3月)
前回に引き続き2Dタイルマップです!
前回までは手動でTileを配置していましたが、今回からはScriptからTileを扱っていきます。
今回はTileを自動的に配置していきます。
IsometricでTileを配置
まずはTilemapのモードがIsometricの場合から見ていきます。
HierarchyからCreate > 2D Object > Tilemap > Isometricから作成します。
また、Controllerという名前の空オブジェクトも作成します。
ControllerオブジェクトにはTilemapController.csというScriptを取り付けます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class TilemapController : MonoBehaviour { [SerializeField] Tilemap tilemap; [SerializeField] Tile blockTile; void Start() { StartCoroutine(SetTile()); } IEnumerator SetTile() { for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { tilemap.SetTile(new Vector3Int(x, y, 0), blockTile); yield return new WaitForEndOfFrame(); } } } }
TilemapController.cs
Tilemapを扱う時は
using UnityEngine.Tilemaps;
の表記を忘れないで下さい。
Startメソッドでコルーチンを呼び出していますが、これはTileがどのように配置されているかを1フレームずつ見ていきたいだけですので通常時はコルーチンを使う必要はありません。
SetTileでは縦方向に5つ、横方向に5つのブロックを配置する処理を書いています。
tilemap.SetTileメソッドの第一引数に配置する位置、第二引数に配置するTileを指定しています。
TilemapControllerのInspectorにて作成したTIlemapオブジェクトと、前回までで活用してきたstone_blockタイルを指定します。
結果は以下の通り、5 * 5の形でタイルが配置されます。
Isometric Z as YでTileを配置
続いてTilemapのモードをIsometric Z as YでTileを配置していきます。
まずはTilemapのモードをIsometricからIsometric Z as Yに変更します。
GridオブジェクトのCell Layoutから変更できます。
結果
Isometric Z as Yに変更
Isometric Z as Yのモードを使う場合、Transparency Sort Modeを変更する必要があります。
UnityメニューのEdit > Project Settings からGraphics > CameraSettingsにある
Transparency Sort ModeとTransparency Sort Axisを以下のように変更します。
またMainCameraに以下のScriptを取り付けます。
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif [ExecuteInEditMode] public class AxisDistanceSortCameraHelper : MonoBehaviour { void Start() { var camera = GetComponent<Camera>(); camera.transparencySortMode = TransparencySortMode.CustomAxis; camera.transparencySortAxis = new Vector3(0.0f, 1.0f, -0.49f); #if UNITY_EDITOR foreach (SceneView sv in SceneView.sceneViews) { sv.camera.transparencySortMode = TransparencySortMode.CustomAxis; sv.camera.transparencySortAxis = new Vector3(0.0F, 1.0F, -0.49F); } #endif } }
AxisDistanceSortCameraHelper.cs
最後にTilemapオブジェクトのModeをChunkからIndividualに変更します。
以上でTilemapで高さを表現した時に描画が崩れないようになりました。
続いて先ほど作成したTilemapController.csを加筆修正していきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class TilemapController : MonoBehaviour { [SerializeField] Tilemap tilemap; [SerializeField] Tile blockTile; // ***** 追加 ***** [SerializeField] Tile fieldTile; // ***** 追加終了 ***** void Start() { StartCoroutine(SetTile()); } IEnumerator SetTile() { // ***** 追加 ***** for (int z = 0; z < 5; z++) { // ***** 追加終了 ***** for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { // ***** 修正 ***** tilemap.SetTile(new Vector3Int(x, y, z * 2), z % 2 == 0 ? blockTile : fieldTile); // ***** 修正終了 ***** yield return new WaitForEndOfFrame(); } } // ***** 追加 ***** } // ***** 追加終了 ***** } }
TilemapController.cs
SetTileメソッドにz軸のfor文を追加しました。
z % 2 == 0 ? blockTile : fieldTile
の部分は、zを2で割った時の余りが0ならblockTileが、0以外ならfieldTileが配置されます。
fieldTileについては前回までに作成したfield_blockタイルを活用します。
Inspectorから登録して下さい。
それではゲームを実行して結果を確認してみましょう。
結果
Isometric Z as Yでも特に問題なくScriptからTileを配置することができました。
今回は以上となります。
ありがとうございました〜。