Unity terrain を使ってみよう

Unity

Unityには強力な地形生成機能が備わっている今回はそれの使い方を学ぼう

プロジェクトの作成

terrainappという名前で3Dプロジェクトを新規に作成する。

Standard Assetsのインポート

TerrainはStandard Assetsをインポートすると使えるようになる。まずはアセットストアを開いてStandard Assetsをすべてインポートしよう。

現在(2023)アセットストアからダウンロードできないようです。
以下からダウンロードしてください。
joytas.net/downloads/standard.unitypackage

バージョンによるエラーの修正

実行するUnityのバージョンによってはスクリプトエラーがでることがある。
もし、SimpleActivatorMenu.csにエラーが発生した場合には以下のように修正する。

using System;
using UnityEngine;
using UnityEngine.UI;

#pragma warning disable 618
namespace UnityStandardAssets.Utility
{
    public class SimpleActivatorMenu : MonoBehaviour
    {
        // An incredibly simple menu which, when given references
        // to gameobjects in the scene
        public Text camSwitchButton;
        public GameObject[] objects;


        private int m_CurrentActiveObject;
//略
}

Terrainの作成

新規から3DオブジェクトからTerrainを作成する

Terrainの初期設定

Terrainは処理が重いので以下のように設定する。(ハイスペックパソコンの場合不要)

Pixel Error -> 50
マッピング精度の設定。この値が大きいほど精度が低くなる。

Detai Density->0.1
Terrainに配置される草などの密度に影響する。低いと草木がまばらに表示される。

地面の設定

Terrainの地面の初期状態の高さは0である。これだと掘り下げることができないのでまずは全体の高さを100に設定しFlatten Allを押す

これでTerrainの標高が100mになった。Trerrainがグローバル空間の原点に配置されるようにtransformを調整する。(terrainの大きさは初期値1000*1000)

地形の作成

それでは実際に地面を作成していこう。

Raise or Lower Terrain

一番基本となる作業がRaise or Lower ツールだ。
これはペン先形状を選び、ブラシサイズと変化度を調整しながらお絵かきをするようにTerrainの形状を変更していく。クリックすることで地形が盛り上がり、shiftを押しながらクリックすることで下げることができる。
このあと、川や池なども配置するのでそれを考慮しながら作成するとよい。

Set Height

ある程度共通の高さの部分を作りたい場合はSet Heighツールが便利だ。
基準となる高さを選択し、その高さにしたい部分をドラッグして塗っていく。

Smooth Height

凸凹になりすぎた部分があった場合はSmooth Heightを選択し、なぞっていくことで平均化することができる。

地面の着色

地面に着色をしていく、まずはPaintTextureからEditTerrainLayersをクリック

プルダウンが開くのでCreate Layerをクリック。
検索窓にgraと入力して、GrassHillAlbedoを選択する

grassで全体がペイントされた!

同じ手順で以下のテクスチャをCreateLayerから追加しよう。
○CliffAlbedoSpecular
○GrassRockyAlbedo
○MudRockyAlbedoSpecular
○SandAlbedo

あとは先程と同じようにLayerを選択して、ペン先や太さなどを調整しながらペイントしていく。

木を植える

木のアイコンを選びEditTreesを押す

プルダウンからAdd Treeを選ぶとWindowが開くので以下のようにBroadleaf_Desktopを選択

選択ができたらAddを押す

ペイント

ブラシのサイズ、木を生やす密度、木の高さなどを設定しながらペイントしていく。shiftを押すことによって生やしすぎた場所などから消去することができる

木の種類を増やす

先程と同じ手順を踏んで、以下の木も登録しよう。
○Conifer_Desktop
○Palm_Desktop

木の種類を選択しながらTerrainをペイントしていく

草を生やす

草のアイコンを選択し、EditDetailsを押してまずは素材を作成する

プルダウンからAdd Grass Textureを選択すると画面が開くので
GrassFrond01AlbedoAlphaを選択し、Addする

あとは木と同様にペイントしていこう。ただし、草は非常に負荷が高いのでかなり近づかなければ見ることができない。この距離はセッティングのDetailDistanceから調整できる。長く設定すると遠くから見えるようになるが、ここらへんはマシンスペックと相談しながら行なうとよいだろう。

根気がいる作業だが、じっくりと行おう。

水の配置

水を配置していこう。Projectビューの検索まどに
WaterPro
と入力して
WaterProDaytime
プレファブをヒエラルキーにドラッグする

Scaleを1000*1000にして海面の高さ(PositionのY)を地形に合わせて調整する。

必要であれば、複数プレファブを配置する。(このMapでは川と池の2つを配置した)

風を吹かせる

ヒエラルキーから3DObject->Wind Zoneを作成する

風の強さであるMainを0.2,ランダム性を与えるTurbulenceを0.3に設定しよう。
ゲームを再生していみると風で木や草が揺れることがわかる。

空を追加

Asset Storeにアクセスし
Wispy Skybox
をダウンロード&インポートする(すべて)

Window->Rendering->Lighting Settingsを選ぶ

Skybox Materialに
WispySkyboxMat
を設定する

空がリアルになった!

skyboxで昼夜を表現する

Projectビューから新規materialを選択し、名前をMySkyboxとして、シェーダーを
Skybox->procedural
にする

再び
Window->Rendering->Lighting Settings
を開いてSkybox MaterialをMySkyboxにする

おお、空が変わった!

SkyboxProceduralシェーダーはdirectionalLight(太陽)の角度によって描画が変わる
Directional Lightを選択してRotationのxを動かしてみよう。

太陽の向きによって昼夜が再現される

スクリプトサンプル

以下のようなSkyControllerスクリプトを作成し、DirectionalLightに付与すると自動的に昼夜が入れ替わる。(この作例ではわかりやすいように30秒で1日間を表している)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkyController : MonoBehaviour
{

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(new Vector3(-12f * Time.deltaTime,0f,0));
    }
}
Unity
スポンサーリンク
シェアする
mjpurinをフォローする

コメント

タイトルとURLをコピーしました