简体   繁体   English

如何使动画在Unity中等待另一个动画

[英]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. 如果我做错了,请随时告诉我。

Yes, you're doing it wrong. 是的,您做错了。 Your assumption is correct, you're forcing to play animations by using Animator.Play() method. 您的假设是正确的,因此您必须使用Animator.Play()方法来强制播放动画。 You should use animator controller's states,conditionals and transitions. 您应该使用动画师控制器的状态,条件和转换。 Check out this: https://docs.unity3d.com/Manual/class-AnimatorController.html 看看这个: https : //docs.unity3d.com/Manual/class-AnimatorController.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM