Як використовувати Input.GetAxis ("Миша X / Y") для обертання камери?


13

Я хочу зробити камеру від першої особи, яка обертається мишкою.

Я переглянув сторінку API Input.GetAxis Scripting Scripting і знайшов зразок коду, який я включив у нижній частині своєї публікації. Спробувавши це, я зрозумів, що, хоча він має той самий базовий функціонал, на який я сподівався, він не підтримує камеру паралельно площині xz, особливо при переміщенні миші по колах. Через деякий час камера опинилася б під непарним кутом, і плеєр буде повністю розчленований!

Чи є швидке виправлення цього коду, який би якось обмежував рух камери, чи є кращий спосіб повернути камеру?

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

Те, що ви переживаєте, звучить як карданний замок. Це трапляється, коли ви використовуєте кути ейлера для обертання. Мені доведеться зробити тестування, щоб запропонувати рішення. В основному, потрібно використовувати кватерніони. Вони не страждають від карданного замка.
Нечітка логіка

Як я міг би використовувати кватерніон для обертання? Я спробував transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Миша X"), Input.GetAxis ("Миша X"), Time.deltaTime * freeLookTurningSpeed); , але це дало мені помилки.
перевтілення на

Гаразд, я зробив тест. На щастя, це не карданний замок. Я опублікую рішення як відповідь для вас.
Нечітка логіка

Відповіді:


18

Проблема полягає в тому, що ви оновлюєте існуючий поворот, а не відстежуєте його самостійно і замінюєте його кожним оновленням.

Під час оновлення обертання він поєднує нове обертання зі старим, що призводить до несподіваної поведінки.

Рішення полягає в тому, щоб відслідковувати накопичене обертання і скидати обертання повністю кожного оновлення з новими значеннями.

Зважаючи на це, я знайшов відповідь тут: Unity Answers: як заблокувати або встановити камери-z-обертання-до нуля

Код роботи:

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

Основні відмінності:

  • Зберігайте відхилення та нахил як члени класу, а не місцеві змінні методу, щоб ви могли відслідковувати накопичені значення.
  • Використовуйте + = і / або - = для накопичення кожного оновлення.
  • Використовуйте eulerAngles (щоб перезаписати значення обертання кожного оновлення) замість Rotate (що застосовує ваше нове обертання до старого).

Прошу. Якщо це рішення, яке я розмістив, вирішило первісну проблему, яку ви мали, ви повинні прийняти це як відповідь. Якщо ви хочете отримати допомогу у своїй новій проблемі, вам слід задати нове запитання, щоб уникнути впорядкованості та ймовірності, що інші зможуть вам допомогти або знайти ваше питання, якщо у них виникає подібна проблема. Області коментарів не призначені для розширеного діалогу. Ура.
Нечітка логіка

0

Що робити, якщо ви зробите дитиною з камери порожній ігровий об’єкт. Потім одним сценарієм ви керуєте поворотом порожнього ігрового об'єкта відносно вектора UP. (MouseX) За допомогою іншого сценарію, приєднаного до ігрового об'єкта камери, ви керуєте обертанням відносно правого вектора (MouseY)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.