はじめに
Unity のタイルマップでは、ブラシを自作することができます
この記事では、ブラシを自作する方法を紹介していきます
作成方法
ブラシの作成はエディタ拡張となるため、
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 属性では、ブラシのデータをどのように持つか設定できます
例えば、上記のように引数を設定すると、
ブラシのクラスを定義するだけで、Tile Palette でブラシを選択できるようになります
[CustomGridBrush ( hideAssetInstances : false , hideDefaultInstance : true , defaultBrush : false , defaultName : "Example Brush" )]
このように hideDefaultInstance を true にした場合は、
ブラシのクラスを定義するだけでは、
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 ); } }
作成したメニューは Project ビューから選択できます
そして、作成したメニューからブラシのアセットを作成すると、
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」フォルダに導入すると、
「Log Brush」という名前のブラシが使用できるようになります
このブラシを使用すると、どのタイミングで関数が呼び出されるか
コンソールウィンドウで確認できます