Unity3D memorizza le rotazioni in una rappresentazione matematica piuttosto astratta denominata quaternion. La trasformazione da e verso gli angoli di Eulero (ciò che si vede nell'editor di Unity) comporta una cascata di funzioni trigonometriche e quindi è soggetta a errori di arrotondamento, specialmente per il tipo di float semplice.
Per aggirare questo problema nel proprio caso, si consiglia di archiviare l'oggetto Quaternion iniziale prima di iniziare a ruotare e impostarlo alla fine del processo. Qualche pseudo-codice:
public class RotationController : MonoBehaviour {
Quaternion rotationAtStart;
int numOfRotations = 0;
void rotate() {
numOfRotations++;
if (numOfRotations == 1) {
rotationAtStart = transform.rotation;
} else if (numOfRotations < 9) {
transform.Rotate (new Vector3 (0,40.0f,0));
} else if (numOfRotations == 9) {
transform.rotation = rotationAtStart;
}
}
void Update() {
if (numOfRotations < 9) {
rotate();
}
}
}
La particolare situazione a 360 ° rende questo approccio stabile. Per meno di 360 ° devi vivere con piccoli errori di arrotondamento. In questo caso, suggerirei di calcolare il quaternione di riferimento Quaternion.RotateTowards
e impostarlo nell'ultimo passaggio analogico al caso 360.
Un'altra cosa utile per voi sono Animations. È possibile definire un'animazione come graduale o con passaggi discreti e chiamare semplicemente GameObject.animation.Play("MyRotation")
se si preme "i". Usa un AnimationEvent alla fine per essere informato quando l'animazione è terminata.
E infine Mathf contiene una funzione Approximately che si occupa del problema dell'imprecisione in virgola mobile.
Se ho usato un'animazione come da te suggerito vorrei che cambiare gli oggetti asse locale o se è solo ruotare l'oggetto? – Dave
Si animano i membri della trasformazione dell'oggetto di gioco. transform.rotation è negli angoli di Eulero – Kay
Grazie per il vostro aiuto. È più un modo per aggirare il problema che una soluzione. Non sarei in grado di dire se (transform.eulerAngles.y == 40.0f) perché sebbene ruoti verso un risultato più accurato ci sono ancora degli errori. Non ho ancora provato il suggerimento di animazione, ma lo farò solo ora. – Dave