しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で NavMeshAgent が避ける障害物を動かす

※ これは 2021/03/26 時点の Unity 2020.3.1f1 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

エイプリルフール!

前回は2匹のねこキャラを速度を変えて動かしてみた

今回は下記のような障害物となる色違いの箱を置いて左右に動かしてみたい

障害物の動く箱

2匹のねこキャラがこの動く箱を避けるようにする

まず下記のような NavMeshObstaclePrefab を作る

NavMeshObstacle

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 を追加して下記のように設定

Script 設定

先ほどの Prefab を Obstacle Prefab に指定し、動かす左右の目的地を Targets に指定するだけ

これでお試し!

左右に動く障害物

いい感じにねこキャラの行く手をさえぎるようになった!