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.
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