protected float _lastAttackTime = -100.0f; //время, прошедшее с последней атаки

    public virtual void Attack(Transform target, TargetPositionPair targetPositionPair)
    {
        //поворот к цели
        Vector3 dirToTarget;

        if (target.IsBuilding())
        {
            dirToTarget = targetPositionPair.NearestBoundaryNodePosition - transform.position;
        }
        else
        {
            dirToTarget = target.position - transform.position;
        }
        dirToTarget.y = 0;//чтобы юнит не вращался по оси Y
        Rotate(dirToTarget);

        if (ActionIsAllowed(dirToTarget))
        {
            if (Time.time - _lastAttackTime > _attackInterval)
            {
                UnitAnimation.State = UnitAnimation.States.Attack;
                _lastAttackTime     = Time.time;

                StartCoroutine("CauseDamage", target);//причинение повреждения с задержкой, чтобы урон не наносился, когда анимация удара только началась

                PauseAllTasks();
                State = UnitState.Attack;
                Invoke("StartAllTasks", UnitAnimation.GetCurrentClipLength());
            }
            else
            if (UnitAnimation.State != UnitAnimation.States.Attack)
            {
                UnitAnimation.State = UnitAnimation.States.IdleBattle;
            }
        }
        else
        {
            UnitAnimation.State = UnitAnimation.States.Run;
        }
    }