Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】2Dタイルマップ11 ScriptからTileを自動的に配置する

f:id:hiyotama:20210321002058p:plain
Unity 2020.2.1f1 Personal(2021年3月)

前回に引き続き2Dタイルマップです!
前回までは手動でTileを配置していましたが、今回からはScriptからTileを扱っていきます。
今回はTileを自動的に配置していきます。

IsometricでTileを配置

まずはTilemapのモードがIsometricの場合から見ていきます。
HierarchyからCreate > 2D Object > Tilemap > Isometricから作成します。

f:id:hiyotama:20210321001320p:plain

また、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タイルを指定します。

f:id:hiyotama:20210321002029p:plain

結果は以下の通り、5 * 5の形でタイルが配置されます。

f:id:hiyotama:20210321002058p:plain

Isometric Z as YでTileを配置

続いてTilemapのモードをIsometric Z as YでTileを配置していきます。
まずはTilemapのモードをIsometricからIsometric Z as Yに変更します。
GridオブジェクトのCell Layoutから変更できます。

f:id:hiyotama:20210321002331p:plain
結果

Isometric Z as Yに変更

Isometric Z as Yのモードを使う場合、Transparency Sort Modeを変更する必要があります。
UnityメニューのEdit > Project Settings からGraphics > CameraSettingsにある
Transparency Sort ModeとTransparency Sort Axisを以下のように変更します。

f:id:hiyotama:20210321002612p:plain

また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に変更します。

f:id:hiyotama:20210321003419p:plain

以上で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から登録して下さい。

f:id:hiyotama:20210321003833p:plain

それではゲームを実行して結果を確認してみましょう。

f:id:hiyotama:20210321003933p:plain
結果

Isometric Z as Yでも特に問題なくScriptからTileを配置することができました。

今回は以上となります。
ありがとうございました〜。