コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】タイルマップ - ブラシを自作する方法

はじめに

Unity のタイルマップでは、ブラシを自作することができます
この記事では、ブラシを自作する方法を紹介していきます

作成方法

f:id:baba_s:20180408185706p:plain

ブラシの作成はエディタ拡張となるため、
Unity プロジェクトの「Editor」フォルダ内にスクリプトを作成する必要があります

using UnityEditor;
using UnityEngine;

[CustomGridBrush( false, false, false, "Example Brush" )]
public class ExampleBrush : GridBrush
{
}

GridBrush クラスや GridBrushBase クラスを継承した新規クラスを作成します

using UnityEditor;
using UnityEngine;

[CustomGridBrush( false, false, false, "Example Brush" )]
public class ExampleBrush : GridBrush
{
    // ペイントツールでタイルを塗った時に呼び出される関数
    public override void Paint( 
        GridLayout gridLayout, GameObject brushTarget, Vector3Int position )
    {
        // ...
    }

    // 削除ツールでタイルを削除した時に呼び出される関数
    public override void Erase( 
        GridLayout gridLayout, GameObject brushTarget, Vector3Int position )
    {
        // ...
    }

    // 塗りつぶしツールでタイルを塗った時に呼び出される関数
    public override void FloodFill( 
        GridLayout gridLayout, GameObject brushTarget, Vector3Int position )
    {
        // ...
    }

    // 「{」キーや「}」キーを押して、タイルを回転した時に呼び出される関数
    public override void Rotate( 
        RotationDirection direction, GridLayout.CellLayout layout )
    {
        // ...
    }

    // Shift を押しながら「{」キーや「}」キーを押して、
    // タイルを反転した時に呼び出される関数
    public override void Flip( FlipAxis flip, GridLayout.CellLayout layout )
    {
        // ...
    }
}

そして、必要な関数をオーバーライドします

関数 内容
BoxErase 矩形ツールでタイルを削除した時に呼び出される
BoxFill 矩形ツールでタイルを塗った時に呼び出される
Erase 削除ツールでタイルを削除した時に呼び出される
Flip Shift を押しながら「{」キーや「}」キーを押して、
タイルを反転した時に呼び出される
FloodFill 塗りつぶしツールでタイルを塗った時に呼び出される
MoveEnd 移動ツールの操作が完了した時に呼び出される
MoveStart 移動ツールの操作が開始した時に呼び出される
Paint ペイントツールでタイルを塗った時に呼び出される
Pick タイルパレットでタイルを選択したり、
スポイトツールでタイルを選択した時に呼び出される
Rotate 「{」キーや「}」キーを押して、タイルを回転した時に呼び出される

オーバーライドできる関数はこのようになっています

[CustomGridBrush
(
    hideAssetInstances  : false             ,
    hideDefaultInstance : false             ,
    defaultBrush        : false             ,
    defaultName         : "Example Brush"
)]

CustomGridBrush 属性では、ブラシのデータをどのように持つか設定できます
例えば、上記のように引数を設定すると、

f:id:baba_s:20180408194242p:plain

ブラシのクラスを定義するだけで、Tile Palette でブラシを選択できるようになります

[CustomGridBrush
(
    hideAssetInstances  : false             ,
    hideDefaultInstance : true              ,
    defaultBrush        : false             ,
    defaultName         : "Example Brush"
)]

このように hideDefaultInstance を true にした場合は、

f:id:baba_s:20180408194351p:plain

ブラシのクラスを定義するだけでは、
Tile Palette でブラシを選択できないようになるため、
ScriptableObject.CreateInstance や AssetDatabase.CreateAsset を使用して、
ブラシのアセットを作成できるようする必要があります

using UnityEditor;
using UnityEngine;

[CustomGridBrush( true, false, false, "Example Brush" )]
public class ExampleBrush : GridBrush
{
    // ...

    [MenuItem( "Assets/Create/Example Brush" )]
    public static void CreateBrush()
    {
        // 保存先の選択ダイアログを開く
        var path = EditorUtility.SaveFilePanelInProject
        (
            title       : "Save Example Brush", // ダイアログのタイトル
            defaultName : "New Example Brush",  // 保存するファイルのデフォルト名
            extension   : "asset",              // 拡張子
            message     : "Save Example Brush", // ダイアログのメッセージ
            path        : "Assets"              // デフォルトの保存先のフォルダ
        );

        // 保存先の選択がキャンセルされたらここで終了
        if ( string.IsNullOrEmpty( path ) ) return;

        // ブラシのアセットを作成する
        var brush = CreateInstance<RandomBrush>();
        AssetDatabase.CreateAsset( brush, path );
    }
}

f:id:baba_s:20180408193855p:plain

作成したメニューは Project ビューから選択できます

f:id:baba_s:20180408193146p:plain

そして、作成したメニューからブラシのアセットを作成すると、

f:id:baba_s:20180408193251p:plain

Tile Palette でブラシを選択できるようになります
このようにブラシのアセットを作成できるようにすることで、
違うパラメータを持つブラシを複数使用できるようになります

Scene ビューや Tile Palette におけるブラシの表示も
GridBrushEditor クラスを継承したクラスを作成することでカスタマイズできます

// ...

[CustomEditor( typeof( ExampleBrush ) )]
public class ExampleBrushEditor : GridBrushEditor
{
    // タイルパレット下部に表示される
    // ブラシの Inspector をカスタマイズできる関数
    public override void OnPaintInspectorGUI()
    {
        // ...
    }

    // Scene ビューでブラシを描画する時に呼び出される関数
    public override void OnPaintSceneGUI
    (
        GridLayout          grid        ,
        GameObject          brushTarget ,
        BoundsInt           position    ,
        GridBrushBase.Tool  tool        ,
        bool                executing
    )
    {
        // ...
    }
}

以上がブラシの基本的な作り方になります

公式ドキュメント

サンプル1

こちらの記事で、ブラシの自作例を紹介しているので参考になればと思います

サンプル2

上記のスクリプトを Unity プロジェクトの「Editor」フォルダに導入すると、

f:id:baba_s:20180408195425p:plain

「Log Brush」という名前のブラシが使用できるようになります
このブラシを使用すると、どのタイミングで関数が呼び出されるか
コンソールウィンドウで確認できます

関連記事