How do I stop player from moving when he is attacking ?

Hello.

I need help.

How can i stop calling the function Move when the player is attacking and after he is done attacking call the function back so he can move ?

I am trying to do this through booleans.But the problem is when the game starts i want the player to be able to move or attack.I don’t know how to set this up the right way so the player can attack or move.

I must be blind.I’ve tried to set this up through float numbers this doesn’t work and it is not a good way to set it up.

Anybody can help me ?

This is my code

 public float walkSpeed = 2;
    public float runSpeed = 6;
    public float gravity = -12;
    public float jumpHeight = 1;
    [Range(0, 1)]
    public float airControlPercent;

    public float turnSmoothTime = 0.2f;
    float turnSmoothVelocity;

    public float speedSmoothTime = 0.1f;
    float speedSmoothVelocity;
    float currentSpeed;
    float velocityY;

   
    public float SwordSwingTime = 2f;

    Animator animator;
    Transform cameraT;
    CharacterController controller;

    //BOOLEANS//
   public bool CanAttack;
    public bool CanMove;

    void Start()
    {
        animator = GetComponentInChildren<Animator>();
        cameraT = Camera.main.transform;
        controller = GetComponent<CharacterController>();
        CanAttack = true;
        CanMove = true;
    }

    void Update()
    {
        // input
        Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
        Vector2 inputDir = input.normalized;
        bool running = Input.GetKey(KeyCode.LeftShift);

        if(CanMove == true)
        {
            CanAttack = false;
            Move(inputDir, running);
        }
        else { CanAttack = true; }
       
       
       

        if (CanAttack == true && Input.GetButtonDown("Fire1"))
        {
            StartCoroutine(SwordAttackQUICK());
            CanMove = false;

        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
        // animator
        float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed * .5f);
        animator.SetFloat("SpeedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime);
    }

    void Move(Vector2 inputDir, bool running)
    {
        if (inputDir != Vector2.zero)
        {
            float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y;
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));
        }

        float targetSpeed = ((running) ? runSpeed : walkSpeed) * inputDir.magnitude;
        currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime));

        velocityY += Time.deltaTime * gravity;
        Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY;

        controller.Move(velocity * Time.deltaTime);
        currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z).magnitude;

        if (controller.isGrounded)
        {
            velocityY = 0;
        }

    }

    void Jump()
    {
        if (controller.isGrounded)
        {
            float jumpVelocity = Mathf.Sqrt(-2 * gravity * jumpHeight);
            velocityY = jumpVelocity;
        }
    }

    float GetModifiedSmoothTime(float smoothTime)
    {
        if (controller.isGrounded)
        {
            return smoothTime;
        }

        if (airControlPercent == 0)
        {
            return float.MaxValue;
        }
        return smoothTime / airControlPercent;
    }


    IEnumerator SwordAttackQUICK()
    {
        CanMove = false;
        animator.SetBool("Attacking", true);
        animator.SetInteger("RandomAttack", Random.Range(1, 4));
        CanAttack = false;
       

        yield return new WaitForSeconds(SwordSwingTime);

        animator.SetInteger("RandomAttack", 0);
        animator.SetBool("Attacking", false);
        CanAttack = true;
        CanMove = true;
    }
}

Try setting controller.enabled to false/true when you don’t and do want the player to move

1 Like

You should also check your logic.

As I see it, CanMove will never be false, because CanAttack will never be true;
Try this:

void Update()
    {
        // input
        Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
        Vector2 inputDir = input.normalized;
        bool running = Input.GetKey(KeyCode.LeftShift);
        if (Input.GetButtonDown("Fire1"))
        {
            StartCoroutine(SwordAttackQUICK());
            CanMove = false;

        }
        if(CanMove == true)
        {
            Move(inputDir, running);
        }
2 Likes

Thank you.It works.I’ve been trying for hours and couldn’t find the right way. :smile:

1 Like