【Unity】移動領域を限定した自動追尾/移動範囲内に収まる挙動の実装
- uniteen
- 2015年6月13日
- 読了時間: 2分
おもに3Dゲームで利用される敵の自動追尾と、移動範囲外にでないようにする実装方法についてご紹介。
自動追尾についてはスクリプトで、プレイヤーのtransform値まで
自動で追尾することもできますが、問題点として多く挙げられるのは、
壁をすり抜けて、テレサ状態になる
というものです。下図のように、いきなり壁から出現するような感じですね。

まあそういう風にしたいのであれば、
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/】
ナビゲーションメッシュ

UnityのWindow画面から、Navigationを追加すると
inspectorの横にこのタブが出現します。
【使い方】
①追尾させたい敵に「Nav Mesh Agent」を追加

各種設定はとりあえず無視で大丈夫です。
細かい設定をしたいのなら、各自ググって
調べてください。
②障害物をNavigation Static にする(インスペクタ右上。Static チェックで OK)

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

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