it-swarm.com.de

Spiegeln einer 2D-Sprite-Animation in Unity 2D

Ich habe eine kurze Frage zu 2D-Sprite-Animationen, die ich nirgendwo anders finden konnte:

Ich habe ein Sprite mit Laufanimationen nach rechts. Ich möchte natürlich die Animation nach links drehen, wenn er nach links geht (2D-Seiten-Scroller).

Ich kann den Sprite selbst leicht umdrehen, wobei transform.localscale.x verwendet wird, der jedoch nur den Sprite umdreht. Nicht der Animationsclip. (Dies passiert nicht mehr in Unity)

Während das Sprite umkehrt, wird der Moment, in dem der Animationsclip abgespielt wird, nach rechts gedreht (da der einzige Animationsclip, den ich habe, der Sprite mit der rechten Seite ist).

Ist dies der einzige Weg, die Sprites in Photoshop umzudrehen, oder gibt es eine Möglichkeit, dies in Unity zu tun?

Vielen Dank!

UPDATE: Bei den aktuellen Unity-Versionen, wenn Sie die Transformation durch Multiplikation mit -1 skalieren, werden auch die Animationsframes skaliert.

10
Jestus

Ich habe es endlich herausgefunden:

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;
}

Dies ist aus dem Unity-2D-Platformer-Beispiel.

Um eine Art Überprüfung zu implementieren, die die Flip-Methode verwendet, können Sie etwas Ähnliches wie das unten stehende Beispiel tun, bei dem es sich um den grundlegenden Bewegungscode handelt. facingRight ist als Wert für die Klasse festgelegt, sodass die anderen Methoden ihn verwenden können. Der Standardwert ist 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);
}

Sie können das auch bei der Transformation selbst tun (ohne Animator). In diesem Fall kann der Drehwert jedoch vom Animator überschrieben werden

2
Deepscorn

Dies ist meine C # -Implementierung. Es verwendet eine Zeichenfolge als Richtung, um das Debugging zu erleichtern.

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

So habe ich es gemacht - fast genauso wie die andere Technik von Jestus mit Unity-Skript. 

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

Wenn Sie in Unity animieren:

  1. Kopieren Sie alle Bilder (Sprites) der Animation, die Sie umblättern möchten.
  2. Fügen Sie diese Bilder in Ihre neue Animation ein und wählen Sie alles im ersten Bild aus.
  3. Ändern Sie die X-Skala des ersten Frames von 1 in -1.
  4. Machen Sie dasselbe mit dem allerletzten Frame Ihrer Animation.

Jetzt sollte es in die andere Richtung spielen!

0
Mickey Ugolini