Unity проблема с преследованием юнитов

есть враг с тегом Enemy
есть защитник который ищет юнита с тегом Enemy
После того как защитник убивает одно юнита с тегом Enemy
он не бежит к другим юнитам с тегом Enemy, а просто останавливается и всё

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;

public class DefenceAxe : MonoBehaviour
{
    public float Speed;
    private float TimeBtwAttack;
    public float StartTimeBtwAttack;
    public float stoppingDistance;
    Enemy _enm;
    private Transform target;
    Animator anim;

    void Start()
    {
        _enm = FindObjectOfType<Enemy>();
        anim = GetComponent<Animator>();
        target = GameObject.FindGameObjectWithTag("Enemy").GetComponent<Transform>();
    }

    private void Update()
    {
        if(target.transform.position.x < transform.position.x)
        {
            transform.eulerAngles = new Vector3(0, 180, 0);
        }
        else
        {
            transform.eulerAngles = new Vector3(0, 0, 0);
        }

        if (Vector2.Distance(transform.position, target.position) > stoppingDistance)
        {
            transform.position = Vector2.MoveTowards(transform.position, target.position, Speed * Time.deltaTime);
        }
    }



    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Enemy"))
        {
            if (TimeBtwAttack <= 0)
            {
                anim.SetTrigger("Attack");
                _enm.HP--;
                TimeBtwAttack = StartTimeBtwAttack;
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }

}

надо как то задать, что защитник меняет таргет на нового юнита после убийства предыдущего

Ну надо определить когда таргет умер (из этого кода непонятно как это можно сделать) и снова делать то, что в начале.

только если мертвый таргет остается на сцене и не теряет тег, то надо тогда их фильтровать при поиске.
Например, FindGameObjectsWithTag (с “s”) + FirstOrDefault (с условием внутри) стандартная функция .NET (LINQ).

честно говоря не понял

Ну попробуйте понять, погуглить непонятные слова )
Например, эти

Слова мне понятны) но я не понимаю как применить

И

Так говорю ж, погуглить примеры.
Например, прямо в документации

FirstOrDefault(Enemy => Enemy.Length) так?

Не, там условие, что Enemy не мертв. Как такое условие сделать наверняка лучше знает автор кода )

исправил так

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using System.Linq;

public class DefenceAxe : MonoBehaviour
{
    public float Speed;
    private float TimeBtwAttack;
    public float StartTimeBtwAttack;
    public float stoppingDistance;
    Enemy _enm;
    private Transform target;
    Animator anim;

    void Start()
    {
        _enm = FindObjectOfType<Enemy>();
        anim = GetComponent<Animator>();
        var enemies = GameObject.FindGameObjectsWithTag("Enemy").Where(enemy => enemy != null);
        if (!enemies.Any())
        {
            return;
        }
        target = enemies.First().GetComponent<Transform>();
    }

    void FixedUpdate()
    {
        if (target == null)
        {
            var enemies = GameObject.FindGameObjectsWithTag("Enemy").Where(enemy => enemy != null);
            if (!enemies.Any())
            {
                return;
            }

            target = enemies.First().GetComponent<Transform>(); ;
        }

        transform.position = Vector2.MoveTowards(transform.position, target.position, Speed * Time.deltaTime);

        if (_enm.HP == 0)
        {
            Destroy(_enm.gameObject);
        }

    }


        void OnTriggerStay2D(Collider2D other)
    {

        if (other.CompareTag("Enemy"))
        {
            if (TimeBtwAttack <= 0)
            {
                anim.SetTrigger("Attack");
                _enm.HP--;
                TimeBtwAttack = StartTimeBtwAttack;
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }
}

но появилась другая проблема , теперь он домажит и убивает только 1 юнита, последующих юнитов он не домажит, анимация проходит а урон нет

решением , создаём метод и вызываем его в

void OnTriggerStay2D(Collider2D other)
    void OnDefenceAttack()
    {
        _enm = GameObject.FindGameObjectWithTag("Enemy").GetComponent<Enemy>();
        _enm.HP--;
        TimeBtwAttack = StartTimeBtwAttack;
    }

В этом вряд ли есть смысл. FindGameObjectsWithTag возвращает список объектов на сцене с этим тегом, там null не может откуда-то взяться.

@AlexP , а как тут можно сделать чтоб защитник преследовал не только объекты с тегом Enemy , а ещё и другие объекты с другими тегами, то-есть защитник убивает врага с тегом Enemy, но есть ещё враги с другими тегами, с тегом Regen, как сделать чтоб он и объекты с тегом Regen преследовал?

Если у них нет компонента Enemy или другого общего компонента (что-нибудь типа Destroyable со свойством HP), то не удобно.

Если есть, то что-нибудь такое

var enemies = GameObject.FindGameObjectsWithTag("Enemy")
        .Concat(GameObject.FindGameObjectsWithTag("Regen"))
        .Concat(GameObject.FindGameObjectsWithTag("......."));
if (!enemies.Any())
{
    return;
}
_enm = enemies.First().GetComponent<Destroyable>();

|Ошибка|CS0518|Предопределенный тип System.Range не определен или не импортирован|Assembly-

|Ошибка|CS0518|Предопределенный тип System.Index не определен или не импортирован|Assembly-

Это где? Причем тут Range?

Не знаю, перезапустил Visual Studio и ошибки пропали, код работает спасибо