TL;DR
- Unityでオープンワールドゲームを作るならTerrainの分割が必須
- 昔は有志のAssetしかなかったが、現在は公式がサポート
- Terrainを分割してロードすることで負荷を低減させることが可能
概要
UE5だと WorldPartition によってGrid単位でObjectのload/unload を管理することができます。
これにより、必要最低限のGridのリソースのみがメモリに載るため、パフォーマンスを稼ぐことが可能になります。
このような機能が最初から公式でサポートしているがために、UEではオープンワールドゲーム開発がしやすい環境があります。
一方Unity では一昔前までは地形モデルであるTerrain が生成しっぱなしで、分割・編集が非常に難しく、有志が公開しているツールを用いない限り分割ができず、巨大な1つのマップとして表示するしかありませんでした。
これにより、ただでさえPCゲームでなんとか動かせる状態なため、スマホ等モバイル環境ではTerrainを使うことが禁忌になるくらい重いため、自作のMeshによる地形データを作るしかありませんでした。
しかし、最近ではUnity公式に提供されている TerrainToolbox により、Terrainの地形メッシュを任意サイズに分割→Prefab化をしてくれるようになりました。
これにより、プレイヤーの位置情報に基づいて必要なPrefab のみLoadすることで地形データのランタイムのパフォーマンスを稼ぐことが可能になりました。
Terrain Toolbox
Unity2019 あたりから公式が開発してきたツールです。
Unity2021LTS・Unity2022LTS現在では、オープンワールドゲーム制作支援のためのTerrainの分割ツールがサポートされるようになりました。
導入方法
- ToolBar からWindow → PackageManager を選択
- +マーク右を選択して
Unity Registry
に変更
- 画面右上の検索バーに
terrain
と入力すると候補が出てくるのでTerrain toolbox
を選択→画面右下のInstallボタンを選択
使い方
- Window → Terrain → Toolbox を選択
- CreateNewTerrain タブを選択して一番下のCreateボタンを押してTerrain基盤を作成
- HierarchyにTerrainが生成されているので
Terrainコンポーネント
が付属しているObjectを選択して、Terrainを自由に編集します。 - 編集後、再度ToolBox ウィンドウに戻り
TerrainUtilities
タブを選択します。 - SplitTiles の数値を2の冪乗に設定してSplitボタンを押す(1辺の分割数を設定します)
- 成功するとHierarchy 及び Assets/Terrain/ 以下にObject/Assetファイルが生成されます
オープンワールドへの適応
先ほど生成した分割Terrainファイルを元に1アセット 1Prefab/1Scene に設定します。
(現状公式ツール等はないのでEditor拡張等で自動化することをおすすめです)
そして、作ったPrefab/Scene を動的にLoad/Unload することによってオープンワールド化ができます。
自作でシステムを構築してランタイムでロードするDemoを作ってみました。
(アンロードは実装してません)
まとめ
オープンワールドゲームを作るには必須のテクニックになっています。
Terrainを用いる場合は今回紹介したツールをうまく利用しましょう。