web-dev-qa-db-ja.com

Unity 2Dで2Dスプライトアニメーションを反転する

2Dスプライトアニメーションに関する簡単な質問がありますが、どこにも具体的な回答がありません。

右側にウォークアニメーションを備えたスプライトがあります。ただし、彼が左に歩くとき(2D横スクロール)、アニメーションを左に反転させたいのは明らかです。

transform.localscale.xを使用すると、スプライト自体を簡単に反転できますが、これは、スプライトだけを反転するだけです。アニメーションクリップではありません。 (これはUnityではもう起こりません)

したがって、スプライトが反転している間、アニメーションクリップの再生が始まるとすぐに右に戻ります(私が持っている唯一のアニメーションクリップは、右向きのスプライト用です)。

これをPhotoshopでスプライトを反転させる唯一の方法ですか、それともUnityでそれを行う方法はありますか?

ありがとう!

PDATE: unityの実際のバージョンでは、変換を-1で乗算してスケーリングすると、アニメーションフレームもスケーリングされます。

12
Jestus

私は最終的にこれを行うことでそれを理解しました:

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 Platformerサンプルからのものです。

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

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

(アニメータなしで)変換自体でそれを行うこともできます。ただし、その場合、回転値はアニメータによってオーバーライドできます。

2
Deepscorn

これは私の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);
    }
}
0
ow3n

これが私がやった方法です-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");
    }      
}
0
Nick Taras

Unityでアニメートしている場合:

  1. 裏返したいアニメーションのすべてのフレーム(スプライト)をコピーします。
  2. それらのフレームを新しいアニメーションに貼り付け、最初のフレームのすべてを選択します。
  3. 最初のフレームのxスケールを1から-1に変更します。
  4. アニメーションの最後のフレームでも同じことを行います。

これで、逆方向に再生されるはずです!

0
Mickey Ugolini