概要
「オープンワールドのゲームを作りたいけど、広大なマップをどうやって作ればいいんだろう…」
Unity Terrain は、Unity標準の地形作成システムで、広大な自然環境を効率的に作成できます。ブラシでペイントするように地形を編集し、テクスチャを塗り、木や草を配置することで、リアルな世界を作り上げることができます。
Terrainの作成
メニューからGameObject > 3D Object > Terrainを選択するだけで、1000x1000の平らな地形が生成されます。
5つの主要ツール
| ツール | 説明 |
|---|---|
| Create Neighbor Terrains | 隣接するTerrainタイルを作成 |
| Paint Terrain | 地形のスカルプトとテクスチャペイント |
| Paint Trees | 木を配置 |
| Paint Details | 草、花、岩などのディテールを配置 |
| Terrain Settings | 全般設定(サイズ、解像度、パフォーマンス) |
Paint Terrain:地形のスカルプトとペイント
スカルプトツール
| ツール | 説明 |
|---|---|
| Raise or Lower Terrain | 地形の高さを上げ下げ(Shiftで下げる) |
| Set Height | 特定の高さに設定(平らな台地作成に便利) |
| Smooth Height | 地形を滑らかに |
| Stamp Terrain | ブラシの形をスタンプ |
| Paint Holes | 地形に穴を開ける(洞窟入口など) |
洞窟の作成手順:
- Paint Holesで地形に穴を開ける
- 穴の位置に洞窟用の3Dメッシュを配置
- メッシュの端とTerrainの境界をシームレスに接続
- 必要に応じてコライダーを追加
ショートカット
| キー | 機能 |
|---|---|
, . | ブラシを切り替え |
[ ] | ブラシサイズを変更 |
- = | 不透明度を変更 |
F | カーソル位 置にカメラをフォーカス |
Terrain Layer:テクスチャのペイント
Terrain Layerの作成
- Paint Terrainツールを選択
- ドロップダウンから
Paint Textureを選択 Edit Terrain Layers > Create Layerをクリック- テクスチャを設定(Diffuse、Normal Map、Mask Mapなど)
テクスチャのペイント
- Terrain Layerを選択
- ブラシのサイズと不透明度を設定
- 地形をドラッグしてペイント
低い不透明度でペイントすると、下のレイヤーと自然にブレンドされます。
Terrain Layerの制限
| レンダーパイプライン | 最大レイヤー数 | 備考 |
|---|---|---|
| URP | 8レイヤー | シェーダーパス増加でパフォーマンス低下 |
| モバイル推奨 | 4レイヤー | パフォーマンスを維持するため |
| Built-in | 制限なし | ただし4レイヤーごとに描画パス増加 |
注意: レイヤー数が増えると描画パスが増加し、パフォーマンスが急激に低下します。モバイルでは4レイヤー以内に抑えることを推奨します。
Trees:木の配置
木の追加
- Paint Treesツールを選択
Edit Trees > Add Treeをクリック- 木のPrefabを選択
- 地形をドラッグして配置(Shiftで削除)
Mass Place Trees
Mass Place Treesで地形全体にランダムに木を一括配置できます。
木の設定
| 設定 | 説明 |
|---|---|
| Bend Factor | 風による揺れの強さ |
| Billboard Start | ビルボード表示に切り替わる距離 |
SpeedTree vs 通常Mesh: SpeedTreeアセットはLOD Group内蔵で自動的にLOD遷移しますが、通常のMeshはBillboard切り替えのみです。高品質な木を使う場合はSpeedTree対応のアセットを推奨します。
Details:草やディテールの配置
ディテールの種類
| 種類 | 説明 |
|---|---|
| Grass | Billboard(板ポリ)で表示。軽量 |
| Detail Mesh | 3Dメッシュで表示。立体的な表現 |
ディテールの追加
- Paint Detailsツールを選択
Edit Details > Add Grass TextureまたはAdd Detail Meshをクリック- 地形をドラッグして配置
Terrain Settings:設定とパフォーマンス最適化
基本設定
| 設定 | 説明 |
|---|---|
| Terrain Width/Length/Height | Terrainのサイズ |
| Heightmap Resolution | ハイトマップの解像度(2^n + 1) |
| Detail Resolution | ディテールの解像度 |
Heightmap Resolution目安
| プロジェクト規模 | 解像度 | 備考 |
|---|---|---|
| プロトタイプ・小規模 | 257×257 | メモリ消費が少ない |
| 一般的なゲーム | 513×513 | バランスが良い |
| 大規模オープンワールド | 1025×1025 | 高精細だがメモリ消費が大きい |
| 超大規模 | 2049×2049以上 | 複数タイルに分割推奨 |
Detail Resolution目安
| プロジェクト | 解像度 | Detail Resolution Per Patch |
|---|---|---|
| モバイル | 512〜1024 | 8 |
| PC/コンソール | 1024〜2048 | 16 |
| 高品質 | 2048〜4096 | 32 |
パフォーマンス設定
| 設定 | 説明 |
|---|---|
| Pixel Error | LODの精度(5〜50が一般的) |
| Base Map Distance | ベースマップに切り替わる距離 |
| Detail Distance | ディテールが表示される距離 |
| Tree Distance | 木が表示される距離 |
| Draw Instanced | GPU Instancingで描画を高速化 |
Draw Instanced: このオプションを有効にすると、GPU Instancingを使用してTerrainの描画が高速化されます。特に複数のTerrainタイルを使用する場合に効果的です。
Wind Settings(風の設定)
Terrain Settings > Wind Settings for Grassで草の揺れを設定できます。
| 設定 | 説明 |
|---|---|
| Speed | 風の速度 |
| Size | 風の波の大きさ |
| Bending | 草の曲がり具合 |
Grass Tint: 同じセクション内にある「Grass Tint」は草の色味を調整する設定で、風の影響とは別の見た目調整です。
Wind Settingsの適用範囲:
- Detail(Grass Texture、Detail Mesh) → 影響を受ける
- Tree(Paint Treesで配置した木) → 影響を受けない(TreeはBend Factorで個別に設定。SpeedTreeの場合はSpeedTree側のWind設定が使用される)
複数のTerrainタイル
大規模なマップを作成する場合、複数のTerrainタイルに分割することでパフォーマンスを向上させることができます。
タイルの作成
- Terrainを選択
- Create Neighbor Terrainsツールをクリック
- どの方向にタイルを作成するかを選択
タイルは自動的にシームレスに接続されます。
TerrainGroupによる一括管理
大規模なマップでは、Terrain.SetNeighbors()でタイル間の接続を設定し、TerrainGroup コンポーネントで複数のTerrainを一括管理できます。
Terrain Tools: Terrain Toolsパッケージ(Unity 2022以降ではプレインストールされている場合あり)を使用すると、複数タイルの一括編集がさらに便利になります。
Heightmapのインポート・エクスポート
Terrain Settings > Import Raw / Export Rawで、16bit RAW形式のファイルを入出力できます。World Machine、Gaiaなど外部ツールとの連携や、Photoshopで作成したグレースケール画像からの地形生成に使用します。
スクリプトからの地形操作
TerrainDataを使って、スクリプトから地形を操作できます。
using UnityEngine;
public class TerrainModifier : MonoBehaviour
{
Terrain terrain;
TerrainData terrainData;
void Start()
{
terrain = GetComponent<Terrain>();
terrainData = terrain.terrainData;
}
// 高さを取得・設定(x, yはピクセル座標)
// 重要: heights配列のインデックスは[y, x](行, 列)の順
// terrainData.GetHeights(xBase, yBase, width, height)の引数は(x, y)順
// だが、返される配列は heights[y, x] でアクセスする
public void ModifyHeight(int x, int y, float height)
{
float[,] heights = terrainData.GetHeights(x, y, 1, 1);
heights[0, 0] = height; // 0〜1の範囲
terrainData.SetHeights(x, y, heights);
}
// ワールド座標からピクセル座標へ変換(範囲チェック付き)
// heightmapResolutionが513の場合、有効なピクセル座標は0〜512
public Vector2Int WorldToHeightmapCoord(Vector3 worldPos)
{
Vector3 terrainPos = worldPos - terrain.transform.position;
int maxIndex = terrainData.heightmapResolution - 1;
int x = Mathf.Clamp(
Mathf.RoundToInt(terrainPos.x / terrainData.size.x * maxIndex),
0, maxIndex);
int y = Mathf.Clamp(
Mathf.RoundToInt(terrainPos.z / terrainData.size.z * maxIndex),
0, maxIndex);
return new Vector2Int(x, y);
}
// テクスチャ(Alphamap)を設定
public void PaintTexture(int x, int y, int layerIndex)
{
float[,,] alphas = terrainData.GetAlphamaps(x, y, 1, 1);
// すべてのレイヤーをリセット
for (int i = 0; i < alphas.GetLength(2); i++)
alphas[0, 0, i] = 0;
alphas[0, 0, layerIndex] = 1;
terrainData.SetAlphamaps(x, y, alphas);
}
}
用途: プロシージャル地形生成、ランタイムでの地形変形(掘削、整地など)に使用します。
座標系の注意:
heightmapResolutionとalphamapResolutionは異なる値を返す場合があります。Heightmap座標とAlphamap座標を混同しないよう注意してください。
HeightmapとAlphamapの解像度の違い:
| プロパティ | 値の特徴 | 例 |
|---|---|---|
| heightmapResolution | 2^n + 1 | 513, 1025 |
| alphamapResolution | 2^n | 512, 1024 |
Perlinノイズによるプロシージャル地形生成
public void GenerateProceduralTerrain(float scale, float heightMultiplier)
{
int res = terrainData.heightmapResolution;
float[,] heights = new float[res, res];
// オフセットを加えることでバリエーションを生成
// Mathf.PerlinNoiseは同じ入力で常に同じ結果を返すため
float offsetX = Random.Range(0f, 10000f);
float offsetY = Random.Range(0f, 10000f);
for (int y = 0; y < res; y++)
{
for (int x = 0; x < res; x++)
{
heights[y, x] = Mathf.PerlinNoise(
(x + offsetX) / (float)res * scale,
(y + offsetY) / (float)res * scale
) * heightMultiplier;
}
}
terrainData.SetHeights(0, 0, heights);
}
Terrain Toolsパッケージ
Terrain Tools パッケージをインストールすると、追加のスカルプトツールや侵食シミュレーションなどの高度な機能が使えます。
インストール方法
Window > Package Managerを選択+ボタンからAdd package by name...を選択com.unity.terrain-toolsを入力してインストール
追加されるツール
| ツール | 説明 |
|---|---|
| Bridge | 2つの地点を橋で接続 |
| Clone | 地形の一部をコピーペースト |
| Erosion | 侵食シミュレーション(風化、水流など) |
| Terrace | 段々畑のような階段状の地形を作成 |
| Noise | ノイズベースの地形生成 |
まとめ
Unity Terrainは、大規模な自然環境を効率的に作成できる強力なシステムです。
- Paint Terrain - ブラシで地形をスカルプト、テクスチャをペイント
- Paint Trees / Paint Details - 木や草を素早く配置
- LODとカリング - パフォーマンス最適化機能が充実
- 複数タイル - 巨大なオープンワールドにも対応
ぜひ、Terrainを活用して、あなただけの広大な世界を作り上げてください。