2017-09-09 3 views
0

Dies ist seit einer Woche ein Problem. Ich kann es nicht herausfinden. Ich versuche, mein U-Boot um seine Y-Achse zu drehen, sobald es auf dem Kopf steht. Es dreht sich an meiner Mausposition.C# Einheit Fehler kann nicht mein U-Boot auf seiner y-Achse spiegeln

Dieser Code dreht mein U-Boot auf Mausposition, die perfekt ist.

Vector3 RayPos = cam.WorldToScreenPoint(transform.position); 
Vector3 dir = Input.mousePosition - RayPos; 
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; 
Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward); 
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 
rotateSpeed * Time.deltaTime);[sub flipping y][1] 

Jetzt ist dieser Code mein Problem. Sobald mein Sub auf den Kopf geht, dreht es sich um (y), aber es macht es nur einmal und dann, wenn ich den richtigen Weg zurück gehe, wird es nicht mehr (y) kippen.

Debug.Log(Mathf.Abs(Vector3.Dot(transform.up, Vector3.up))); 
if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.down)) < 0.125f) 
{ 
    if (Mathf.Abs(Vector3.Dot(transform.right, Vector3.down)) > 0.825f) 
    { 
     SubTrans.localScale = new Vector3(transform.localScale.x, -1, 
     transform.localScale.z); 
    } 
    else 
    { 
     SubTrans.localScale = new Vector3(transform.localScale.x, 1, 
     transform.localScale.z); 
    } 
} 
+1

Dies ist das zweite Mal, dass Sie diese Frage stellen. Sie erhalten keine Antworten, weil es schwierig ist, Ihr Problem zu verstehen. Vielleicht solltest du ein animiertes gif anzeigen, wie das Problem aussieht. – Programmer

Antwort

0
if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.down)) < 0.125f) 

Ich nehme an, das Ihr Code macht den Swap nur durchführen, wenn die Unter ~ 90 ° auf dem Boden ist. Dies ist in Ordnung, weil der absolute Wert bedeutet, dass es auf beiden linken & rechten Seiten auftritt.

if (Mathf.Abs(Vector3.Dot(transform.right, Vector3.down)) > 0.825f) 

Dies ist jedoch falsch, weil der Absolutwert. Es behandelt & das gleiche (im Vergleich, da Sie transform.right verwenden), was bedeutet, dass es immer umkehrt, weil abs (transform.right) immer> 0,8 ist, wenn die vorherige Bedingung gültig ist.

Sie überprüft werden sollte, ob die Unter zeigt oben oder unten durch die Aufwärtsrichtung wie diese halten Sie können

if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.up)) > 0f) //less than 90deg angle with up 
//flip sub upwards 
else 
//flip downwards 

Überprüfung der Außen wenn bedingte, wenn Sie es zu bestimmten Zeiten drehen wollen, aber das ist alles was benötigt wird.