問題の説明
NavMesh エージェントが無効なパスを計算するのに苦労していますが、明らかに理由はありません。この問題は、最初の有効なパスで既に移動しているときに時々発生します。
上の画像では、宛先は左上隅のコーンです。(NavMeshAgent の方向矢印は気にしないでください。エージェントを手で動かして「ロックを解除」しようとしました)
- インスタンス化されたら、エージェントに NavMesh 上の特定の宛先ポイントへのパスを計算するように依頼します( NavMesh.SamplePositionを使用して、宛先ポイントが NavMesh 上にあることを確認します)。すべて正常に動作します。エージェントは自分の道を見つけ、ターゲットに向かって動き始めます
- しかし、旅の最中に突然、最初のステップからNavMeshが変更されていない間に、彼は自分自身を失います。私は彼に何も尋ねていません。新しいパスの新しい計算もしていません。
テスト済みのソリューション
目的地が NavMesh 上にあることを確認しました
public Vector3 GetCharacterPositionOnNavMesh( Vector3 position ) { NavMeshHit hit; bool positionFound = NavMesh.SamplePosition( position, out hit, 500, NavMesh.AllAreas ); if ( !positionFound ) Debug.LogWarning( "No valid position found !" ); return positionFound ? hit.position : position; }
エージェントのエリア マスクをチェックして、NavMesh のさまざまなエリアにもかかわらず、エージェントが目的地へのパスを見つけられることを確認しました
エージェントのパスが無効かどうか、ほぼすべてのフレームをチェックします。
CalculatePath
その場合、またはを使用して新しいものを計算しSetDestination
ます。うまくいくこともあれば、うまくいかないこともあります。protected virtual void Update() { if ( !Running || !agent.enabled || !agent.isOnNavMesh ) return; if ( !agent.pathPending && agent.path.status == NavMeshPathStatus.PathInvalid && Time.frameCount % 2 == 0 ) { NavMeshPath path = new NavMeshPath(); agent.CalculatePath( CharactersManager.Instance.GetCharacterPositionOnNavMesh( finalDestination ), path ); agent.SetPath( path ); } }
シーン全体ですべての NavMeshObstacle を無効にします (私のエージェントには NavMeshObstacle もその子にもありません)
初期位置と最終目的地の間にさらにステップを追加する
エージェントのAutoRepathプロパティを無効にしました
パスを計算し、すべてのコーナーを保存し、これと同様の方法を使用して一度に 1 つのコーナーでエージェントの目的地を設定します
注 : 別のエージェントが最初のエージェントをプッシュすると、後者が起動してパスを見つけたように見えます。