Jak używać Input.GetAxis („Mysz X / Y”) do obracania aparatu?


13

Chcę zrobić aparat z widokiem pierwszej osoby, który obraca się za pomocą myszy.

Spojrzałem na stronę API Input.GetAxis Scripting API i znalazłem przykładowy kod, który zamieściłem na dole mojego postu. Po wypróbowaniu, zdałem sobie sprawę, że chociaż ma tę samą podstawową funkcjonalność, na którą liczyłem, nie utrzyma kamery równolegle do płaszczyzny xz, szczególnie podczas poruszania myszą w kółko. Po chwili kamera byłaby pod dziwnym kątem, a gracz byłby całkowicie rozczłonkowany!

Czy istnieje szybki sposób naprawienia tego kodu, który w jakiś sposób ograniczy ruch aparatu, czy jest lepszy sposób na obrócenie aparatu?

 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);
         }
     }

To, czego doświadczasz, brzmi jak blokada gimbala. Dzieje się tak, gdy używasz kątów Eulera do obrotu. Musiałbym wykonać kilka testów, aby zaoferować rozwiązanie. Zasadniczo musisz używać czwartorzędów. Nie cierpią na blokadę gimbala.
Fuzzy Logic

Jak miałbym używać ćwiartki do rotacji? Próbowałem transform.rotation = Quaternion.Slerp (-Input.GetAxis („Mouse X”), Input.GetAxis („Mouse X”), Time.deltaTime * freeLookTurningSpeed); , ale to dało mi błędy.
reinkarnacja

Ok, zrobiłem test. Na szczęście nie jest to blokada gimbala. Wyślę rozwiązanie jako odpowiedź dla ciebie.
Fuzzy Logic

Odpowiedzi:


18

Problem polega na tym, że aktualizujesz istniejącą rotację zamiast ją śledzić i zastępujesz każdą aktualizacją.

Po zaktualizowaniu obrotu łączy on nowy obrót ze starym, co prowadzi do nieoczekiwanego zachowania.

Rozwiązaniem jest śledzenie skumulowanego obrotu i resetowanie obrotu całkowicie przy każdej aktualizacji z nowymi wartościami.

Kredyt gdzie należny, znalazłem odpowiedź tutaj: Unity Answers: how-to-lock-or-set-the-cameras-z-rotation-to-zero

Kod roboczy:

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);
    }
}

Kluczowe różnice:

  • Przechowuj odchylenie i skok jako członków klasy, a nie lokalne zmienne metod, abyś mógł śledzić skumulowane wartości.
  • Użyj + = i / lub - =, aby zgromadzić każdą aktualizację.
  • Użyj eulerAngles (aby zastąpić wartość obrotu przy każdej aktualizacji) zamiast Rotate (który zastosuje twój nowy obrót na starym).

Proszę bardzo. Jeśli opublikowane przeze mnie rozwiązanie rozwiązało pierwotny problem, który miałeś, powinieneś zaakceptować go jako odpowiedź. Jeśli chcesz uzyskać pomoc w związku z nowym problemem, powinieneś zadać nowe pytanie, aby utrzymać porządek i zwiększyć prawdopodobieństwo, że inni będą w stanie Ci pomóc lub znaleźć twoje pytanie, jeśli mają podobny problem. Obszary komentarzy nie są przeznaczone do rozszerzonego okna dialogowego. Twoje zdrowie.
Fuzzy Logic,

0

Co się stanie, jeśli uczynisz kamerę dzieckiem pustym przedmiotem gry. Następnie za pomocą jednego skryptu zarządzasz pustym obrotem obiektu gry względem wektora UP. (MouseX) Za pomocą innego skryptu dołączonego do obiektu gry kamery zarządzasz rotacją względem wektora prawego (MouseY)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.