2017-10-11 4 views
2

Je suis nouveau à l'unité et je suivais un guide youtube sur le scripting d'un jeu de plateforme 2D, je suis arrivé au point où j'essaye d'ajouter une bascule au sprite quand je tourne aller dans la direction opposée.Problème avec l'inversion de sprite dans Unity 2D

J'ai ajouté un code et maintenant cela tourne constamment de gauche à droite. Si je comprends bien, c'est probablement parce que je suis constamment en train d'appliquer> 0.1f lorsque je bouge, ce qui entraîne la fonction de fonctionner continuellement mais honnêtement, je suis perdu et toute aide serait appréciée.

using UnityEngine; 
using System.Collections; 

[RequireComponent (typeof (Controller2D))] 
public class Player : MonoBehaviour { 

public float jumpHeight = 4; 
public float timeToJumpApex = .4f; 
float accelerationTimeAirbourne = .2f; 
float acceleratinTimeGrounded =.1f; 
public float moveSpeed = 6; 

float jumpVelocity; 
float gravity; 
Vector3 velocity; 
float velocityXSmoothing; 

Controller2D controller;  

void Start(){ 
    controller = GetComponent<Controller2D>(); 
    gravity = -(2 * jumpHeight)/Mathf.Pow (timeToJumpApex, 2); 
    jumpVelocity = Mathf.Abs(gravity) * timeToJumpApex;  
    print ("gravity: " + gravity + " Jump Velocity: " + jumpVelocity); 
} 

void Update(){ 

    if (controller.collisions.above || controller.collisions.above) { 
     velocity.y = 0; 
    } 

    Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), 
Input.GetAxisRaw ("Vertical")); 

    if (Input.GetKeyDown (KeyCode.Space) && controller.collisions.below) { 
     velocity.y = jumpVelocity; 
    } 

    float targetVelocityX = input.x * moveSpeed; 
    velocity.x = Mathf.SmoothDamp(velocity.x, targetVelocityX, ref 
velocityXSmoothing, (controller.collisions.below)? 
acceleratinTimeGrounded:accelerationTimeAirbourne); 
    velocity.y += gravity * Time.deltaTime; 
    controller.Move(velocity * Time.deltaTime); 
} 

void FixedUpdate(){ 

if ((Input.GetAxis("Horizontal") > 0.1f && this.transform.localScale.x != 1) 
|| (Input.GetAxis("Horizontal") < -0.1f && this.transform.localScale.x != 
-1)) 
{ 
flip(); 
} 

} 

void flip() 
{ 
    this.transform.localScale = new Vector3(this.transform.localScale.x * 
    -1, 
    this.transform.localScale.y, this.transform.localScale.z); 
} 



} 

Répondre

2

Votre erreur est ici

void FixedUpdate(){ 
if ((Input.GetAxis("Horizontal") > 0.1f && this.transform.localScale.x != 1)|| (Input.GetAxis("Horizontal") < -0.1f && this.transform.localScale.x != 
-1)){ 
     flip(); 
    } 
} 

Une fois que vous retournez, la condition évalue toujours vrai. Vous aurez besoin d'un booléen hasflipped pour vérifier si vous avez déjà basculé, et si vous ne l'avez pas encore retourné :)

La mise à jour fixe entraîne l'exécution de cette vérification une fois par image, de sorte que vous allez avoir un paquet de scintillement pendant que votre sprite retourne chaque image, sauf si vous spécifiez seulement pour retourner une fois

+0

Seriez-vous si aimable de me donner un exemple de script? Je comprends ce que vous voulez dire, mais l'application est difficile :) – James

+0

utilisez 'Input.GetKeyDown ("/* the key */")' à la place :) De cette façon, vous pouvez l'appeler dans la fonction 'FixedUpdate()' une fois que. J'espère que cela t'aides! –