0

私は現在 Unity3D ゲームに取り組んでおり、ナビゲーション メッシュ エージェントでいくつかの問題が発生しました。私の現在の目的は、敵を最も近いプレイヤー (3 人になる予定) に向かって歩かせることです。敵をスポーンすると、どのプレイヤーが最も近いかをチェックします。これは、以下のコードに見られるように、プレーヤーに向かって残りの距離で行われます

agent.CalculatePath(player.transform.position, path);
agent.Stop();
agent.SetPath(path);

if (distance > agent.remainingDistance)
{
    distance = agent.remainingDistance;
    playerToFollow = player;
} 

このスニペットでは、距離は '<code>float.MaxValue' で開始され、(プレイヤーが現在の距離よりも近づくたびに、ゲームオブジェクトである '<code>playerToFollow' として設定されます。

問題はここにあります: プレーヤーへのパスに 0 または 1 つのコーナーがある場合。ナビゲーション メッシュ エージェントは、プレイヤーに向かってその道を歩き始めます。しかし…パスに複数のコーナーが含まれる場合は常に距離が計算されないため、 が返されagent.remainingDistance == float.PositiveInfinityます。

これは、距離 ( float.MaxValue) が残りの距離 ( float.PositiveInfity) より小さいことを意味します。

私が忘れる可能性のあるものはありますか?私にお知らせください。いつでも詳細をお知らせできます。

4

1 に答える 1

0

エージェントで距離を使用しないことで修正しました。現在、パスのコーナーを使用して、それらの間の距離を計算しています。

 players.ForEach(
        player =>
        {
            agent.CalculatePath(player.transform.position, path);
            float pathDistance = calculatePathDistance(path);

            if (pathDistance < distance)
            {
                distance = pathDistance;
                playerToFollow = player;
            }

        }
    );

#calculatePathDistance(NavMeshPath path) の実装は次のようになります。

private float calculatePathDistance(NavMeshPath path)
{
    float distance = .0f;
    for (var i = 0; i < path.corners.Length -1; i++)
    {
        distance += Vector3.Distance(path.corners[i], path.corners[i + 1]);
    }
    return distance;
}

agent.remainingDistance が機能する方法があれば教えてください。

于 2016-10-25T19:46:06.100 に答える