2017-09-21 9 views
1

Sup. Mon sprite va trop vite quand j'appuie sur le bouton C. C'est un loup qui se fend en attaque. Mais ça passe d'un endroit à l'autre, et j'ai l'impression que j'utilise tout simplement le mauvais type de code. Je devine qu'il doit faire plus avec Rigidbody2D = new Vector2 .... mais je ne sais pas où aller à partir de là. Voici ce que je travaille actuellement.L'image-objet 2d va trop vite avec transform.translate en script C# (unité)

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 

public class tulMoveMount : MonoBehaviour { 

    private Animator anim; 
    private Rigidbody2D rb; 

    private bool goRight = true; 
    private bool jump = false; 
    private bool idle = true; 
    public float lungeDistance; 
    public float lungeSpeed; 
    public float lungeHeight; 

    void Start() 
    { 
     anim = GetComponent<Animator>(); 
     rb = GetComponent<Rigidbody2D>(); 
    } 

    void Update() 
    { 
     HandleCommands(); 
    } 


    void HandleCommands() 
    { 
     if (!jump && goRight && Input.GetKeyDown (KeyCode.C)) { 
      idle = false; 
      jump = true; 
      anim.SetTrigger ("jump"); 
      rb = transform.Translate (lungeSpeed + lungeDistance, lungeHeight, 0); // HERE 
      idle = true; 
      jump = false; 
      anim.SetTrigger ("idle"); 
     } 
     if (!jump && !goRight && Input.GetKeyDown (KeyCode.C)) { 
      idle = false; 
      jump = true; 
      anim.SetTrigger ("jump"); 
      rb = transform.Translate (lungeSpeed + -lungeDistance, lungeHeight, 0); // HERE 
      idle = true; 
      jump = false; 
      anim.SetTrigger ("idle"); 
     } 
    } 
} 

Répondre

1

Pour obtenir une bonne traduction d'un point à un autre, vous pouvez utiliser Lerp dans un Corouting.

Dans Lerp, le premier paramètre est la position de départ et le second le tarif. Le troisième paramètre est un flottant entre 0 et 1. Si c'est 0, vous obtenez le premier paramètre dans Lerp. Si c'est 1, vous obtenez la seconde. Si 0.5 un point milieu entre les deux et ainsi de suite ...

Donc, ce que vous devez faire est de démarrer une courutine, qui sera indépendante du taux fps, et déplacera votre GameObject à une vitesse constante définie par le distance entre start-target et le temps que vous voulez pour passer de l'un à l'autre.

public class WolfMovement : MonoBehaviour { 

    Vector3 start; 
    Vector3 target; 

    float lungeSpeed = .8f; 
    float lungeDistance = 5; 

    private IEnumerator coroutine; 

    void Update() { 
     if(Input.GetKeyDown(KeyCode.M)) 
     { 
      start = transform.position; 
      target = new Vector3(transform.position.x + lungeDistance,transform.position.y , transform.position.z); 

      coroutine = MoveObject(start,target,lungeSpeed); 
      StartCoroutine(coroutine); 

     } 
    } 

    IEnumerator MoveObject (Vector3 start, Vector3 target, float speed){ 
     float i = 0.0f; 
     float rate = 1.0f/speed; 
     while (i < 1.0) { 
      i += Time.deltaTime * rate; 
      transform.position = Vector3.Lerp(start, target, i); 
      yield return null; 
     } 
    } 

} 
+1

ok. vous m'avez simplement fourni tout le code et résolu le problème. Je ne sais pas d'où vous venez de super-héros, mais merci lol –

+0

@JoeClark lol. Je vous en prie. J'ai essayé de vous résoudre ainsi que le problème que vous aviez en retournant le Sprite 2D, mais je ne sais pas si l'approche a fonctionné –

1

Multipliant la traduction par Time.DeltaTime va lisser le mouvement sur plusieurs images, et vous devrez alors modifier seulement le lungeSpeed pour obtenir la vitesse souhaitée.

rb = transform.Translate ((lungeSpeed + lungeDistance, lungeHeight, 0)*Time.deltaTime); 
+0

oui! J'ai essayé cela plus tôt, mais pour une raison quelconque, il n'aime pas ça et continue à me donner un message d'erreur. J'utilise un cpu à l'école en ce moment même si c'est peut-être le problème. J'ai vu beaucoup d'entre eux depuis que j'ai branché mon projet dedans. Je vais l'essayer sur mon ordinateur à la maison quand j'ai l'occasion et revenir à vous alors. Merci pour les commentaires –

+0

@JoeClark vous devrez peut-être jouer avec où '' Time.deltaTime' est placé sur cette ligne pour obtenir l'effet que vous recherchez. – Bejasc