Fotoğraf makinesini döndürmek için Input.GetAxis (“Mouse X / Y”) nasıl kullanılır?


13

Fare ile dönen bir birinci kamera yapmak istiyorum.

Input.GetAxis Scripting API sayfasına baktım ve yazımın altına eklediğim örnek bir kod buldum. Denedikten sonra, umduğum aynı temel işlevselliğe sahip olmasına rağmen, özellikle fareyi daireler halinde hareket ettirirken kamerayı xz düzlemine paralel tutmadığını fark ettim. Bir süre sonra kamera garip bir açıda olacak ve oyuncu tamamen rahatsız olacak!

Bu koda kamera hareketini bir şekilde kısıtlayacak hızlı bir düzeltme var mı, yoksa kamerayı döndürmenin daha iyi bir yolu var mı?

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

Yaşadığınız şey gimbal kilit gibi. Dönme için euler açıları kullandığınızda olur. Bir çözüm sunmak için biraz test yapmam gerekecekti. Temel olarak, kuaterniyonlar kullanmanız gerekir. Gimbal kilitlenmezler.
Bulanık Mantık

Döndürme yapmak için bir kuaterniyon nasıl kullanılır? Transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , ama bu bana hatalar verdi.
reincarnationofstackexchange

Tamam, bir test yaptım. Neyse ki, gimbal kilit değil. Çözümü size cevap olarak göndereceğim.
Bulanık Mantık

Yanıtlar:


18

Sorun, mevcut dönüşü kendiniz izlemek ve her güncellemeyi değiştirmek yerine güncellemenizdir.

Rotasyonu güncellediğinizde, yeni rotasyonunuzu eskisiyle birleştirir ve bu da beklenmedik davranışlara yol açar.

Çözüm, birikmiş rotasyonunuzu takip etmek ve her güncellemeyi yeni değerlerinizle tamamen sıfırlamaktır.

Kredi nerede, cevap burada buldum: Birlik Yanıtlar: nasıl-to-kilit-veya-set-kameralar-z-rotasyon-sıfıra

Çalışma Kodu:

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

Temel farklılıklar:

  • Biriken değerleri takip edebilmeniz için yaw ve pitch'i yerel yöntem değişkenleri yerine sınıf üyeleri olarak saklayın.
  • Her bir güncellemeyi toplamak için + = ve / veya - = kullanın.
  • Döndür (yeni rotasyonunuzu eskisine uygular) yerine eulerAngles (her güncellemenin rotasyon değerinin üzerine yazmak için) kullanın.

Rica ederim. Gönderdiğim bu çözüm, yaşadığınız orijinal sorunu çözdüyse, cevap olarak kabul etmelisiniz. Yeni sorununuzla ilgili yardım almak isterseniz, işleri düzenli tutmak ve başkalarının size yardımcı olmaları veya benzer bir sorun yaşıyorlarsa sorunuzu bulma olasılıkları daha yüksek olacak yeni bir soru göndermelisiniz. Yorum alanları genişletilmiş iletişim kutusu için değildir. Şerefe.
Fuzzy Logic

0

Kamerayı boş bir gameobject'in çocuğu yaparsanız ne olur. Sonra bir komut dosyası ile UP vektörüne göre boş gameobject döndürmeyi yönetirsiniz. (MouseX) Kamera gameobject'e atanmış başka bir komut dosyası ile Sağ vektöre (MouseY) göre döndürmeyi yönetirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.