Unity で NavMeshAgent が避ける障害物を動かす
※ これは 2021/03/26 時点の Unity 2020.3.1f1 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
エイプリルフール!
前回は2匹のねこキャラを速度を変えて動かしてみた
今回は下記のような障害物となる色違いの箱を置いて左右に動かしてみたい
2匹のねこキャラがこの動く箱を避けるようにする
まず下記のような NavMeshObstacle
の Prefab
を作る
NavMeshObstacle
は NavMesh 用の障害物で NavMeshAgent
はこれを避けて動くようになる
次に下記のような Obstacle.cs
のスクリプトを作成
using UnityEngine; using UnityEngine.AI; public class Obstacle : MonoBehaviour { [SerializeField] private GameObject obstaclePrefab = null; [SerializeField] private Vector2[] targets = null; private NavMeshObstacle obstacle = null; private int index = 0; public void Start() { this.obstacle = Instantiate(this.obstaclePrefab, this.transform.position, Quaternion.identity, this.transform) .GetComponent<NavMeshObstacle>(); } public void Update() { var position = (Vector2)this.transform.position; var target = this.targets[this.index]; // 目的地が近づいたら次の目的地を目指す if (Vector2.Distance(target, position) < 0.3f) { this.index = (this.index + 1) % this.targets.Length; return; } this.transform.Translate((target - position).normalized * 1f * Time.deltaTime); } }
例によって NavMeshObstacle
も 3D 用なので直接埋め込まず、別途 GameObject
にして座標を追従するようにする
最後にこの Obstacle.cs
を張り付けた GameObject
を追加して下記のように設定
先ほどの Prefab
を Obstacle Prefab に指定し、動かす左右の目的地を Targets に指定するだけ
これでお試し!
いい感じにねこキャラの行く手をさえぎるようになった!