Как сделать так, чтобы во время удара персонаж останавливался?

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

using UnityEngine;
using UnityEngine.InputSystem;
using System.Collections;
using Unity.VisualScripting;

public class MovementController : MonoBehaviour
{
    [Header("Movement")]
    [SerializeField] public float horizontalSpeed;
    [SerializeField] public float verticalSpeed;
    [SerializeField] public float runningSpeed;
    private Vector2 dir;
    private bool canMove;
    private bool isAttacking;

    [Header("Fight")]
    [SerializeField] private LayerMask enemyLayer;
    [SerializeField] private Transform attackPoint;
    [SerializeField] private float attackPointRadius;
    [SerializeField] private float damage;
    [SerializeField] private float attackDelay;
    [SerializeField] private float attackCooldown;
    [SerializeField] float comboTime = 0;
    public int clicks;


    private bool isDead;
    private Rigidbody2D rb;
    private Animator anim;

    private void Awake()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();   
    }


    private void Update()
    {
        if (isDead) return;
        if (!isAttacking)
        {
            Move();
        }
        else
        {
            rb.linearVelocity = Vector2.zero;
        }

     
    }


    public void Move()
    {

        rb.linearVelocity = new Vector2(dir.x * horizontalSpeed, dir.y * verticalSpeed);
        anim.SetFloat("Speed", Mathf.Abs(rb.linearVelocity.x + rb.linearVelocity.y));
        Flip();

    }


    private void Flip()
    {
        if (dir.x < 0)
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }
        if (dir.x > 0)
        {
            transform.localScale = Vector3.one;
        }
    }


    public void OnAttack(InputValue value)
    {
        if (isDead) return;
        clicks += 1;
        ComboAttack();
        StartCoroutine(DamageDealingDelay(attackDelay));
        isAttacking = true;
    }


    private IEnumerator DamageDealingDelay(float time)
    {
        yield return new WaitForSeconds(time);
        Attack();
        isAttacking = false;
    }



    public void ComboAttack()
    {
        anim.SetInteger("ClickCounter", clicks);
        switch (clicks)
        {
            case 1:
                anim.SetTrigger("Attack");
                break;
            case 2:
                anim.SetTrigger("Attack");
                break;
            case 3:
                anim.SetTrigger("Punch");
                clicks = 0;
                break;
        }
    }

    public void Attack()
    {
        Collider2D[] enemyColliders = Physics2D.OverlapCircleAll(attackPoint.position, attackPointRadius, enemyLayer);
        for (int i = 0; i < enemyColliders.Length; i++)
        {
            if (enemyColliders[i].GetComponent<EnemyController>())
            {
                enemyColliders[i].GetComponent<EnemyController>().TakeDamage(damage);
            }
        }
    }


    public void OnMove(InputValue value)
    {
        dir = value.Get<Vector2>();
    }



    private void OnDrawGizmosSelected()
    {
        if (!attackPoint) return; 
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(attackPoint.position, attackPointRadius); 
    }
}

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