web-dev-qa-db-fra.com

Inverser une animation de sprite 2D dans Unity 2D

J'ai une petite question sur les animations 2D Sprite que je n'ai pas pu trouver avec une réponse spécifique:

J'ai un Sprite avec des animations de promenade à droite. Cependant, je veux évidemment faire basculer l'animation vers la gauche quand il marche à gauche (défilement latéral 2D).

Je peux facilement retourner le Sprite lui-même, en utilisant transform.localscale.x, qui ne retourne que le Sprite. Pas le clip d'animation. (Cela ne se produit plus dans l'unité)

Ainsi, pendant que le Sprite bascule, la minute où le clip d’animation commence à être lu, il bascule en arrière à droite (le seul clip animé que j’ai concerne le Sprite de droite).

Est-ce que la seule façon de faire cela est de retourner les images-objets dans Photoshop, ou existe-t-il un moyen de le faire dans Unity?

Merci!

UPDATE: Avec les versions actuelles de unit si vous redimensionnez la transformation en la multipliant par -1, les images d'animation sont également redimensionnées.

10
Jestus

J'ai finalement compris en faisant ceci:

void Flip()
{
    // Switch the way the player is labelled as facing
    facingRight = !facingRight;

    // Multiply the player's x local scale by -1
    Vector3 theScale = transform.localScale;
    theScale.x *= -1;
    transform.localScale = theScale;
}

Ceci est tiré de l'exemple 2D d'Unity Platformer.

Pour implémenter une sorte de vérification qui utilise la méthode Flip, vous pouvez faire quelque chose de similaire à l'exemple ci-dessous qui est le code de mouvement de base. facingRight est défini en tant que valeur sur la classe afin que les autres méthodes puissent l'utiliser, et sa valeur par défaut est false.

void Update() 
{

    //On X axis: -1f is left, 1f is right

    //Player Movement. Check for horizontal movement
    if (Input.GetAxisRaw ("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f) 
    {
        transform.Translate (new Vector3 (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0f, 0f));
        if (Input.GetAxisRaw ("Horizontal") > 0.5f && !facingRight) 
        {
            //If we're moving right but not facing right, flip the Sprite and set     facingRight to true.
            Flip ();
            facingRight = true;
        } else if (Input.GetAxisRaw("Horizontal") < 0.5f && facingRight) 
        {
            //If we're moving left but not facing left, flip the Sprite and set facingRight to false.
            Flip ();
            facingRight = false;
        }

    //If we're not moving horizontally, check for vertical movement. The "else if" stops diagonal movement. Change to "if" to allow diagonal movement.
    } else if (Input.GetAxisRaw ("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f) 
    {
        transform.Translate (new Vector3 (0f, Input.GetAxisRaw ("Vertical") * moveSpeed * Time.deltaTime, 0f));
    }

    //Variables for the animator to use as params
    anim.SetFloat ("MoveX", Input.GetAxisRaw ("Horizontal"));
    anim.SetFloat ("MoveY", Input.GetAxisRaw ("Vertical"));

}
11
Jestus
void FlipHorizontal()
{
    animator.transform.Rotate(0, 180, 0);
}

Vous pouvez aussi le faire sur vous-même (sans animateur). Mais dans ce cas, la valeur de rotation peut être annulée par l'animateur

2
Deepscorn

Ceci est mon implémentation C #. Il utilise une chaîne comme direction pour faciliter le débogage.

public string facing = "right";
public string previousFacing;

private void Awake()
{
    previousFacing = facing;
}

void Update()
{
    // store movement from horizontal axis of controller
    Vector2 move = Vector2.zero;
    move.x = Input.GetAxis("Horizontal");
    // call function
    DetermineFacing(move);
}
// determine direction of character
void DetermineFacing(Vector2 move)
{
    if (move.x < -0.01f)
    {
        facing = "left";
    }
    else if (move.x > 0.01f)
    {
        facing = "right";
    }
    // if there is a change in direction
    if (previousFacing != facing)
    {
        // update direction
        previousFacing = facing;
        // change transform
        gameObject.transform.Rotate(0, 180, 0);
    }
}
0
ow3n

Voici comment je l'ai fait - presque la même chose que l'autre technique de Jestus avec le script d'unité. 

var facing : String = "right";

function updateFacing(curr : String){
    if(curr != facing){
        facing = curr;
        var theScale : Vector3 = gameObject.transform.localScale;
        theScale.x *= -1;
        gameObject.transform.localScale = theScale;
    }
}

//put to use
function controls(){
    if(Input.GetKey (KeyCode.LeftArrow)){
        updateFacing("left");
    } else if(Input.GetKey (KeyCode.RightArrow)){
        updateFacing("right");
    }      
}
0
Nick Taras

Si vous animez dans Unity:

  1. Copiez toutes les images (images-objets) de l'animation que vous souhaitez retourner.
  2. Collez ces images dans votre nouvelle animation et sélectionnez tout ce qui se trouve sur la première image.
  3. Changer l'échelle x de la première image de 1 à -1.
  4. Faites la même chose avec la toute dernière image de votre animation.

Maintenant, il faut jouer dans l'autre sens!

0
Mickey Ugolini