Flipping a 2D Sprite Animation in Unity 2D

后端 未结 5 1072
失恋的感觉
失恋的感觉 2020-12-30 07:04

I\'ve got a quick question regarding 2D Sprite animations that I haven\'t been able to find specifically answered anywhere:

I have a sprite with walk animations to t

相关标签:
5条回答
  • 2020-12-30 07:11

    This is my C# implementation. It uses a string as the direction facing to make it a little easier to debug.

    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 讨论(0)
  • 2020-12-30 07:15

    If you're animating in Unity:

    1. Copy all frames (sprites) of the animation that you want to flip over.
    2. Paste those frames into your new animation and select everything on the first frame.
    3. Change the x scale of the first frame from 1 to -1.
    4. Do the same thing with the very last frame of your animation.

    Now it should play facing the other direction!

    0 讨论(0)
  • 2020-12-30 07:17

    This is how I did it - almost the same as the other technique by Jestus with unity script.

    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 讨论(0)
  • 2020-12-30 07:21
    void FlipHorizontal()
    {
        animator.transform.Rotate(0, 180, 0);
    }
    

    You could also do that on transform itself (without animator). But in that case rotation value can be overriden by animator

    0 讨论(0)
  • 2020-12-30 07:34

    I finally figured it out by doing this:

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

    This is from Unity's 2D Platformer example.

    To implement some sort of checking which makes use of the Flip method, you can do something similar to the below example which is basic movement code. facingRight is set as a value on the class so that the other methods can use it, and it is defaulted to 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"));
    
    }
    
    0 讨论(0)
提交回复
热议问题