Directorio de artículos
principio
Utilice la rotación del cuerpo del personaje para controlar los deslizamientos izquierdo y derecho de la cámara,
y la rotación de la cámara para controlar los deslizamientos hacia arriba y hacia abajo de la cámara.
Análisis detallado
En primer lugar, debemos saber que la cámara es un subobjeto del personaje (que actúa como un ojo),
por lo que cuando el personaje gira, la cámara lo seguirá y girará en la misma dirección y en el mismo ángulo,
de modo que la dirección en la que mira el ojo (cámara) debe ser directamente frente al personaje.
Entonces, ¿cuáles son los beneficios de hacer esto?
Si la lente de la cámara está fijada al frente del personaje,
controlar la dirección del movimiento del personaje será muy preciso.
Si solo usas la cámara para controlar el deslizamiento de la lente hacia arriba, abajo, izquierda y derecha,
aunque esto puede lograr una primera perspectiva completa
, pero cuando el personaje se mueve, habrá un error de dirección
, porque aunque la dirección de la cámara cambia, La dirección del personaje no cambia.
Por ejemplo: giras la cámara 90 grados hacia la izquierda, presionas W y te preparas para avanzar, pero descubres que se ha movido hacia la derecha (frente a la dirección inicial).
Por lo tanto, si desea moverse en una dirección precisa, la orientación de la cámara debe ser consistente con la orientación del personaje.
* Preste atención a distinguir la orientación de los personajes y la cámara en las dos imágenes.
Explicación del código
parte central
//俯仰
//以摄像机的旋转控制镜头上下滑动
void Pitch()
{
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转
//限定俯仰的角度
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;//赋值
}
}
//偏转
//以人物的旋转控制镜头左右滑动
void Yaw()
{
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转
player.localRotation =finalAngle;//赋值
}
Análisis detallado
Consigue personas y cámaras
public Transform player;
public Transform playerCam;
Establezca la sensibilidad del tono y la desviación (los detalles del tono y la desviación se explican en el artículo anterior)
public float pitchSensitivity; //Y方向 俯仰(绕X轴)
public float yawSensitivity; //X方向 偏转(绕Y轴)
Limite el ángulo de inclinación máximo (sin restricciones de desviación en dirección horizontal)
public float pitchLimit = 75;
Calcular el ángulo de rotación
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
Girar alrededor de un eje específico
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right);//绕X轴负方向旋转的度数
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
Entendiendo Quaternion.AngleAxis
Quaternion: Quaternion se usa básicamente en Unity para calcular la orientación y la rotación.
AngleAxis: un eje alrededor del cual
todo es: especificar un eje, rotar el ángulo especificado alrededor del eje y obtener un nuevo resultado de rotación.
targetRotation = Quaternion.AngleAxis(angel, direction);
ángulo: representa cuántos grados de
dirección de rotación: qué dirección alrededor de qué eje (como Vector3.up, Vector3.right, etc.)
Convertir ángulos de Euler en cuaternión
Quaternion finalAngle = playerCam.localRotation * pitch;
Quaternion finalAngle = player.localRotation * yaw;
Cámara de tarea final completa
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;
}
cifra
player.localRotation =finalAngle;
código completo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerLookControl : MonoBehaviour
{
//获取摄像机和人物
public Transform player;
public Transform playerCam;
//俯仰和偏转的灵敏度
public float pitchSensitivity; //Y方向 俯仰(绕X轴)
public float yawSensitivity; //X方向 偏转(绕Y轴)
//最大俯仰角度
public float pitchLimit = 75;
private Quaternion playerCamCenter;
void Start()
{
playerCamCenter = playerCam.localRotation;
Cursor.lockState = CursorLockMode.Locked; //将鼠标光标锁定在窗口中心
Cursor.visible = false; //隐藏鼠标光标
}
void Update()
{
Pitch();
Yaw();
}
//俯仰
//以摄像机的旋转控制镜头上下滑动
void Pitch()
{
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转
//限定俯仰的角度
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;//赋值
}
}
//偏转
//以人物的旋转控制镜头左右滑动
void Yaw()
{
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转
player.localRotation =finalAngle;//赋值
}
}