2017-09-10 2 views
0

Je suis en train d'écrire un mouvement pour mon objet spatial de jeu et de vaisseau spatial (joueur) avec le curseur de la souris.Unité: Mouvement spécial pour le jeu

ont actuellement code suivant:

using UnityEngine; 
using System.Collections; 
using UnityEngine.EventSystems; 

public class Move : MonoBehaviour { 

    public float speed = 1.5f; 
    public float rotationSpeed = 90f; 
    public float rotPrecision = 0.1f; 
    public float movePrecision = 0.1f; 
    private Vector3 pos; 
    private Quaternion qTo; 

    void Start() { 
     pos = transform.position; 
     qTo = transform.rotation; 
    } 

    void Update() { 
     if (!EventSystem.current.IsPointerOverGameObject()) 
     { 

      if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)) 
      { 
       pos = Input.mousePosition; 
       pos.z = transform.position.z - Camera.main.transform.position.z; 
       pos = Camera.main.ScreenToWorldPoint(pos); 
      } 

      var dir = pos - transform.position; 
      qTo = Quaternion.LookRotation(Vector3.forward, pos - transform.position); 

      if (Quaternion.Angle(transform.rotation, qTo) >= rotPrecision) //just set your own precision 
       transform.rotation = Quaternion.RotateTowards(transform.rotation, qTo, Time.deltaTime * rotationSpeed); 

      if (Vector3.Distance(transform.position, pos) > movePrecision) // 0.1f 
       transform.Translate(Vector3.up * speed * Time.deltaTime); 
     } 
    }  

} 

Mais j'ai le problème avec la précision et la rotation mouvement lorsque le point est trop proche de joueur (avoir boucle infinie).

L'idée de ce système de mouvement décrit avec l'image suivante:

(acteur joueur est vert, le chemin est gris, et le point de destination est rouge).

movement plan

J'espère que quelqu'un pourrait me aider w/que.

Merci!

Répondre

1

Si je comprends bien votre question, le problème est que le mouvement du joueur ne s'arrête jamais car le code ne peut pas atteindre un point d'arrivée.

Pour résoudre ce problème, vous pouvez ajouter une marge de précision acceptable. Calculez donc si la différence entre la rotation que vous souhaitez ou le mouvement que vous souhaitez, et la rotation/position actuelle du joueur, est inférieure à une variable donnée, par exemple inférieure à 0,05%. De cette façon, vous pourriez permettre au programme de savoir que si la précision est de seulement 0,05%, alors il est possible qu'il arrête de bouger. Sinon, si le programme n'atteint jamais une rotation et une position complètes et parfaites, il continuera à s'ajuster sans cesse en raison d'une légère imprécision mathématique dans les calculs et les mouvements.

+0

Pourriez-vous partager un exemple de code ou une explication de quelle précision vouliez-vous parler? – featureoffuture

+0

Il semble que le code que vous utilisez actuellement tente déjà de faire le calcul de précision. Essayez d'ajuster les valeurs rotPrecision et movePrecision à une valeur plus élevée. N'oubliez pas que vous devez le faire dans l'inspecteur, pas dans le code. – Doh09

+0

J'ai essayé n'importe quoi ... mais rien ne fonctionne correctement ... – featureoffuture