Воспроизведение двухмерной анимации перед отражением спрайта в Unity c #

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

Видите ли, игрок по умолчанию находится в режиме ожидания. Когда я нажимаю клавишу со стрелкой в ​​направлении, противоположном ее направлению (по умолчанию это право при запуске игры ->), я хочу, чтобы она воспроизводила анимацию поворота до того, как спрайт перевернется по своей шкале x.

Однако то, что он делает прямо сейчас, когда я нажимаю клавишу со стрелкой, чтобы повернуть его, заключается в том, что сначала он быстро переворачивает спрайт, затем выполняет анимацию, как если бы он еще не был перевернут, а затем снова переворачивает в другом направлении.

В моем аниматоре у холостого хода нет времени выхода на узел переворота, а у узла переворота есть время выхода обратно в режим ожидания, на всякий случай, если вы спросите. Я пробовал запускать таймер здесь и там, но пока безуспешно. Кто-нибудь может помочь, пожалуйста?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class tulMoveMount : MonoBehaviour {

    private Animator anim;
    private Rigidbody2D rb;
    public Image manaBar;

    public LayerMask whatIsGround;
    private bool grounded = false;
    public Transform groundCheck;
    public float groundCheckRadius;

    private bool goRight = true;
    private bool jump;
    private bool turn = false;
    private bool idle = true;
    private bool mountOff;
    private bool turnComplete = false;  

    public float runSpeed;
    public float walkSpeed; 
    private float move; 
    public float turnDelay = 2.25f;     
    public float timer3 = 2.26f;

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

    void Update () 
    {
        grounded = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround);
        timer -= Time.deltaTime;
        turnDelay -= Time.deltaTime;
        HandleMovement ();

    }

    void HandleMovement()
    {

        float move = Input.GetAxis ("Horizontal");
        float moveV = Input.GetAxis ("Vertical");

        {
            rb.velocity = new Vector2 (move * walkSpeed, rb.velocity.y);

            anim.SetFloat ("walkSpeed", Mathf.Abs (move));

        }

        if (!goRight && move > 0) {
            FlipConditions ();
            Invoke ("ResetValues",timer3 );
            Flip ();
            turnComplete = false;
        }
        if (goRight && move < 0) {
            FlipConditions ();
            Invoke ("ResetValues",timer3 );
            Flip ();
        }
    }

    void FlipConditions()//
    {
        idle = false;
        turn = true;
        anim.SetTrigger ("turn");
        idle = true;
        anim.SetTrigger ("idle");
    }

    void Flip()
    {
        goRight = !goRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
        turnComplete = false;
    }
    void ResetValues()
    {
        idle = true;
        anim.SetTrigger ("idle");
    }
}

person Joe Clark    schedule 27.08.2017    source источник


Ответы (1)


Вы можете попробовать перевернуть спрайт в LateUpdate() после выполнения любой анимации в Update(). Попробуйте что-нибудь подобное, поместив анимацию в Update:

// store references to components on the gameObject
Transform _transform;
Rigidbody2D _rigidbody;

// hold player motion in this timestep
float vx;
float vy;

float MoveSpeed;

void Awake () {

    // get a reference to the components we are going to be changing and store a reference for efficiency purposes
    transform = GetComponent<Transform> ();

    rigidbody = GetComponent<Rigidbody2D> ();

}

// this is where most of the player controller magic happens each game event loop
void Update()
{
    // determine horizontal velocity change based on the horizontal input
    vx = Input.GetAxisRaw ("Horizontal");

    // get the current vertical velocity from the rigidbody component
    vy = rigidbody.velocity.y;

    // Change the actual velocity on the rigidbody
    rigidbody.velocity = new Vector2(vx * MoveSpeed, vy);
}

// Checking to see if the sprite should be flipped
// this is done in LateUpdate since the Animator may override the localScale
// this code will flip the player even if the animator is controlling scale
void LateUpdate()
{
    // get the current scale
    Vector3 localScale = transform.localScale;

    if (vx > 0) // moving right so face right
    {
        facingRight = true;
    } else if (vx < 0) { // moving left so face left
        facingRight = false;
    }

    // check to see if scale x is right for the player
    // if not, multiple by -1 which is an easy way to flip a sprite
    if (((facingRight) && (localScale.x<0)) || ((!facingRight) && (localScale.x>0))) {
        localScale.x *= -1;
    }

    // update the scale
    transform.localScale = localScale;
}
person Ignacio Alorre    schedule 22.09.2017