今回はゲーム開始の村の作成をしていきたいと思います。
村はUnityのTerrainを使って作成していきます。
前回は移動キーを押した時にユニティちゃんが移動するところまでを作成しました。
ユニティちゃんのRPGを作ってみようの他の記事は
から見ることが出来ます。
Standard Assetのインポート
今回村で使用する地面のテクスチャ(模様)や生やす木などはUnityのStandard Assetをインポートしその中の素材を使いたいと思います。
Ctrl+9キーもしくはUnityのWindowメニューからAsset Storeを選択し、Asset Storeウインドウを開きます。
アセットの検索に「StandardAsset」と入力し出てきたUnityさんが作ったスタンダードアセットをクリックします。
インポートボタンを押してアセットをインポートします。
Unity内で出てきたウインドウでそのままImportボタンを押してインポートします。
インポートが終了したら
Asset Storeウインドウのタブ上で右クリックしてClose Tabを選択しAsset Storeウインドウを閉じます。
ここでスタンダードアセットにあるSimple Activator Menuというスクリプトでエラーが発生している場合はAssets/Standard Assets/Utility/SimpleActivatorMenu.csファイル自体を削除します。
村の作成
以前作成したサンプル用の地面SampleGroundは使わなくなったので選択しDeleteキーを押して削除します。
次にヒエラルキー上で右クリックからCreate Emptyを選択し、名前をVillageとします。
VillageのTransformのPosition、RotationのXYZを0にします。
Terrainを使って村の地面を作成していきます。
Terrainに関しては
も参照してみてください。
ヒエラルキー上で右クリックからCreate→3D Object→Terrainを選択し、VillageGroundという名前に変更します。
VillageGroundをVillageにドラッグしVillageの子要素にします。
RPGフォルダで右クリックからCreate→Folderを選択し、名前をFieldとします。
Fieldフォルダ内で右クリックからCreate→Folderを選択し、名前をFirstVillageとします。
AssetsにNew Terrainというファイルが作成されているのでFirstVillageの中に移動させておきます。
New Terrainを選択した状態でF2キーを押し名前をFirstVillageに変更します。
VillageGroundゲームオブジェクトを選択し、インスペクタの歯車を押してTerrainの設定を変更します。
TerrainのMesh ReSolutionでTerain WidthとTerrain Lengthを40にします。
VillageGroundのTransformのPositionのXとZを-20にし、VillageGroundの真ん中がXYZの0の位置にくるようにしておきます。
これは単にわかりやすくユニティちゃんの位置が中心になるようにしたかっただけなので位置は適当に決めて構いません。
地形に模様を付ける
次にTerrainのPaint Terrainを選択し、その下をPaint Textureにし、その下のEdit Terrain Layerを押します。
Create Layerを選択したら、新しく出てきたウインドウの検索窓に「grass」と入力し出てきたGrassHillAlbedoを選択します。
するとTerrainの地面がこのテクスチャで塗られます。
AssetsフォルダにNew Layerという名前のレイヤーが出来るのでF2キーを押して名前をGrassLayerと変更し、Assets/RPG/Field/FirstVillageフォルダ内に移動させます。
地形にデコボコを付ける
次に地面にデコボコを付けていきます。
TerrainのPaint Textureの部分をRaise or Lower Terrainに変更し、Brush Sizeでブラシのサイズ、Opacityでデコボコの度合いを設定します。
上の設定はあくまでも例なのでどんな村にするかで設定を変えてみてください。
次にシーンビューの地面上をクリックすると地面が盛り上がり、Shiftキーを押しながらクリックすると地面が下がります。
Raise or Lower Terrainの部分をSet Heightにするとドラッグしても最高の高さが指定した高さまでしか地面を盛り上げません。
Smooth Heightにすると段差をスムーズにすることが出来ます。
Stamp Terrainにするとスタンプを押したように盛り上がりを作成します。
わたくしは以下のような村の地形を作成しました。
自由に作成してみてください。
村に草と木を生やす
村の地形はできましたので、草や木を生やしていきます。
草や木については
も参照してみてください。
木を生やす
まずは木を生やしていきます。
TerrainのPaint Treesを選択し、Edit Treesボタンを押してAdd Treeを選択します。
新しく出てきたウインドウのTree PrefabにBroadleaf_Desktopを設定しAddボタンを押します。
このBroadleaf_Desktopプレハブには既にコライダが設定されており衝突するようになっています。
他の木のプレハブを生やした時にユニティちゃんがすり抜けてしまう場合は木のプレハブにCapsule Collider等を取り付けそれをプレハブにした上でTerrainでその木を指定する必要があります。
Tree Heightで木の高さの範囲を選択出来、Lock Width to Heightにチェックを入れると幅を高さの比率に合わせます。
Mass Place Treeを押すと新しいウインドウが表示され、Number Of Treesで本数を指定して木を自動で配置する事が出来ます。
Keep Existing Treesにチェックを入れておくと既に配置した木はそのままで新たにNumber Of Trees分の木を生やします。
今回は村が小さいのでシーンビューで地面をクリックし、一本一本木を生やしていきます。
Brush Sizeを1にすると1本ずつ木を生やせます。
木を生やすにはTreesの木のプレハブを選択した状態でシーンビューのTerrainの地形をクリックします。
Shiftキーを押しながら木をクリックすると削除することが出来ます。
わたくしは以下のような感じで木を生やしました。
草を生やす
次は草を生やしていきます。
TerrainのPaint Detailsを押して、Edit Detailsボタンを押してAdd Grass Textureを選択します。
Add Grass Textureウインドウが開くのでDetail TextureにGrassFrond02AlbedoAlphaを設定します。
Min Widthで最小の幅、Max Widthで最大の幅、Min Heightで最小の高さ、Max Heightで最大の高さ等を設定します。
草のテクスチャを選択した状態でシーンビューのTerrain上をクリックすると草を生やせます。
Shiftキーを押しながらクリックすると草を削除します。
TerrainのOpacityで草の密度を変更出来ます。
わたくしは以下のように人の通る場所は草を少なく生やしてみました。
人が通る場所の地面を荒らす
通常であれば人がよく通る場所は地面が少し荒れるというか道が出来ます。
そこで人が通る部分に別のテクスチャで塗って通り道を作っていきます。
Paint Terrainを選択し、Paint Textureを選択し、Edit Terrain LayerssからCreate Layerを選択し、GrassRockyAlbedoを指定します。
Assetsフォルダに作成されたNew LayerはF2キーを押して名前をGrassRockyLayerとし、Assets/RPG/Field/FirstVillageフォルダ内に移動させます。
後は今作成したGrassRockyAlbedoを選択してシーンビューで人が通る道をドラッグしてテクスチャを塗っていくだけです。
わたくしは上のような感じで人の通り道を塗りました。
草や木が風に揺れるようにする
次に草や木が風よって揺れるようにしていきます。
草の風の設定はTerrainの歯車から設定出来ます。
今回は上のような設定にしました。
次に木を風に揺らすようにしていきます。
木を風によって揺らすには
も参照してみてください。
ヒエラルキー上で右クリックから3D Object→Wind Zoneを選択します。
Wind ZoneのModeはDirectionalでシーン全体に、Sphereで指定した範囲内だけ風を起こします。
Mainはメインの風の強さTurbulenceは突風の風の強さ
Pulse Magnitudeは時間経過により変化する大きさ
Pulse Frequencyは時間経過によって変化する頻度になります。
今回はWind Zoneの設定を以下のようにしました。
Wind Zoneをシーン上に追加したので、木が風によって揺れるようになります。
これで村が出来上がりました。
ユニティちゃんを動かして村を確認する
最後にユニティちゃんを動かして村がどうなっているかを見て回ってみましょう。
ただこのまま動かすとカメラが動かないのでユニティちゃんを追いかけることが出来ません。
そこでMain CameraのインスペクタのAdd Componentから検索窓に「follow」と入力しスタンダードアセットのFollow Targetをメインカメラに取り付けます。
Follow Targetはインスペクタで設定したTargetを設定したゲームオブジェクトが距離を保って追いかけていきます。
Main CameraのRotationのXを変更してカメラが少し斜めから移すようにします。
またFollow TargetのTargetにUnityChanゲームオブジェクトをドラッグ&ドロップして設定し、OffsetでUnityChanからの距離を設定します。
上のように設定しましたが、好みの位置や角度に調整してみてください。
ユニティちゃんが山を登ってしまう
ユニティちゃんに取り付けたCharacterControllerの設定だとSlope Limit(登れる傾斜角度)が45でStep Offset(登れる段差の高さ)が0.3となっている為に多少の傾斜や段差だと山を登って村の地形外へ出てしまう可能性があります。
そこでUnityChanゲームオブジェクトを選択し、インスペクタでCharacterControllerの設定を変更します。
Slope Limitを15、Step Offsetを0.1にしました。
他にはCube等のサイズを変更して壁を作り、インスペクタのMesh Rendererの横のチェックを外して無効にすれば透明な壁が出来るのでどうしても山に登ってしまう時は透明な壁を配置しておくといいかもしれません。
これで設定が出来たのでUnityを実行して村の中を歩き回ってみましょう。
上のような感じになりました。
終わりに
今回はTerrainで村を作る事に特化しましたが、本当は村人との会話機能も盛り込もうと思ってました。(^_^;)
しかし思いのほか記事が長くなったのでそれは次回に持ち越します。
今回作成したTerrainの地形は盛り上げ方によってはカメラが地形の中を写してしまう事があります。
これはこのままカメラが固定の位置と角度でユニティちゃんを追いかける場合は地形の中身が見えないようにTerrainを作成する必要があります。
高い山を作らずCharacterControllerのSlope LimitやStep Offsetを調整して移動出来る範囲を狭めた方が楽かもしれないですね。
これ以降の記事でCinemachineを使ったカメラ操作に切り替えるので、地形の中身が見える事は極力なくなります。
この作品はユニティちゃんライセンス条項の元に提供されています