2017-03-18 6 views
0

J'ai essayé ces deux scripts C# pour tourner ma lumière directionnelle:Pourquoi ma lumière directionnelle tourner que de 90º à -90º (Unity 5.5)

using System.Collections; 
using UnityEngine; 

public class LightRotator : MonoBehaviour 
{ 

    void Update() 
    { 
     transform.rotation = Quaternion.Euler(transform.eulerAngles.x + 1.0f, 
               transform.eulerAngles.y, 
               transform.eulerAngles.z); 
    } 
} 

et

using System.Collections; 
using UnityEngine; 

public class LightRotator : MonoBehaviour 
{ 

    void Update() 
    {  
     transform.localEulerAngles = new Vector3(transform.localEulerAngles.x + 1.0f, 
               transform.localEulerAngles.y, 
               transform.localEulerAngles.z); 
    } 
} 

Ils les deux semblent fonctionner exactement de la même manière: Si je change transform.eulerAngles.y en transform.eulerAngles.y + 0.5f, la lumière tournera le long de l'axe des ordonnées, et la même chose fonctionnera pour l'axe z. Cependant, quand j'essaie de faire cela avec l'axe des x, il va tourner jusqu'à ce qu'il atteigne 90º, à quel point il continuera à essayer de tourner mais il repoussera immédiatement et continuellement à 90º. Si j'inverse la direction, il fait la même chose à -90º. Par exemple, la rotation peut être: 88,5,89,0,89,5,90,0, 90,5, 89,93, 90,24, 89,4, etc.

Quelle est la cause de ce blocage et comment puis-je le réparer?

+1

Malheureusement, je ne suis pas en mesure de reproduire le problème étant donné les informations que vous avez fournies. Avez-vous une chance de fournir un exemple de code court et autonome? – rutter

+0

[mvce] (http://stackoverflow.com/help/mcve) – zwcloud

+0

@rutter J'ai ajouté les scripts complets. – TrumpetDude

Répondre

0
+0

Cela semble être mon problème, mais ne me dit pas comment le réparer. En outre, j'ai essayé de transformer, de faire pivoter et de ne pas tourner du tout dans n'importe quelle direction. Je crois que la transformation ne fonctionne que pour la position et l'échelle. – TrumpetDude

+0

https://docs.unity3d.com/ScriptReference/Quaternion.html Pour être plus précis: https://docs.unity3d.com/ScriptReference/Quaternion-w.html – pasotee

0

Afin de résoudre votre problème, vous devez utiliser un vecteur supplémentaire, changer l'intérieur de mise à jour chaque image, et passer ensuite à la convenance eulerAngles de la transformation.

Vector3 vect = Vector3.zero; 
float rotationSpeed = 10f; 

void Start() { 
    vect = transform.eulerAngles; //Set the vect rotation equal to the game object's one 
} 

void Update() 
{ 
    vect.x += rotationSpeed * Time.deltaTime; 

    //Pass unique eulerAngles representation to the object without letting Unity change it 
    transform.eulerAngles = vect; 
} 

Cela arrive BTW parce qu'il sommes multiples représentation des angles euler d'une rotation physique unique dans l'espace 3D, et lorsque vous travaillez directement sur la propriété eulerAngles de la transformation, l'unité fait un travail dans les coulisses, qui peut conduire à une serrure de cardan.

0

Utiliser les quaternions. C'est ce que Unity3d utilise en interne et n'a aucun des effets secondaires des angles euler.

using System.Collections; 
using UnityEngine; 

public class LightRotator : MonoBehaviour 
{ 
    public Vector3 RotationAxis = Vector3.right; 

    Quaternion _startRotation; 
    float _rotationIncrement = 0; 
    void Start() 
    { 
     _startRotation = transform.rotation; 
    } 
    void Update() 
    { 
     Quaternion rotationMod = 
      Quaternion.AngleAxis(_rotationIncrement, RotationAxis); 
     _rotationIncrement += 1; 
     transform.rotation = _startRotation * rotationMod; 
    } 
} 

Cependant, vous voulez probablement utiliser quelque chose comme Quaternion.RotateTowards ou Quaternion.Lerp avec Time.time et un taux. Vous obtiendrez des résultats beaucoup plus fluides de cette façon.