Tilemapのブラシ拡張のための属性、CustomGridBrushについて

Unityの2DマップエディターであるTilemap。このTilemapはTile・Brushを拡張することができます。

この投稿では、Brushの拡張で使う「[CustomGridBrush](https://docs.unity3d.com/ScriptReference/CustomGridBrushAttribute.html)」属性について説明します。

---

`CustomGridBrush`の利用例を次に示します。

それぞれのコードはUnity公式サンプルの[2d-gamedemo-robodash](https://github.com/Unity-Technologies/2d-gamedemo-robodash)のものです。

```csharp
[CreateAssetMenu]
[CustomGridBrush(false, true, false, "Level")]
public class LevelBrush : GridBrushBase {
    /* 中略 */
}
```


```csharp
[CustomGridBrush(true, false, false, "Tint")]
public class TintBrush : GridBrushBase {
    /* 中略 */
}
```


```csharp
[CustomGridBrush(true, true, true, "Default Brush")]
public class DefaultBrushReplacement : GridBrush 
{
    /* 中略 */
}
```

このように、`CustomGridBrush`は`GridBrush`クラスを継承したクラスに付与する属性です。

---

`CustomGridBrush`は`bool`,`bool`,`bool`,`string`型のパラメータをとります。

それぞれ名前付き呼び出しで書くと次のようになります。

```csharp
[CustomGridBrush(hideAssetInstances: true, hideDefaultInstance: false, defaultBrush: true, defaultName: "Default Brush")]
public class DefaultBrushReplacement : GridBrush 
{
    /* 中略 */
}
```

パラメータはそれぞれ最初から


* `bool`の`hideAssetInstances`
* `bool`の`hideDefaultInstance`
* `bool`の`defaultBrush`
* `string`の`defaultName`

です。

---

それぞれのパラメータを理解するためには、3種類のBrushについて理解する必要があります。

Brushには

* アセット（ScriptableObject）を作るBursh
* アセット（ScriptableObject）を作らないBrush
* デフォルトを書き換えるのBrush

があります。

「アセット（ScriptableObject）を作るBursh」の利用例としては、特定のプレファブを設置するBrushがあげられます。このBrushは「同じ機能を持つBrushをアセットとして複数作って、それぞれ違うプレファブを設置できるようにする」ということができます。この種類のBrushは「同じ機能を持っているけれど、別の設定値を持っているBrush」を個別にアセットとして生成します。LevelBrush、TeleportBrushやLaserBrushなど「[2d-gamedemo-robodash](https://github.com/Unity-Technologies/2d-gamedemo-robodash)」プロジェクトの多くのBrushが「アセットを作るBrush」です。プロジェクト中にScriptableObjectとして、Brushが存在することに注目してください。


「アセット（ScriptableObject）を作らないBrush」の利用例としては、線を引くBrush、座標情報を表示するBrsuhなどの機能を提供するBrushがあります。「線を引く機能」はバリエーションを作る必要がありません。このようにバリエーションを作る必要がないBrushは、「アセット（ScriptableObject）を作らないBrush」となります。[2d-gamedemo-robodash](https://github.com/Unity-Technologies/2d-gamedemo-robodash)中のTintBrush、そして[2d-extras](https://github.com/Unity-Technologies/2d-extras)中の、LineBrushやCordinateBrushが「アセット（ScriptableObject）を作らないBrush」です。

「デフォルトを書き換えるのBrush」は、Unityが提供するデフォルトのBrushを置き換えるBrushです。[2d-gamedemo-robodash](https://github.com/Unity-Technologies/2d-gamedemo-robodash)では、デフォルトのBrushを置き換えています。

---

それぞれのパラメータの意味を紹介します。

* `hideAssetInstances`がtrueだと、プロジェクト中のアセット（ScriptableObject）として作られたBrushは、Tile Palette Windowから選べなくなります。その型のBrushをアセットとして作る意味がなくなります。
* `hideDefaultInstance`がfalseだと、プロジェクト中にアセットとして作られたその型のBrushがなくてもデフォルトのBrushが作られ、Tile Palette Windowから選べます。trueだとTile Palette Windowから選べばせん。
* `defaultBrush`がtrueだと、Unityが提供する標準のBrushを置き換えます。プロジェクトの中で一つのBrushだけtrueにすべきですね。
* `defaultName`は、その型のBrushのデフォルトBrushの名前です。これを設定しない場合、型名からBrush名が作られます。


---

先のコードにあげたパラメータを確認・解説します。


まずは`DefaultBrushReplacement`。

```csharp
[CreateAssetMenu]
[CustomGridBrush(false, true, false, "Level")]
public class LevelBrush : GridBrushBase {
    /* 中略 */
}
```

これはアセット（ScriptableObject）を作るBurshです。

* `hideAssetInstances`はfalseです。プロジェクト中にアセット（ScriptableObject）を作りたいので、falseにする必要がありますね。
* `hideDefaultInstance`はtrueです。デフォルトのBrush入らないのでtrueにした方がいいですね。
* `defaultBrush`はfalseです。Unityが提供する標準のBrushを置き換えないのでfalseですね。
* `defaultName`は、"Level"になっていますが、DefaultのBrushは無効なので実際は意味がありませんね。

---

次に`TintBrush`。

これはアセット（ScriptableObject）を作らないでデフォルトのBrushのみを使うBrushです。

```csharp
[CustomGridBrush(true, false, false, "Tint")]
public class TintBrush : GridBrushBase {
    /* 中略 */
}
```

* `hideAssetInstances`はtrueです。プロジェクト中にアセット（ScriptableObject）を作らないので、trueにする必要がありますね。
* `hideDefaultInstance`はfalseです。デフォルトのBrushが必要なのでfalseにしなくてはいけませんね。
* `defaultBrush`はfalseです。Unityが提供する標準のBrushを置き換えないのでfalseですね。
* `defaultName`は、"Tint"になっています。

---


最後に`DefaultBrushReplacement`。

```csharp
[CustomGridBrush(true, false, false, "Tint")]
public class TintBrush : GridBrushBase {
    /* 中略 */
}
}
```

Unityが提供する標準のBrushを置き換えるBrushです。プロジェクト中のアセット（ScriptableObject）は作りません。

* `hideAssetInstances`はtrueです。プロジェクト中のアセット（ScriptableObject）を作らないので、trueでいいですね。
* `hideDefaultInstance`はtrueです。一見これはfalseでもよさそうですね。`hideDefaultInstance`をfalseにし`defaultBrush`をtrueにすると、そう設定したBrushがTile Palette Windowで二つ重複して出てきてしまいます。
* `defaultBrush`はtrueです。Unityが提供する標準のBrushを置き換えたいのでtrueですね。
* `defaultName`は、"Default Brush"


---

この投稿では、Tilemapのブラシ拡張のための属性、CustomGridBrushについて紹介しました。

ガンガンBrush、拡張していきましょう！