Como usar o Input.GetAxis (“Mouse X / Y”) para girar a câmera?

13

Quero fazer uma câmera em primeira pessoa que gire com o mouse.

Eu olhei para a página da API de script Input.GetAxis e encontrei um código de exemplo, que eu incluí na parte inferior da minha postagem. Ao experimentar, percebi que, embora tenha a mesma funcionalidade básica que esperava, ela não mantém a câmera paralela ao plano xz, principalmente ao mover o mouse em círculos. Depois de um tempo, a câmera estaria em um ângulo estranho e o jogador ficaria completamente desconcertado!

Existe uma solução rápida para esse código que restringiria o movimento da câmera de alguma forma ou existe uma maneira melhor de girar a câmera?

 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);
         }
     }
reencarnação da troca de pilhas
fonte
O que você está experimentando parece bloqueio de cardan. Isso acontece quando você está usando ângulos de euler para rotação. Eu teria que fazer alguns testes para oferecer uma solução. Basicamente, você precisa usar quaternions. Eles não sofrem de bloqueio do cardan.
Fuzzy Logic
Como eu usaria um quaternion para fazer rotação? Tentei transform.rotation = Quaternion.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurningSpeed); , mas isso me deu erros.
reincarnationofstackexchange
Ok, eu fiz um teste. Felizmente, não é um bloqueio de cardan. Vou postar a solução como resposta para você.
Fuzzy Logic

Respostas:

18

O problema é que você está atualizando a rotação existente em vez de rastreá-la e substituí-la a cada atualização.

Quando você atualiza a rotação, ela combina sua nova rotação com a antiga, o que leva a um comportamento inesperado.

A solução é acompanhar sua rotação acumulada e redefinir completamente a rotação a cada atualização com seus novos valores.

Com o crédito vencido, encontrei a resposta aqui: Unity Answers: como bloquear ou configurar as câmeras-z-rotação-zero

Código de trabalho:

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

Principais diferenças:

  • Armazene a guinada e o tom como membros da classe, em vez de variáveis ​​locais do método, para que você possa acompanhar os valores acumulados.
  • Use + = e / ou - = para acumular cada atualização.
  • Use eulerAngles (para substituir o valor da rotação a cada atualização) em vez de Girar (que aplica sua nova rotação à antiga).
Lógica Difusa
fonte
Não há de quê. Se esta solução que eu publiquei resolveu o problema original que você estava tendo, aceite-a como resposta. Se você deseja obter ajuda para o seu novo problema, publique uma nova pergunta para manter as coisas organizadas e com maior probabilidade de outras pessoas poderem ajudá-lo ou encontrar sua pergunta se estiverem com um problema semelhante. As áreas de comentários não se destinam ao diálogo estendido. Felicidades.
Fuzzy Logic
0

E se você tornar a câmera filha de um objeto de jogo vazio. Em seguida, com um script, você gerencia a rotação do objeto de jogo vazio em relação ao vetor UP. (MouseX) Com outro script anexado ao objeto da câmera, você gerencia a rotação em relação ao vetor Right (MouseY)

dnk drone.vs.drones
fonte