Unity3D - Как я могу реализовать первый таргетинг в моей игре Tower Defense? - PullRequest
0 голосов
/ 20 декабря 2018

Я играю в игру 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; }

, и он, похоже, нацелен на ближайшего врага.Итак, враги все еще находятся на пути в ожидании ... ??

...