Как сделать так, чтобы во время удара персонаж останавливался?
Нужно, чтобы персонаж останавливался когда запускается атака. Я буду скорее всего делать это через стейты, однако мне просто интересно почему это не работает с эксклюзивной переменной
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);
}
}