Unity 2023.1と2023.2のTilemapのアップデート

この投稿は「[Unity アドベントカレンダー 2023その1](https://qiita.com/advent-calendar/2023/unity)」の1日目の記事です。

2日目の明日は @ShoyoFILMS さんの「[ワンボタンで動くゲームを作ってみた](https://qiita.com/ShoyoFILMS/items/964878d9758e2d694ecc)」です。

---

TilemapはUnityの2Dマップエディターです。この投稿では、Unity 2023.1とUnity 2023.2のTilemapのアップデートの内容を紹介します。

なお、動作検証はUnity 2023.2.1f1で行っています。2D Tilemap Extrasのバージョンは、4.0.1です。

# Tilemap向けのOverlayが登場

[Overlay](https://docs.unity3d.com/2022.3/Documentation/Manual/overlays.html)は、Unity 2021で導入された、Scene Viewの上にUIを表示できる機能です。

Unity 2023.2で、次に示す2つのTilemap向けOverlayが導入されました。

* Tile Palette Clipboard Overlay
* Tile Palette Brush Picks Overlay

---

「Tile Palette Clipboard Overlay」は、Tile Palette Windowの「Main editor Window」のコンパクトなバージョンです。次の図の右下、赤枠で囲った部分がTile Palette Clipboard Overlayです。

![ss_overlay0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/b28459cd-afce-a2d3-7785-d1c16a4a67e0.png)

Tile Palette Clipboard Overlayを用いることで、Scene Viewの上で素早くTileを切り替えることができます。Scene ViewとTile Palette Windowを行ったり来たりすることなく、Tileを切り替えることができるようになりました。キーボードショートカット「;」で、Tile Palette Clipboard Overlayの表示・非表示を素早く切り替えることができます。

公式ドキュメントは[こちら](https://docs.unity3d.com/2023.2/Documentation/Manual/tile-palette-ui-ref.html)の「Tile Palette Clipboard overlay」を参照してください。

---

Tile PaletteのBrushとTileの設定を保存したり、読み込みしたりできるようになりました。「Tile Palette Brush Picks Overlay」はこの設定の保存・読み込み・管理を行うためのOverlayです。次の図の右下、赤枠で囲った部分がTile Palette Brush Picks Overlayです。

![ss_overlay1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/9344fdc4-26a6-6223-799e-68c75f6b9e8d.png)

BrushとTileの設定は、Pick Toolで読み込みし、Tile Palette Brush Picks Overlayで保存ボタンを押すことで、保存できます。BrushとTileの設定は、デフォルトではLibrary下に保存されます。プロジェクト設定を行えば、Assets以下の指定の場所に保存し、バージョン管理対象とすることも可能です。次の図の赤枠、Preferences Windowの2D > Tile Paletteの「Brush Picks」で設定を行います。

![ss_project_settings_brush_picks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/bc7d9f75-155d-0a57-e9af-9c0e9ef9a8e8.png)

「このTileとこのBrushはセットで使うと便利だな〜」というのを登録しておけて、とても効率的にマップを構築できそうですね。

公式ドキュメントは[こちら](https://docs.unity3d.com/2023.2/Documentation/Manual/tile-palette-brush-picks.html)を参照してください。

---

リリースノートの記載は次のとおりです。

* 2D: Added overlay support to the Tile Palette Window.
* 2D: Added icons to the Clipboard and Brush Pick overlays for Tile Palette when the overlays are collapsed. (UUM-29771)
* 2D: Added the shortcut key to the tooltips for the toggles that activate overlays in the Tile Palette Window.  
* 2D: Added Brush Picks to the Tile Palette Window.
* 2D: Added the shortcut key to the tooltips for the toggles activating overlays in the Tile Palette Window.

# TileChangeDataがシリアライズ可能に

Unity 2021.2で[TileChangeData](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Tilemaps.TileChangeData.html)構造体、およびそれを使ったTilemap型の[SetTile](https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Tilemaps.Tilemap.SetTile.html)メソッド・[SetTiles](https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Tilemaps.Tilemap.SetTiles.html)メソッドが追加されました。これにより、Tileの設置、回転、色変えを1回のメソッド呼び出しで行うことができるようになりました。

Unity 2023.2でTileChangeData構造体をシリアライズできるようになりました。構造体自身にSerializable属性が、フィールドにSerializeField属性が付与されました。

リリースノートの記載は次のとおりです。

* 2D: Enabled the serialization of TileChangeData.

# TileAnimationFlagsにUnscaledTimeの追加

[TileAnimationFlags](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Tilemaps.TileAnimationFlags.html)に、Unity 2023.2で[UnscaledTime](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Tilemaps.TileAnimationFlags.UnscaledTime.html)フラグが追加されました。

このフラグが設定されると、タイルアニメーションはTime.timeScaleとは無関係に実行されます。そうでない場合は、Time.timeScaleと連動したタイルアニメーションが実行されます。

「Time.timeScaleを0にして、ゲームを一時停止している間も、タイルアニメーションは実行したい」という状況で便利です。

どうも[こちら](https://forum.unity.com/threads/adding-a-tileanimationflag-to-set-the-animation-update-mode-scaled-vs-unscaled-time.1343531/)のフォーラムでの提案から採用されたようにも見えます。

これで、[TileAnimationFlags](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Tilemaps.TileAnimationFlags.html)は、次の5つになりました。

* None
* LoopOnce
* PauseAnimation
* UpdatePhysics
* UnscaledTime

リリースノートの記載は次のとおりです。

* 2D: Added: TileAnimationFlags.UnscaledTime.

# TileBaseEditorの追加

CustomEditor属性を付与した特定のクラス向けのEditor拡張クラスにおいて、[RenderStaticPreview](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Editor.RenderStaticPreview.html)メソッドをオーバーライドすることで、Unity Editor中の対象型のアセットのアイコンを設定・変更することができます。

[TileBase](https://docs.unity3d.com/ja/2023.2/ScriptReference/Tilemaps.TileBase.html)という、ユーザーがScrptableTileを作る際のベースクラスとして継承して利用するクラスがあります。

このTileBaseクラス向けのEditor拡張クラス「[TileBaseEditor](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/TileBaseEditor.html)クラス」が新たに追加されました。TileBaseEditorクラスで、RenderStaticPreviewメソッドが実装され（オーバーライドされ）、TileBaseクラスを継承したクラスは、シンプルなデフォルトプレビューが勝手にされるようになりました。

リリースノートの記載は次のとおりです。

* 2D: Added: TileBaseEditor with an implementation for RenderStaticPreview, which allows users who extend from the TileBase class to have a simple default asset preview for their extended classes of TileBase.

# Tilemap.loopEndedForTileAnimationの追加

Tilemap型のstaticなイベントとして、loopEndedForTileAnimationイベントが追加されました。

このイベントは、タイルアニメーションのフラグとしてLoopOnceをもっているタイルアニメーションのループが終わった時に、呼び出されます。イベントの引数として、

* アニメーションループが終わったTileを持つ対象のTilemap
* アニメーションが終了したタイルの位置の配列の`NativeArray<Vector3Int>`

が渡ってきます。

[公式ドキュメント](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Tilemaps.Tilemap-loopEndedForTileAnimation.html)からは読み取りにくいのですが、このイベントはTilemapクラスのstaticなイベントです。

GitHubのソースコードは[こちら](https://github.com/Unity-Technologies/UnityCsReference/blame/2023.2.0f1/Modules/Tilemap/Managed/Tilemap.cs#L17)。

リリースノートの記載は次のとおりです。

* 2D: Added: Tilemap.loopEndedForTileAnimation callback when Animated Tiles have reached the end of their animation loop if it has the LoopOnce flag set.

# Tilemap Palette Windowから、Tilemap GameObjectを作成可能に

Tilemap Palette Windowから、Grid GameObjectおよびTilemap GameObjectを作成可能になりました。

次の画像のように、Tile Palette WindowのActive Targetドロップダウンメニューで「Create New Tilemap」を選択し、Tilemapの種類を選択することで、Tilemapが作成できるようになりました。

![ss_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/42146322-70f8-7bb6-47de-832f8e281ce1.png)

また、Scene内にTilemapなどのGameObjectがないと、「To start painting in the Scene, first create new Tilemap.」というメッセージがTile Palette Windowに表示されるようになりました。これもナイス改善。

![ss_message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/e5fe4f97-35b8-4e48-dc31-bbc176be155f.png)

リリースノートにそれらしい記載は見つけられませんでした。もしかしたら、これかも？

* 2D: Added options to create WhiteBox Tile Palettes.

# 「マウスカーソルの位置を変更する」設定が追加

次の画像はUnity 2022.3において、「Isometric Z as Y map」なTilemapで、Z座標が5でTileを配置しようとしている図です。

![ss_unity20223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/13f93c1c-96e5-63cf-f703-bfb0828b621c.jpeg)

マウスカーソルの位置に注目してください。配置しようとしているTileの位置ではなくて、「Tileを配置しようとしている座標のZ=0な座標」にカーソルがあります。Unity 2022.3まではこのように

Isometric Z as Y mapなTilemapにおいて、Z座標が0ではない座標にTileを配置しようとする

と、

「Tileを配置しようとしている座標のZ=0な座標」にマウスカーソルがありました。

---

Unity 2023.1からこの「マウスカーソルの位置」を変更できる設定が追加されました。Preferences Window > 2Dタブ > Tile Paletteタブの「Mouse Grid Position At Z」が新たに追加された設定です。

![ss_mouse_grid_position_at_z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/a300d581-9568-f5ea-9deb-6a575ba61d94.png)


二つの画像のマウスカーソルの位置の違いに注目してださい。

|「Mouse Grid Position At Z」有効|「Mouse Grid Position At Z」無効|
|-|-|
|![ss_on.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/cb9b6d54-6884-811a-c318-38f77754c473.jpeg)|![ss_off.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/458c0153-62ce-4216-bafc-5363afab27dc.jpeg)|

左「Mouse Grid Position At Z」を有効では、「Tileを配置しようとしている座標（位置）」にマウスカーソルがあります。

右「Mouse Grid Position At Z」が無効では、「Tileを配置しようとしている座標（位置）のZ=0の位置」にマウスカーソルがあります。

このように、好みの設定でマウスカーソルの位置をいじれるようになりました。

[公式ドキュメント](https://docs.unity3d.com/2023.2/Documentation/Manual/Tile-Palette-Preferences.html)の「Effect of Mouse Grid Position At Z」の説明も参照してください。

リリースノートの記載は次のとおりです。

* 2D: Added preference option to Tile Palette Preferences for users to choose where they would want to position their mouse cursor when painting on Tilemaps with Z Position.

# SpriteMaskのソースにTilemapRendererなどが指定できるように

今まで[SpriteMask](https://docs.unity3d.com/2023.2/Documentation/ScriptReference/SpriteMask.html)は、マスクのソースとして、Spriteのみを指定できました。

Unity 2023.1で新たに、ソースとしてSpriteRenderer, SpriteShapeRendererそしてTilemapRendererを指定できるようになりました。

![ss_spritemask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/c16f2eae-dace-4d31-8fb9-ae175a71a251.png)

リリースノートの記載は次のとおりです。

* 2D: Added Sprite/SpriteShape/TilemapRenderer as mask sources for SpriteMask.

# 2D Tilemap Extrasがバージョン4にアップデート

2D Tilemap Extrasパッケージ(com.unity.2d.tilemap.extras)のバージョンも、4にアップデートされました。

現在の最新バージョンは、4.0.1です。

アップデート内容としては以下の通りです。

* GameObjectBrush用のGameObjectBrushEditor型のshouldSaveBrushForSelectionの実装の追加
* 各種ブラシにRenderStaticPreviewの追加
* 各種ブラシにアイコンの追加

公式の[CHANGELOG](https://docs.unity.cn/Packages/com.unity.2d.tilemap.extras@4.0/changelog/CHANGELOG.html)には、バージョン3.1で追加済み内容も4系のアップデート内容として含まれているようです。

# 各種パフォーマンスやユーザーエクスペリエンスの向上

リリースノートによると、次のようなパフォーマンス改善がされたようです。

* 2D: Improved the performance of creating a large number of Tile assets with the Tile Palette Window.
* 2D: Improved the performance of opening the Tile Palette Window when the Tile Palette references a large number of Tile assets. (UUM-26849)
* 2D: Improved the performance of TilemapRenderer when the user changes Material properties that does not require a BuildChunkJob. (UUM-53411)
* 2D: Improved the performance of creating a large number of Tile assets with the Tile Palette Window.
* 2D: Improved user experience for creating Tile Palettes.

# まとめ

この投稿では、Unity 2023.1およびUnity 2023.2のTilemapのアップデート内容を紹介しました。

Unity 2023系はテックストリームバージョンとして「Unity 2023.3」もリリースが予定されています。Unity 2023.3、そして続くUnity 6でのTilemapの新機能も楽しみです。

https://blog.unity.com/ja/engine-platform/2023-3-coming-april-2024-with-updates

# リンク集

* https://docs.unity3d.com/2023.1/Documentation/Manual/WhatsNew20231.html
* https://docs.unity3d.com/2023.2/Documentation/Manual/WhatsNew20232.html
* https://unity.com/releases/editor/whats-new/2023.1.0
* https://unity.com/releases/editor/whats-new/2023.2.0