Не работает ближний бой Unity

я хочу чтоб когда условный Enemy дотрагивался до объекта с тегом player он наносид ему урон и это делают строчки ниже, но проблема в том что сносится только два оно сносит с 10 до 8 и всё

  private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            if (TimeBtwAttack <= 0)
            {
                anim.SetTrigger("IsAttack");
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }
    public void OnEnnemyAttack()
    {
        player.health -= damage;
        TimeBtwAttack = StartTimeBtwAttack;
    }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{

    public float Speed;
    private float TimeBtwAttack;
    public float StartTimeBtwAttack;
    public int damage;
    public int healt;
    private Transform target;
    private Tower player;
    private float StartPosX;
    private float StartPosY;
    private bool isBeingHeld = false;
    private Animator anim;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
        player = FindObjectOfType<Tower>();
        anim = GetComponent<Animator>();
    }
    void Update()
    {
        if (isBeingHeld == true)
        {
            Vector3 mousePos;
            mousePos = Input.mousePosition;
            mousePos = Camera.main.ScreenToWorldPoint(mousePos);
            this.gameObject.transform.localPosition = new Vector3(mousePos.x - StartPosX, mousePos.y - StartPosY, 0);

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


    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            if (TimeBtwAttack <= 0)
            {
                anim.SetTrigger("IsAttack");
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }
    public void OnEnnemyAttack()
    {
        player.health -= damage;
        TimeBtwAttack = StartTimeBtwAttack;
    }
    
    private void OnMouseDown()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 mousePos;
            mousePos = Input.mousePosition;
            mousePos = Camera.main.ScreenToWorldPoint(mousePos);

            StartPosX = mousePos.x - this.gameObject.transform.localPosition.x;
            StartPosY = mousePos.y - this.gameObject.transform.localPosition.y;

            isBeingHeld = true;
        }
    }

    private void OnMouseUp()
    {
        isBeingHeld = false;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Wall"))
        {
            Destroy(gameObject);
        }
    }

}

А OnEnnemyAttack это откуда, чем вызывается?

Это вызвано через анимацию , там я добавил событие и выбрал функцию OnEnemyAttack()

Может что-то с анимациями не так?

Так а добавлено как?

И для начала стоит добавить Debug.Log, чтобы узнать вызывается ли OnTriggerStay2D больше 1 раза, срабатывает ли сравнение тега, правильно ли меняется время.

есть определённая анимация attack она срабатывает из за этих строк

 if (TimeBtwAttack <= 0)
            {
                anim.SetTrigger("IsAttack");
            }

включается тригер IsAttack и из анимации idle переходит к анимации attack и в самой анимации attack есть event с методом OnEnemyAttack

Debug.Log сработал вообще 1 раз

но если я отодвину enemy и он опять дотронется , то Debug.Log работает

1 раз где именно? Весь OnTriggerStay2D или только условие про анимацию? Надо ж везде Debug.Log добавить, чтоб понять что происходит )

немного исправил код сделал Debug.Log через анимацию Debug работает 3 раза

кстати я ещё сделал так

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{

    public float Speed;
    private float TimeBtwAttack;
    public float StartTimeBtwAttack;
    public int damage;
    public int healt;
    private Transform target;
    private Tower player;
    private float StartPosX;
    private float StartPosY;
    private bool isBeingHeld = false;
    private Animator anim;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
        player = FindObjectOfType<Tower>();
        anim = GetComponent<Animator>();
    }
    void Update()
    {
        if (isBeingHeld == true)
        {
            Vector3 mousePos;
            mousePos = Input.mousePosition;
            mousePos = Camera.main.ScreenToWorldPoint(mousePos);
            this.gameObject.transform.localPosition = new Vector3(mousePos.x - StartPosX, mousePos.y - StartPosY, 0);

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


    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            if (TimeBtwAttack <= 0)
            {
                OnEnnemyAttack();
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }
    public void OnEnnemyAttack()
    {
        Debug.Log("Coll");
    }
    
    private void OnMouseDown()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 mousePos;
            mousePos = Input.mousePosition;
            mousePos = Camera.main.ScreenToWorldPoint(mousePos);

            StartPosX = mousePos.x - this.gameObject.transform.localPosition.x;
            StartPosY = mousePos.y - this.gameObject.transform.localPosition.y;

            isBeingHeld = true;
        }
    }

    private void OnMouseUp()
    {
        isBeingHeld = false;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Wall"))
        {
            Destroy(gameObject);
        }
    }

}

чтобы посмотреть проблема в анимке или нет, debug работает но потом останавливается

Это как?

Ну и я ж говорю

    private void OnTriggerStay2D(Collider2D other)
    {
        Debug.Log("OnTriggerStay2D");
        if (other.CompareTag("Player"))
        {
            Debug.Log("Triggered on Player. TimeBtwAttack: " + TimeBtwAttack);
            if (TimeBtwAttack <= 0)
            {
                Debug.Log("Attack");
                OnEnnemyAttack();
            }
            else
            {
                TimeBtwAttack -= Time.deltaTime;
            }
        }
    }

проблема решена, у RigidBody2D в Sleeping Mode надо поставить Never Sleep чтоб RigidBody не уходил в сон и работал