2016年1月23日土曜日

UnityのTerrainで作った世界にNavMeshを設定してうろつく


まずは、Terrainを使って土地を作ってみます。
これが完成図。

GameObject3D ObjectからTerrainを設置します。

Inspectorの歯車のマークから色々と設定を変更できます。

とりあえず今回マップは狭くていいので、下のほうのResolutionからサイズを変更します。

サイズの設定が終わったら、早速土地の形状を作成していきます。

歯車マーク並びの左端から三つめまでが形状を変化させるツールです。
左から、引き上げor引き下げ、高さ指定で引き上げor引き下げ、起伏を均すという三つのツールです。

どーん。

これだけだと石膏みたいなので、それっぽいテクスチャとかを用意したいところですが極めて面倒です。

そこで、標準で用意されているAssetがあるのでそれを使います。

AssetsImport PackageからEnvironmentを追加します。
※古いバージョンのUnityではTerrain Assetだった模様。

少し時間がかかりますが、インポートが終わったら筆マークを選択し、Edit Texturesからテクスチャを選択して貼っていきます。

何種類かのテクスチャを貼っていくと、絵心ゼロでもとりあえずそれっぽくなります。

次に筆マークの右側の木のマークから、木を生やします。

最後にもう一つ右側の花のようなマークから、草を生やします。

せっかく島っぽくしたので、海も作ってみましょう。

先ほどインポートしたStandard Assetsフォルダの中のEnvironmentフォルダにWaterフォルダがいくつかあるので、その中のPrefabsフォルダから適当に追加します。

追加された板のようなものが水面になるので、サイズと位置を適当に調節します。

ここまでやると、意外とそれっぽくなります。


次に、せっかくなのでAssetストアからUnityちゃんをインポートして歩かせてみます。

経路探索のアルゴリズムとかを一から実装するのはダルすぎるので、NavMeshの設定をします。

まず、TerrainをStaticにします。(デフォルトでなってました)

Inspectorの横当たりにNavigationというタブがあるので開きます。
無ければメニューのWindowからNavigationを選択すると開きます。

Navigationタブを開くと一番下にBakeというボタンがあるので押します。

歩ける部分が青く表示されます。

次にUnityちゃんのほうに、Nav Mesh Agentを追加します。

NavMeshAgentSetDestination()に位置を渡すと移動できるので、左クリックした場所に移動するようにスクリプトを追加します。

UnityちゃんのデフォルトのAnimator Controllerでは、速度によって歩くアニメーションとアイドルが切り替わるようになっていたのですが、面倒なのでbool値のパラメータwalkを追加しました。

RaycastHit hit;
Ray ray;

NavMeshAgent agent;
Animator animator;

void Start () {
 agent = GetComponent<NavMeshAgent>();
 animator = GetComponent<Animator>();
}

void Update () {
 if (Input.GetMouseButton(0)) {
  ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  if (Physics.Raycast (ray, out hit, 1000)) {
   agent.SetDestination (hit.point);
   animator.SetBool ("walk", true);
  }
 }
 if (Vector3.Distance(hit.point, transform.position) < 1.0f) {
  animator.SetBool ("walk", false);
 }
}

ちゃんと障害物を迂回して歩いてくれました。

0 コメント:

コメントを投稿