2017-07-31 3 views
0

私は、エージェントがnaviesh/agentを補助自動追尾機能として使用しています。その後、エージェントは宛先に達すると再び無効になります。無効になっているnavmeshエージェント(プレーヤー)がnavmeshにいるかどうかをチェック

navmeshagentを有効にせずに、許容範囲内でプレーヤーが現在navmeshにいるかどうかを確認する方法が必要です。または、navmeshagentのプレーヤーバインディングの「効果」を無効にすることなく削除する方法がある場合は、それを使用して問題を解決することもできます。

私は擬似コードで推測する、これは私がnavmeshagentを無効にしてを達成しようとしているものです:

if (!agent.isOnNavMesh){ DisableClickSelection();} 

私はYは、プレイヤーと取得するnavmeshの変換比較の可能性を考えていました高さの違いとそれを使用して、プレーヤーがnavmesh上にあるかどうかを判断するが、特定のXとZポイントでnavmeshのY変換を取得する方法についてわからない。たぶん私はレイキャストを使うことができますか?私は最善の方法をよく分かりません。私が言ったように、プレイヤーにエージェントのプレイヤーバインディングの「効果」を取り除いても、エージェントを有効にしたままにする方法があれば、それも使えるはずです。

答えて

3

NavMesh.SamplePosition()を使用してこれを行うことができます。この方法は、基本的に、navmesh上の最も近い点の所与の位置を中心とする球面半径内を探索する。あなたがする必要があることは、返された位置がプレーヤーの位置に垂直に垂直で、その上にあることを確認することだけです。ここで

あなたは、コードでこれを適用される場合があります方法についてのアイデアです:

// Don't set this too high, or NavMesh.SamplePosition() may slow down 
float onMeshThreshold = 3; 

public bool IsAgentOnNavMesh(GameObject agentObject) 
{ 
    Vector3 agentPosition = agentObject.transform.position; 
    NavMeshHit hit; 

    // Check for nearest point on navmesh to agent, within onMeshThreshold 
    if (NavMesh.SamplePosition(agentPosition, out hit, onMeshThreshold, NavMesh.AllAreas)) 
    { 
     // Check if the positions are vertically aligned 
     if (Mathf.Approximately(agentPosition.x, hit.position.x) 
      && Mathf.Approximately(agentPosition.z, hit.position.z)) 
     { 
      // Lastly, check if object is below navmesh 
      return agentPosition.y >= hit.position.y; 
     } 
    } 

    return false; 
} 

だから、あなたの例でそれを使用するために、あなたが書いたと思います:

if (!IsAgentOnNavMesh(agent.gameObject)) 
{ 
    DisableClickSelection(); 
} 

は、この情報がお役に立てば幸い!ご質問がある場合はお知らせください。

+0

10/10完璧な応答と正確に何を私が話していた。ありがとうございました。 –

+0

クリックがnavmeshの外にある場合、登録に同じ正確なコンセプトを使用するとどう思いますか?それは最高のコースか簡単ですか? –

+1

@MikeH特に何かをクリックしていないと、クリックが1つの位置を確認するよりもレイの方が多いので、もう少し難しいです。これは、粗いコライダーがnavmeshにほぼ並んでいた場合(別の物理層で大きなボックスコライダーになり、残りのシーンとのやりとりを避けることができます)、機能します。クリックすると、そのコライダーにヒットするレイキャストが行われ、この回答に示されたロジックに対してヒットポイントが使用されます。これが不可能な場合...私はこのアプローチがクリックではうまくいかないと思います。 – Serlite

関連する問題