Bagaimana cara menggunakan Input.GetAxis ("Mouse X / Y") untuk memutar kamera?

13

Saya ingin membuat kamera orang pertama yang berputar dengan mouse.

Saya melihat halaman API Scripting Input.GetAxis dan menemukan kode sampel, yang telah saya sertakan di bagian bawah posting saya. Setelah mencobanya, saya menyadari bahwa meskipun memiliki fungsi dasar yang sama seperti yang saya harapkan, itu tidak membuat kamera sejajar dengan bidang xz, terutama ketika menggerakkan mouse dalam lingkaran. Setelah beberapa saat, kamera akan berada pada sudut yang aneh, dan pemain akan benar-benar terganggu!

Apakah ada perbaikan cepat pada kode ini yang akan membatasi pergerakan kamera, atau ada cara yang lebih baik untuk memutar kamera?

 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);
         }
     }
reinkarnasi dari pertukaran simpanan
sumber
Apa yang Anda alami terdengar seperti kunci gimbal. Ini terjadi ketika Anda menggunakan sudut euler untuk rotasi. Saya harus melakukan beberapa pengujian untuk menawarkan solusi. Pada dasarnya, Anda perlu menggunakan angka empat. Mereka tidak menderita kunci gimbal.
Fuzzy Logic
Bagaimana saya menggunakan angka empat untuk melakukan rotasi? Saya mencoba transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , tapi itu memberi saya kesalahan.
Reinkarnasi dari
Ok, saya membuat tes. Untungnya, itu bukan kunci gimbal. Saya akan memposting solusi sebagai jawaban untuk Anda.
Fuzzy Logic

Jawaban:

18

Masalahnya adalah Anda memperbarui rotasi yang ada alih-alih melacaknya sendiri dan mengganti setiap pembaruan.

Ketika Anda memperbarui rotasi itu menggabungkan rotasi baru Anda dengan yang lama yang mengarah ke perilaku yang tidak terduga.

Solusinya adalah untuk melacak rotasi akumulasi Anda dan mengatur ulang rotasi sepenuhnya setiap pembaruan dengan nilai-nilai baru Anda.

Kredit jatuh tempo, saya menemukan jawabannya di sini: Unity Answers: bagaimana-untuk-mengunci-atau-mengatur-kamera-z-rotasi-ke-nol

Kode Kerja:

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

Perbedaan utama:

  • Simpan yaw and pitch sebagai anggota kelas, daripada variabel metode lokal sehingga Anda dapat melacak nilai yang terakumulasi.
  • Gunakan + = dan / atau - = untuk mengakumulasi setiap pembaruan.
  • Gunakan eulerAngles (untuk menimpa nilai rotasi setiap pembaruan) alih-alih Putar (yang menerapkan rotasi baru Anda ke yang lama).
Logika Fuzzy
sumber
Sama-sama. Jika solusi yang saya posting ini memecahkan masalah awal yang Anda alami, Anda harus menerimanya sebagai jawabannya. Jika Anda ingin mendapatkan bantuan dengan masalah baru Anda, Anda harus memposting pertanyaan baru untuk menjaga hal-hal tetap rapi dan lebih mungkin bagi orang lain untuk dapat membantu Anda atau menemukan pertanyaan Anda jika mereka memiliki masalah yang sama. Area komentar tidak dimaksudkan untuk dialog yang diperluas. Bersulang.
Fuzzy Logic
0

Bagaimana jika Anda menjadikan kamera sebagai objek game kosong. Kemudian dengan satu skrip Anda mengelola rotasi objek game kosong relatif terhadap vektor UP. (MouseX) Dengan skrip lain yang dikaitkan dengan objek gim kamera, Anda mengelola rotasi relatif terhadap vektor Kanan (MouseY)

dnk drone.vs.drones
sumber