【Unity】Terrainをオープンワールド化するための公式分割ツール TerrainToolbox の使い方【OpenWorld】【Terrain】

# TL;DR 
- Unityでオープンワールドゲームを作るならTerrainの分割が必須
- 昔は有志のAssetしかなかったが、現在は公式がサポート
- Terrainを分割してロードすることで負荷を低減させることが可能


# 概要
UE5だと [WorldPartition](https://docs.unrealengine.com/5.0/ja/world-partition-in-unreal-engine/) によってGrid単位でObjectのload/unload を管理することができます。
これにより、必要最低限のGridのリソースのみがメモリに載るため、パフォーマンスを稼ぐことが可能になります。
このような機能が最初から公式でサポートしているがために、UEではオープンワールドゲーム開発がしやすい環境があります。

一方Unity では一昔前までは地形モデルであるTerrain が生成しっぱなしで、分割・編集が非常に難しく、有志が公開しているツールを用いない限り分割ができず、巨大な1つのマップとして表示するしかありませんでした。
これにより、ただでさえPCゲームでなんとか動かせる状態なため、スマホ等モバイル環境ではTerrainを使うことが禁忌になるくらい重いため、自作のMeshによる地形データを作るしかありませんでした。

しかし、最近ではUnity公式に提供されている [TerrainToolbox](https://docs.unity3d.com/Packages/com.unity.terrain-tools@5.1/manual/index.html) により、Terrainの地形メッシュを任意サイズに分割→Prefab化をしてくれるようになりました。

これにより、プレイヤーの位置情報に基づいて必要なPrefab のみLoadすることで地形データのランタイムのパフォーマンスを稼ぐことが可能になりました。

# Terrain Toolbox
Unity2019 あたりから公式が開発してきたツールです。

https://docs.unity3d.com/Packages/com.unity.terrain-tools@5.1/manual/index.html

Unity2021LTS・Unity2022LTS現在では、オープンワールドゲーム制作支援のためのTerrainの分割ツールがサポートされるようになりました。

## 導入方法

1. ToolBar からWindow → PackageManager を選択
![スクリーンショット 2023-07-20 13.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/8b85d0f2-ad1e-6a07-9fd4-08976afa8be5.png)
1. +マーク右を選択して `Unity Registry` に変更
 ![スクリーンショット 2023-07-20 13.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/1380929c-9452-6b2d-c8e9-6d56abbcd527.png)
1. 画面右上の検索バーに `terrain` と入力すると候補が出てくるので `Terrain toolbox` を選択→画面右下のInstallボタンを選択
 ![スクリーンショット 2023-07-20 13.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/c2076e8e-ad0b-8cb6-990a-4f260e5d5578.png)

## 使い方

1. Window → Terrain → Toolbox を選択
 ![スクリーンショット 2023-07-20 13.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/d17dc317-a3bc-ef82-c266-fc4607c11e68.png)
1. CreateNewTerrain タブを選択して一番下のCreateボタンを押してTerrain基盤を作成
![スクリーンショット 2023-07-20 13.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/6cf4365f-23ff-59e4-3ca0-57f9ac766d76.png)
1. HierarchyにTerrainが生成されているので `Terrainコンポーネント` が付属しているObjectを選択して、Terrainを自由に編集します。
1. 編集後、再度ToolBox ウィンドウに戻り `TerrainUtilities` タブを選択します。
1. SplitTiles の数値を2の冪乗に設定してSplitボタンを押す(1辺の分割数を設定します）
    ![スクリーンショット 2023-07-20 16.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/6b1598fd-5c43-d59b-4fce-154e1c7fd448.png)
1. 成功するとHierarchy 及び Assets/Terrain/ 以下にObject/Assetファイルが生成されます
![スクリーンショット 2023-07-20 16.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/133fbb37-0dee-d13d-1c42-910d24130bd1.png)
![スクリーンショット 2023-07-20 16.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/828410c1-698d-c949-6d0a-d62274b23ff2.png)

# オープンワールドへの適応
先ほど生成した分割Terrainファイルを元に1アセット 1Prefab/1Scene に設定します。
（現状公式ツール等はないのでEditor拡張等で自動化することをおすすめです）

そして、作ったPrefab/Scene を動的にLoad/Unload することによってオープンワールド化ができます。

自作でシステムを構築してランタイムでロードするDemoを作ってみました。
（アンロードは実装してません）


<iframe width="560" height="315" src="https://www.youtube.com/embed/BGjO5UE4dm4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# まとめ

オープンワールドゲームを作るには必須のテクニックになっています。
Terrainを用いる場合は今回紹介したツールをうまく利用しましょう。