2016-04-19 8 views
0

I derzeit folgende Logik verwenden, um ein Objekt um ein anderes Objekt zu drehen, und der Bedingungen nicht mehr als 90 Grad überschreiten oder unter 1.rotierenden Objekt bricht Einschränkungen/Bounds

protected void RotationBounds(){ 
bRotateDown = true; 
bRotateUp = true; 
if (_CannonTube.transform.rotation.eulerAngles.z >= 90) 
    bRotateUp = false; 
if (_CannonTube.transform.rotation.eulerAngles.z <= 1) 
    bRotateDown = false; 
} 

Dies ermöglicht es mir, die die Drehung zu stoppen, in eine Richtung, sobald die Bedingung getroffen wird. Ich setze dann die Drehung mit den folgenden Mausbewegungssteuerungen ein:

protected void RotateCannonMouse(){ 
if (Input.GetKey ("mouse 0")) { 
     if (Input.GetAxis ("Mouse Y") > 0 && bRotateUp == true && bRotateDown == true 
     || Input.GetAxis ("Mouse Y") > 0 && bRotateUp == false && bRotateDown == true) { 
        transform.RotateAround (_SphereBase.position, -transform.forward, 
        Input.GetAxis ("Mouse Y") * 15); 
      } 
     if (Input.GetAxis ("Mouse Y") < 0 && bRotateUp == true && bRotateDown == true 
     || Input.GetAxis ("Mouse Y") < 0 && bRotateUp == true && bRotateDown == false) { 
        transform.RotateAround (_SphereBase.position, -transform.forward, 
         Input.GetAxis ("Mouse Y") * 15); 
     } 
} 

Die folgenden functons werden dann in der Update-Methode aufgerufen.

void Update() { 
    RotateCannonMouse(); 
    RotationBounds(); 
    } 

Meine Frage/Problem ist, dass, wenn ich in einem langsamen/mittlerer Geschwindigkeit das Objekt bewegen drehen sich die Bedingungen getroffen und es tut, wie ich erwartet. Wenn ich das Objekt schnell rotiere, wird es die Bedingungen durchbrechen und die Drehung durcheinander bringen. Ist jemand schon einmal auf dieses Problem gestoßen? Ich dachte, dass die Update-Methode nicht schnell genug iteriert oder dass ich das Objekt so schnell rotiere, dass es die Grenzen überschreitet?

Vielen Dank im fortgeschrittenen

Antwort

1

sammeln Sie alle Ihre Daten, tun alle Ihre Berechnungen und Prüfungen und erst dann drehen schließlich, wenn nötig. Du machst es irgendwie rückwärts. Sie drehen zuerst und versuchen dann, das Durcheinander zu säubern. Sie können sicher machen, dass es funktioniert, aber es ist der schwierigste Weg ohne Grund oder Gewinn.

speichern Sie einfach den Rückgabewert Input.GetAxis("Mouse Y"), fügen Sie es zu Ihrer berechneten (oder sogar auch gespeicherten) aktuellen Rotation, überprüfen Sie, ob es innerhalb der Grenzen (oder klemmen Sie) und dann, am Ende, entscheiden, ob und wie weit du drehst dich.

(auch nicht du == mit einem boolean tun müssen, sein entweder wahr oder falsch bereits -.>if(abool == true) ist die gleiche wie if(abool) und if(abool == false) die gleiche wie if(!abool) ist OFC es nicht falsch ist, es macht es schwer zu lesen)

1

Dies ist die Lösung, die wir

//If mouse has been clicked 
    if (Input.GetKey ("mouse 0")) { 

     //Get the angle the mouse wants to move by 
     float mouseY = Input.GetAxis ("Mouse Y") * 5; 

     //If the angle is not 0 then we see how much it can move by 
     if (mouseY != 0) { 

      //Get the current angle of the cannon 
      float currentAngle = _CannonTube.transform.rotation.eulerAngles.z; 

      //Work out the new angle that the cannon will go to 
      float calcAngle = 0.0f; 

      if (mouseY < 0) { 
       calcAngle = currentAngle - mouseY; 
      } else { 
       calcAngle = currentAngle - mouseY; 
      } 

      //Clamp calcAngle between 5 and 85 
      var newAngle = Mathf.Clamp (calcAngle, 5, 85); 

      //calcualte the angle that we are allowed to move by. 
      //for example if current angle is 85 and new angle is 85 from the clamp then we move 0 degrees 
      var rotateAngle = currentAngle - newAngle; 

      //rotate the cannon 
      transform.RotateAround (_SphereBase.position, -transform.forward, rotateAngle); 
     } 
    } 
+0

jetzt fanden diese es viel besser lesbar tun aussehen? Sie brauchen nicht die 3. Wenn es aber das gleiche macht, egal ob es wahr oder falsch ist. Entfernen Sie einfach den Scheck und verlassen Sie die Berechnung. Eigentlich könnte man calcAngle einfach mit dem berechneten Wert initialisieren ... – yes

Verwandte Themen