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は使わない」想定なのかもしれません。
ただマニュアルのどこにもそんなこと書いていないので、若干バグ臭い挙動でもありますね。



					
					
					
					
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
						
                        
                        
                        



