Я играю в игру Tower Defense, в которой агенты NavMesh путешествуют по пути от точки появления до конца.Все мои враги движутся по одному и тому же пути (пока), но они движутся с разной скоростью.В настоящее время мои башни всегда нацелены на ближайшего к ним противника.Я хочу, чтобы мои башни были нацелены на врага, которому нужно пройти наименьшее расстояние вдоль пути, чтобы добраться до конца.
Я пытался использовать agent.remainingDistance, но он продолжает возвращать бесконечность (и, согласно документации, это означает, что агент не знает оставшееся расстояние).
Tower.cs:
public Transform target;
// a lot of other stuff
void UpdateTarget()
{
GameObject[] enemies = GameObject.FindGameObjectsWithTag(Tags.enemyTag);
float shortestDistance = Mathf.Infinity;
GameObject targetEnemy = null;
foreach (GameObject enemy in enemies)
{
float distance = enemy.GetComponent<Enemy>().agent.remainingDistance;
if (distance < shortestDistance && Vector3.Distance(transform.position, enemy.transform.position) <= range * 10 + rangeBuff)
{
shortestDistance = distance;
targetEnemy = enemy;
}
}
if (targetEnemy != null)
{
target = targetEnemy.transform;
}
else
{
target = null;
}
}
// a lot of other stuff
Enemy.cs:
public class Enemy : MonoBehaviour, IPooledObject
{
public EnemySplit[] splits;
public bool cameFromSplit = false;
public EnemyBlueprint enemy;
public float health;
public float speed;
[HideInInspector]
public float slow;
public Image healthBar;
public List<Tower> towersSlowing = new List<Tower>();
[HideInInspector]
public NavMeshAgent agent;
private GameObject end;
public bool stunned;
void Awake()
{
agent = GetComponent<NavMeshAgent>();
end = GameObject.FindGameObjectWithTag(Tags.endTag);
}
public void OnSpawned()
{
slow = 1f;
speed = enemy.startSpeed;
health = enemy.startHealth;
splits = enemy.splits;
agent.speed = speed * 10;
agent.updateUpAxis = false;
agent.updateRotation = false;
agent.SetDestination(end.transform.position);
if (cameFromSplit)
{
StartCoroutine(CameFromSplit());
}
foreach (EnemyReinforcements re in enemy.reinforcements)
{
StartCoroutine(HandleReinforcement(re.enemyIndex, re.rate, re.count));
}
InvokeRepeating("UpdateHealth", 0f, 0.1f);
InvokeRepeating("UpdateCheck", 0f, 0.2f);
//StartCoroutine(LateStart());
transform.rotation = Quaternion.Euler(90, 0, 0);
}
// a lot of other stuff
Я использую объединение объектов для вызова своих врагов.Поэтому рассматривайте OnSpawned () как Start ().
ОБНОВЛЕНИЕ: Изменен код нацеливания на
if (enemy.GetComponent<Enemy>().agent.pathPending) distance = Vector3.Distance(enemy.transform.position, transform.position);
else { distance = enemy.GetComponent<Enemy>().agent.remainingDistance; }
, и он, похоже, нацелен на ближайшего врага.Итак, враги все еще находятся на пути в ожидании ... ??