ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】NavMeshAgentのMoveを使うとisOnOffMeshLinkが常にfalseになるお話

time 2020/06/30

今回はUnityのNavMeshに関するちょっとしたお話です。
検証で使用したUnityのバージョンは「2019.3.0f6」です。

前回のunity1weekで作成した「うさぴょんと密なアザラシ」では、移動制御にNavMeshを使用しています。
テラシュールブログさんの以下の記事を見て、NavMeshAgentMove()を使用する方式にしてみました。
http://tsubakit1.hateblo.jp/entry/20131104/1383573538

しかしMove()を使うとisOnOffMeshLinkが常にfalseを返すようになります。
どうもOffMeshLinkのポイントに乗ったかどうかを認識してくれないようで、当然autoTraverseOffMeshLinkのtrue/falseに関わらず移動もしてくれません。

それでも強引に判定を取りたい場合、SetDestination()に「現在地の少し前方」を設定してあげると、isOnOffMeshLinkがポイントに乗ったときにtrueを返してくれるようになります。
具体的にはこんな感じ。

[SerializeField]
protected NavMeshAgent navMeshAgent;

void Start()
{
    navMeshAgent.autoTraverseOffMeshLink = false;
}

void Update()
{
    Vector3 moveDirection = Vector3.zero;

    /* 中略(ここでmoveDirectionに移動ベクトルを設定) */

    navMeshAgent.Move(moveDirection * Time.deltaTime);

    navMeshAgent.SetDestination(transform.position + transform.forward);
    Debug.Log(navMeshAgent.isOnOffMeshLink);
}

これでOffMeshLinkを認識するようになります。

あとはDOTweenなりで移動させた後でCompleteOffMeshLink()を呼んであげればOKです。

Unity的には「Move()を使う場合はOffMeshLinkは使わない」想定なのかもしれません。
ただマニュアルのどこにもそんなこと書いていないので、若干バグ臭い挙動でもありますね。

down

コメントする