Wie verwende ich Input.GetAxis („Maus X / Y“), um die Kamera zu drehen?


13

Ich möchte eine First-Person-Kamera erstellen, die sich mit der Maus dreht.

Ich habe mir die Input.GetAxis Scripting API-Seite angesehen und einen Beispielcode gefunden, den ich am Ende meines Beitrags eingefügt habe. Als ich es ausprobierte, stellte ich fest, dass es zwar die gleiche Grundfunktionalität hat, die ich mir erhofft hatte, die Kamera jedoch nicht parallel zur xz-Ebene hält, insbesondere wenn die Maus im Kreis bewegt wird. Nach einer Weile würde sich die Kamera in einem merkwürdigen Winkel befinden und der Player wäre völlig durcheinander!

Gibt es eine schnelle Lösung für diesen Code, die die Kamerabewegung irgendwie einschränken würde, oder gibt es eine bessere Möglichkeit, die Kamera zu drehen?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }

Was Sie erleben, klingt wie Gimbal Lock. Dies passiert, wenn Sie Eulerwinkel für die Drehung verwenden. Ich müsste einige Tests durchführen, um eine Lösung anzubieten. Grundsätzlich müssen Sie Quaternionen verwenden. Sie leiden nicht unter Gimbal Lock.
Fuzzy Logic

Wie würde ich eine Quaternion verwenden, um eine Rotation durchzuführen? Ich habe versucht, transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Maus X"), Input.GetAxis ("Maus X"), Time.deltaTime * freeLookTurningSpeed); , aber das gab mir Fehler.
Reinkarnation des

Ok, ich habe einen Test gemacht. Zum Glück ist es kein Gimbal Lock. Ich werde die Lösung als Antwort für Sie veröffentlichen.
Fuzzy Logic

Antworten:


18

Das Problem ist, dass Sie die vorhandene Rotation aktualisieren, anstatt sie selbst zu verfolgen und bei jedem Update zu ersetzen.

Wenn Sie die Rotation aktualisieren, wird Ihre neue Rotation mit der alten Rotation kombiniert, was zu unerwartetem Verhalten führt.

Die Lösung besteht darin, Ihre akkumulierte Rotation zu verfolgen und die Rotation bei jeder Aktualisierung mit Ihren neuen Werten vollständig zurückzusetzen.

Gutschrift wo fällig, fand ich die Antwort hier: Unity Answers: Wie-sperren-oder-setzen-die-Kameras-Z-Drehung-auf-Null

Arbeitscode:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

Hauptunterschiede:

  • Speichern Sie das Gieren und die Tonhöhe als Klassenmitglieder und nicht als lokale Methodenvariablen, damit Sie die akkumulierten Werte verfolgen können.
  • Verwenden Sie + = und / oder - =, um jedes Update zu akkumulieren.
  • Verwenden Sie eulerAngles (um den Rotationswert bei jeder Aktualisierung zu überschreiben) anstelle von Rotate (wodurch Ihre neue Rotation auf die alte angewendet wird).

Gern geschehen. Wenn diese von mir veröffentlichte Lösung das ursprüngliche Problem gelöst hat, sollten Sie sie als Antwort akzeptieren. Wenn Sie Hilfe bei Ihrem neuen Problem erhalten möchten, sollten Sie eine neue Frage stellen, um Ordnung zu schaffen und die Wahrscheinlichkeit zu erhöhen, dass andere Ihnen helfen oder Ihre Frage finden können, wenn sie ein ähnliches Problem haben. Die Kommentarbereiche sind nicht für erweiterte Dialoge gedacht. Prost.
Fuzzy Logic

0

Was ist, wenn Sie die Kamera zu einem leeren Spielobjekt machen? Dann verwalten Sie mit einem Skript die Drehung des leeren Spielobjekts relativ zum UP-Vektor. (MouseX) Mit einem anderen Skript, das dem Kamera-Spielobjekt zugeordnet ist, verwalten Sie die Rotation relativ zum rechten Vektor (MouseY).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.