在Unity 2D中翻转2D Sprite动画

时间:2014-10-26 00:10:41

标签: c# animation unity3d 2d sprite

我有一个关于2D Sprite动画的快速问题,我无法在任何地方找到答案:

我有一个带有步行动画的精灵到右边。但是,当他向左走时(2D侧卷轴),我显然想要将动画向左翻转。

我可以使用transform.localscale.x轻松翻转精灵本身,但是,只能翻转精灵。不是动画片段。 (这不再发生在Unity中)

因此,当精灵翻转时,动画片段开始播放的那一刻,它会向右翻转(因为我唯一的动画片段是面向正确的精灵)。

这是在Photoshop中翻转精灵的唯一方法,还是有办法在Unity中执行此操作?

谢谢!

UPDATE:如果您通过将变换乘以-1来缩放变换,则使用实际的unity版本,动画帧也会缩放。

5 个答案:

答案 0 :(得分:12)

我终于通过这样做了出来:

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

这是来自Unity的2D平台示例。

要实现某种使用Flip方法的检查,您可以执行类似于以下示例的操作,这是基本的移动代码。 facingRight被设置为类的值,以便其他方法可以使用它,并且默认为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"));

}

答案 1 :(得分:2)

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

你也可以在变换本身(没有动画师)时这样做。但在这种情况下,旋转值可以被动画师覆盖

答案 2 :(得分:0)

这就是我这样做的方式 - 几乎与Jestus使用统一脚本的其他技术相同。

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

答案 3 :(得分:0)

如果你在Unity中制作动画:

  1. 复制要翻转的动画的所有帧(精灵)。
  2. 将这些帧粘贴到新动画中,然后选择第一帧上的所有内容。
  3. 将第一帧的x比例从1更改为-1。
  4. 对动画的最后一帧做同样的事情。
  5. 现在应该朝着另一个方向发挥作用!

答案 4 :(得分:0)

这是我的C#实现。它使用字符串作为方向,使其更易于调试。

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