ИИ врага, патрулирование по точкам, преследование и возвращение к патрулированию

Помогите написать ИИ для патрулирующего врага Unity2D. Нашел несколько скриптов на просторах интернета, но соединить их в 1 не могу. Враг должен ходить по точкам при патрулировании и если игрок входит в зону агро врага он его преследует и атакует в ближнем бою и если игрок убегает от него, он возвращается к патрулированию. Ниже приложу скрипт, в нем у меня враг двигается не при помощи RigetBody, а хотелось бы чтобы враг был не как картинка.

    [Header("Здоровье")]
    public float maxHealth = 10;
    public float currentHealth;
    private PlayerController playerHealth;

    [Header("Скорость")]
    [SerializeField] private float speed;

    [Header("Параметр Атаки")]
    [SerializeField] public float damage;
    [SerializeField] private float attackCooldown;

    [Header("Зона поражения")]
    [SerializeField] private float range;
    [SerializeField] private float rangeY;
    [SerializeField] private float colliderDistance;
    [SerializeField] private BoxCollider2D boxCollider;
    [SerializeField] private LayerMask playerLayer;
    private float cooldownTimer = Mathf.Infinity;

    private Animator anim;
    private EnemyPatrol enemyPatrol;

 
    

    private void Start()
    {
        anim = GetComponent<Animator>();
        
        enemyPatrol = GetComponentInParent<EnemyPatrol>();
    }

    private void Update()
    {
        currentHealth = maxHealth;
        cooldownTimer += Time.deltaTime;

        if (PlayerInSight())
        {
            if (cooldownTimer >= attackCooldown)
            {
                cooldownTimer = 0;
                anim.SetTrigger("Attack");
            }
        }

        if(enemyPatrol != null)
            enemyPatrol.enabled = !PlayerInSight();
    }


    //получение урона
    public void TakeDamage(float damage)
    {
        currentHealth -= damage;

        
        //тут могла бы быть ваша анимация получения урона
        Debug.Log("Вы нанесли урон " +  damage);


        if(currentHealth <= 0)
        {
            //GetComponentInParent<PlayerController>().enabled = false;
           Die();
        }


    }

    private bool PlayerInSight()
    {
        //параметры зоны отрисовки
        RaycastHit2D hit = Physics2D.BoxCast(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
            new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y * rangeY, boxCollider.bounds.size.z), 0, Vector2.left, 0, playerLayer);

        if (hit.collider != null)
            playerHealth = hit.transform.GetComponent<PlayerController>();

        return hit.collider != null;
    }

    //отоброжение зоны порожения
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
               new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y * rangeY, boxCollider.bounds.size.z));
    }

    private void DamagePlayer()
    {
        if (PlayerInSight())
        {
            playerHealth.TakeDamage(damage);
        }
        
            
        
    }





    void Die()
    {

        anim.SetTrigger("Die");

        if (GetComponentInParent<EnemyPatrol>() != null)
            GetComponentInParent<EnemyPatrol>().enabled = false;

        if (GetComponentInParent<Enemy>() != null)
            GetComponentInParent<Enemy>().enabled = false;
        //GetComponent<Collider2D>().enabled = false;
        //this.enabled = false;

    }

Ответы (0 шт):