2017-07-08 5 views
0

Ich versuche eine rotierende Kanone zu machen, die sich vorwärts und rückwärts dreht. Ich möchte die Rotation von -55 auf 55 beschränken (ich meine transform.position.z), aber ich kann es nicht funktionieren lassen.Unity 2D - Objekt drehen und Rotation begrenzen

Im Moment ist mein Code:

public class Cannon : MonoBehaviour 
{ 
    bool hit = false; 

    void Update() 
    { 
     float angle = transform.rotation.z; 
     if (angle > -55 & angle < 55 & !hit) 
     { 
      transform.Rotate(Vector3.back * Time.deltaTime); 
     } 

     if (angle <= -55) 
     { 
      transform.Rotate(Vector3.back * Time.deltaTime); 
      hit = true; 
     } 
     if (angle >= 55) 
     { 
      transform.Rotate(Vector3.forward * Time.deltaTime); 
      hit = true; 
     } 
    } 
} 

Die denken nur, dass arbeitet die erste Drehung ist, die ich für das Objekt gemacht haben zu drehen beginnt, so dreht er sich einfach zurück und nicht stoppen scheint es zu ignorieren "Winkel"

Ich habe auch versucht, die letzten 2 If Aussagen, innerhalb der ersten, aber immer noch nicht funktioniert.

Ich möchte es drehen, bis es -55 traf, dann zu drehen, bis es +55 trifft und das wiederholen.

+0

ich bemerkt, dass Sie auf Ihre Fragen ein paar gute Antworten gehabt haben, aber sie haben keine von ihnen markiert als angenommen. Bitte denken Sie daran, wenn Ihnen eine Antwort rechtmäßig geholfen hat (indem Sie auf das Häkchen neben der Antwort klicken). Es belohnt diejenigen, die Ihnen helfen, erhöht Ihren Ruf zur gleichen Zeit und erleichtert es anderen Benutzern mit einem ähnlichen Problem, gute Antworten zu finden –

Antwort

0

Das erste, was Sie tun müssen, ist Euler Angles statt Quarternions zu verwenden, um die Drehung in Grad zu finden.

Dann, da es keine negativen Winkel, sondern eher Winkel von 0 bis 360 meldet, müssen Sie 360 ​​subtrahieren, wenn größer als 180, um den negativen Winkel zu erhalten.

Von dort aus können Sie Ihren Test anwenden es in Grenzen zu halten:

public class Cannon : MonoBehaviour { 

    public float direction = 1f; // initial direction 
    public float speed = 20f; // speed of rotation 

    void Update() 
    { 
     float angle = transform.eulerAngles.z; 
     if (angle > 180f) angle -= 360f; 

     if ((angle < -55f) || (angle > 55f)) direction *= -1f; // reverse direction (toggles between 1 & -1) 

     transform.Rotate (0, 0, speed * direction * Time.deltaTime); 
    } 
}