top of page

【Unity】移動領域を限定した自動追尾/移動範囲内に収まる挙動の実装

  • uniteen
  • 2015年6月13日
  • 読了時間: 2分

おもに3Dゲームで利用される敵の自動追尾と、移動範囲外にでないようにする実装方法についてご紹介。

自動追尾についてはスクリプトで、プレイヤーのtransform値まで

自動で追尾することもできますが、問題点として多く挙げられるのは、

壁をすり抜けて、テレサ状態になる

というものです。下図のように、いきなり壁から出現するような感じですね。

スクリーンショット 2015-06-13 21.54.12.png

まあそういう風にしたいのであれば、

void Update () { Vector3 playerPos = player.position; //プレイヤーの位置 Vector3 direction = playerPos - transform.position; //方向 direction = direction.normalized; //単位化(距離要素を取り除く) transform.position = transform.position + (direction * speed * Time.deltaTime); transform.LookAt (player); //プレイヤーの方を向く }

というスクリプトを、敵側に追加してやればいいのですが、

壁すり抜けとか、移動範囲外からいきなり出てくるのはやだなぁ・・・・

というのであれば、Unityの基本機能である、

ナビゲーションメッシュ

を使ってあげればいいかなと思います。

わかりやすい解説など

【http://udasankoubou.blogspot.jp/2014/01/unity_28.html】

【http://www.lameije.co.jp/navigationmesh.html】

【http://tsubakit1.hateblo.jp/entry/20131104/1383573538】

【http://blog.cosmocleaner.info/unity_navmesh_obstacle/】

ナビゲーションメッシュ

スクリーンショット 2015-06-13 22.29.55.png

UnityのWindow画面から、Navigationを追加すると

inspectorの横にこのタブが出現します。

【使い方】

①追尾させたい敵に「Nav Mesh Agent」を追加

スクリーンショット 2015-06-13 22.55.54.png

各種設定はとりあえず無視で大丈夫です。

細かい設定をしたいのなら、各自ググって

調べてください。

②障害物をNavigation Static にする(インスペクタ右上。Static チェックで OK)

スクリーンショット 2015-06-13 23.06.16.png

③メニュー -> Window -> Navigation -> Bake タブ -> Bake ボタンで通れる場所を設定

スクリーンショット 2015-06-13 23.27.16.png

Radiusを増やすと、移動可能面積が減ります。移動可能なスロープの角度なども設定できますので、詳しいところは各自いじってみると面白いかと。

④あとは、先述したようなスクリプトでプレイヤーの位置まで移動させるよう指示すればおけ。

using UnityEngine;

public class MoveToTarget : MonoBehaviour {

 public Transform target;//目的地、プレイヤーをあてこむ

 NavMeshAgent agent;

void Start () {

 agent = GetComponent<NavMeshAgent>();

 }

void Update () {

 agent.SetDestination(target.position);

 }

}

また、プレイヤー自身にNav Mesh Agentを適用すれば、

マップから落ちないように自動で移動制限がかかるので、

モンハンなど大規模なマップ移動系のゲームを作るときは、

本当に便利な機能だなと思います。

また、動く障害物を意識する場合は、それにNavmeshObstacleを追加しておけば、

勝手に再計算をしてくれるようになります。

では。


 
 
 

Comments


  • Facebook Black Round
  • Google+ Black Round
  • Twitter Black Round
bottom of page