J'ai une petite question sur les animations 2D Sprite que je n'ai pas pu trouver avec une réponse spécifique:
J'ai un Sprite avec des animations de promenade à droite. Cependant, je veux évidemment faire basculer l'animation vers la gauche quand il marche à gauche (défilement latéral 2D).
Je peux facilement retourner le Sprite lui-même, en utilisant transform.localscale.x
, qui ne retourne que le Sprite. Pas le clip d'animation. (Cela ne se produit plus dans l'unité)
Ainsi, pendant que le Sprite bascule, la minute où le clip d’animation commence à être lu, il bascule en arrière à droite (le seul clip animé que j’ai concerne le Sprite de droite).
Est-ce que la seule façon de faire cela est de retourner les images-objets dans Photoshop, ou existe-t-il un moyen de le faire dans Unity?
Merci!
UPDATE: Avec les versions actuelles de unit si vous redimensionnez la transformation en la multipliant par -1
, les images d'animation sont également redimensionnées.
J'ai finalement compris en faisant ceci:
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;
}
Ceci est tiré de l'exemple 2D d'Unity Platformer.
Pour implémenter une sorte de vérification qui utilise la méthode Flip
, vous pouvez faire quelque chose de similaire à l'exemple ci-dessous qui est le code de mouvement de base. facingRight
est défini en tant que valeur sur la classe afin que les autres méthodes puissent l'utiliser, et sa valeur par défaut est 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);
}
Vous pouvez aussi le faire sur vous-même (sans animateur). Mais dans ce cas, la valeur de rotation peut être annulée par l'animateur
Ceci est mon implémentation C #. Il utilise une chaîne comme direction pour faciliter le débogage.
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);
}
}
Voici comment je l'ai fait - presque la même chose que l'autre technique de Jestus avec le script d'unité.
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");
}
}
Si vous animez dans Unity:
Maintenant, il faut jouer dans l'autre sens!