2020/11/09
今回はUnityのNavMeshに関するちょっとしたお話です。
検証で使用したUnityのバージョンは「2019.3.0f6」です。
前回のunity1weekで作成した「うさぴょんと密なアザラシ」では、移動制御にNavMeshを使用しています。
テラシュールブログさんの以下の記事を見て、NavMeshAgent
のMove()
を使用する方式にしてみました。
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は使わない」想定なのかもしれません。
ただマニュアルのどこにもそんなこと書いていないので、若干バグ臭い挙動でもありますね。