2017-06-05 5 views
0

Ich habe ein Unity-Spiel mit Querformat. Ich möchte die Kamera nach links und rechts drehen können. Mehr, ich möchte die Kamera entsprechend der Gyro-Neigung in der y-Achse und dem Gesamtvektor nach links oder rechts drehen. Mit anderen Worten, ich möchte die Kamera wie eine Person in einem Raum bewegen können. Die Kamera ist der Hauptspieler meines Spiels.So verschieben Sie die Kamera mit Gyro in Unity

Dies ist, was ich zu tun versucht:

GameObject CamParent; 
Rigidbody RB; 

void Start() 
{ 

    CamParent = new GameObject("CamParent"); 
    CamParent.transform.position = this.transform.position; 
    this.transform.parent = CamParent.transform; 
    Input.gyro.enabled = true; 
    RB = this.GetComponent<Rigidbody>(); 
} 

void Update() 
{ 
    CamParent.transform.Rotate(0, -Input.gyro.rotationRateUnbiased.y, 0); 
    this.transform.Rotate(-Input.gyro.rotationRateUnbiased.x, 0,0); 
    float Z = -Input.gyro.userAcceleration.z; 
    RB.AddForce(new Vector3(0,0,Z)*10); 
} 
+1

Ich bin mir nicht sicher, ob ich verstehe, was Sie zu tun versuchen, aber wäre es nicht mehr Sinn machen, einen starren Körper, um die Kamera Eltern hinzuzufügen, und die Kraft zu, dass hinzufügen, anstatt eine Kraft direkt auf die Kamera des Hinzufügens ? Andernfalls, wenn sich die Kamera von ihrer ursprünglichen Position bewegt, ändert sich der Effekt des Drehens des Kamera-Elternteils. – lockstock

Antwort

0

ich versucht habe Ihre Frage so gut ich kann zu beantworten, wie Ihre Frage war ein wenig zu mir unklar.

In erster Linie, da Sie Kräfte und Physik verwenden, sollten Sie die void FixedUpdate() Funktion anstelle der void Update() Funktion verwenden. Dadurch wird sichergestellt, dass Ihr Code in gleichmäßigen Abständen ausgeführt wird, was im Umgang mit der Physik sehr wichtig ist.

Ich bin mir auch nicht sicher, warum Sie ein neues GameObject instanziiert haben. Sie können dieses Skript einfach zu einem Camera GameObject in Unity hinzufügen und dann eine Rigidbody-Komponente zur Kamera hinzufügen. Dies wird Ihre Start() Funktion vereinfachen, die nur diese beiden Zeilen enthalten:

Input.gyro.enabled = true; 
RB = gameObject.GetComponent<Rigidbody>(); 

Als nächstes ist es wichtig zu beachten, dass die Quaternion vom Input.gyro.attide zurückgekehrt Koordinaten linkshändig, während Unity rechtshändig Koordinaten hat.

Quaternion GyroToUnity(Quaternion quat) 
{ 
    return new Quaternion(quat.x, quat.z, quat.y, -quat.w); 
} 

Ich bin sicher, es gibt auch andere Möglichkeiten, um diese Umwandlung zu erreichen, aber auf diese Weise funktioniert bei mir: Diese Konvertierung von Gyroskop zur Einheit kann mit der folgenden Funktion erreicht werden.

Jetzt befassen wir uns mit der Rotation der Kamera. Beginnen Sie mit der Einstellung der Kamera-Drehung, indem Sie transform.rotation der Kamera gleich dem Quaternion setzen, das Sie gerade von Gyroscope konvertiert haben. Es gibt jedoch ein weiteres Problem, da die Gyroskop-Z-Achse in die gleiche Richtung zeigt wie die Y-Achse von Unity. Dies kann behoben werden, indem einfach transform.Rotate(90,0,0); ausgeführt wird. Schließlich setzen wir die Drehung der Kamera diese Codezeile verwenden:

transform.rotation = Quaternion.Euler(new Vector3(0f, transform.rotation.eulerAngles.y, 0f)); 

Letzte wir behandeln müssen eine Kraft auf die Kamera hinzugefügt wird. Ich bin mir nicht sicher, wie genau die Bewegung gehandhabt werden soll, aber ich nehme an, dass Sie eine Bewegung um die z-Achse in Bezug auf die Rotation der Kamera wünschen. Um dies zu tun, müssen Sie die AddRelativeForce(Vector3 relativeForce) von der Rigidbody-Komponente auf der Kamera verwenden.

Um jedoch die Richtung der Kraft zu bestimmen, müssen wir den Grad der Drehung um die x-Achse von Quaternion, die wir früher zur Einheit konvertiert haben, erreichen. yourQuat.eulerAngles.x, die eine float so zurückgibt, dass 0 < = x < 360. Mit der Art und Weise, die wir das Kamera-Koordinatensystem orientierte, sollte geradeaus zeigen mit Ihrem iOS-Gerät einen Wert von etwa 0,0 zurückgeben. Während ich mit dieser Frage herumgespielt, fand ich, dass dieser Code angemessen die Kamera gerichtet:

Vector3 relativeForce; 
if (yourQuat.eulerAngles.x > 315 || yourQuat.eulerAngles.x < 90) 
    relativeForce = Vector3.forward; 
else if (yourQuat.eulerAngles.x < 315) 
    relativeForce = Vector3.back; 
else 
    relativeForce = Vector3.zero; 

schließlich den nachfolgenden Vector3 Wert nehmen und verwenden, wie so

RB.AddRelativeForce(relativeForce);

Hoffnung, das hilft.Wenn dies nicht die exakte Funktionalität ist, nach der Sie gesucht haben, sollte dies einen guten Start für die Feinabstimmung Ihres Programms bedeuten, um genau das zu tun, was Sie wollen.

Verwandte Themen