Search code examples
c#.netanimationunity-game-engineanimator

how to make animation wait for another animation in Unity


I am new at unity and I just started to learn about animations and animator. I am making a simple game where player can walk(and at that time walk animation is playing) or hit (at that moment attack animation is playing) also it can jump (jump animation is played). Otherwise player is in idle state (idle animation playing). Problem is, when I try to hit, it doesn't hit (It's seen that animator starts to play the hit animation but then starts idle animation). My opinion is that after one frame is rendered, Another Update is called and so idle animation is played even though attack is not ended yet. My code looks like this:

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

public class KnightController : MonoBehaviour {

    private Rigidbody2D _rigidBody;
    private Animator _animator;
    private bool _isGrounded;
    private bool _isJumped;
    private bool _isAttacking;

    void Start () {
        _rigidBody = GetComponent<Rigidbody2D>();
        _animator = GetComponent<Animator>();
        _isGrounded = true;
        _isJumped = false;
        _isAttacking = false;
    }

    // Update is called once per frame
    void Update () {
        float walkSpeed = Input.GetAxis("Horizontal");

        if (Mathf.Abs(walkSpeed) > float.Epsilon && _isGrounded)
        {
            Vector2 oldVelocity = _rigidBody.velocity;
            _rigidBody.velocity = new Vector2(walkSpeed * 3, oldVelocity.y);
            transform.localScale = new Vector2(Mathf.Sign(walkSpeed), transform.localScale.y);
            _animator.Play("KnightWalk");
        }

        if (Input.GetKey(KeyCode.W))
        {
            _isJumped = true;
        }

        if (Mathf.Abs(walkSpeed) <= float.Epsilon && _isGrounded && !_isAttacking)
        {
           // _animator.Play("KnightIdle");
        }

        if (Input.GetMouseButtonDown(0))
        {
            _animator.Play("KnighAttack");
        }
    }
    private void FixedUpdate()
    {
        if (_isJumped)
        {
            if (_isGrounded)
            {
                _rigidBody.AddForce(new Vector2(0, 160));
                _animator.Play("KnightJump");
            }
            _isJumped = false;
        }
    }
    private void OnCollisionStay2D(Collision2D collision)
    {
        _isGrounded = true;
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        _isGrounded = false;
    }
}

Any suggestion on how to fix it? If I'm doing something wrong, do not hesitate to tell please.


Solution

  • Yes, you're doing it wrong. Your assumption is correct, you're forcing to play animations by using Animator.Play() method. You should use animator controller's states,conditionals and transitions. Check out this: https://docs.unity3d.com/Manual/class-AnimatorController.html