2016-09-12 4 views
0

Ich möchte ein Objekt mit der linken Pfeiltaste drehen und ich möchte die Drehung auf 30 Grad begrenzen. Mein Code ist:Begrenzte Drehung mit Unity3D

if (Input.GetKey(KeyCode.LeftArrow) && transform.localEulerAngles.z <= 30) 
    transform.Rotate(0,0,1); 

Warum Drehung stoppt bis 31 Grad? Offensichtlich ist mein Problem komplexer als das, ich habe unterschiedliche Grenzen und brauche Präzision. Der Grund für dieses Beispiel ist einfach zu sagen, dass Rotationen nicht präzise sind, wenn sie auf diese Weise verwaltet werden.

Ich denke der Grund ist, dass Unity3D intern Quaternionen verwendet und auf Grad wirkt nur eine Annäherung ist. Ich habe recht? In diesem letzten Fall, wie kann ich damit umgehen?

Zum Beispiel, Wie kann ich Quaternionen an 30 Grad einer Drehung auf einer Achse binden?

Übrigens, wenn das Problem nicht das ist, haben Sie andere Lösungen?

Antwort

1

Ich weiß nicht, wie Einheit die Rotation verwalten, aber hier scheint Ihr Problem einfacher.

In Ihrem, wenn Sie den '< =' Vergleich verwenden, also wenn Ihr Objekt bei 30 Grad ist, geben Sie ein letztes Mal in der if und rotieren 1 Grad mehr, verwenden Sie eine '<', um im richtigen Moment zu stoppen

+0

Ich habe schon so versucht: das gleiche Ergebnis – Yuri

0

Holen Sie sich die aktuelle Drehung in der Start()-Funktion und verwenden Sie sie dann, um einen Offset zu finden, der zur Ausführung der if-Anweisung verwendet wird. Dies sollte es tun:

public GameObject gameObjectToRotate; 
Vector3 defaultAngle; 
float minRot = 30f; 
float maxRot = 30f; 

// Use this for initialization 
void Start() 
{ 
    defaultAngle = gameObjectToRotate.transform.eulerAngles; 
} 

// Update is called once per frame 
void Update() 
{ 
    if (Input.GetKey(KeyCode.LeftArrow)) 
    { 
     float offset = defaultAngle.z - gameObjectToRotate.transform.eulerAngles.z; 
     //Check if we are within min, max rot 
     if (offset < minRot && offset > -maxRot) 
     { 
      gameObjectToRotate.transform.Rotate(0, 0, 1); 
      Debug.Log("Rotating!"); 
     } 
    } 
} 

Die Präzision ist 30.016. Das ist viel besser als das, was Sie jetzt bekommen.

+0

Hey, ich erwarte, dass meine Antwort Ihr Problem gelöst hat. Wenn ja, bitte akzeptieren Sie dies als Antwort. – Programmer