2Dスプライトアニメーションに関する簡単な質問がありますが、どこにも具体的な回答がありません。
右側にウォークアニメーションを備えたスプライトがあります。ただし、彼が左に歩くとき(2D横スクロール)、アニメーションを左に反転させたいのは明らかです。
transform.localscale.x
を使用すると、スプライト自体を簡単に反転できますが、これは、スプライトだけを反転するだけです。アニメーションクリップではありません。 (これはUnityではもう起こりません)
したがって、スプライトが反転している間、アニメーションクリップの再生が始まるとすぐに右に戻ります(私が持っている唯一のアニメーションクリップは、右向きのスプライト用です)。
これをPhotoshopでスプライトを反転させる唯一の方法ですか、それともUnityでそれを行う方法はありますか?
ありがとう!
PDATE: unityの実際のバージョンでは、変換を-1
で乗算してスケーリングすると、アニメーションフレームもスケーリングされます。
私は最終的にこれを行うことでそれを理解しました:
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"));
}
void FlipHorizontal()
{
animator.transform.Rotate(0, 180, 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);
}
}
これが私がやった方法です-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");
}
}
Unityでアニメートしている場合:
これで、逆方向に再生されるはずです!