La dirección del movimiento del personaje de Unity 3D sigue la cámara (primera persona)

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).
Insertar descripción de la imagen aquí

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.
Insertar descripción de la imagen aquí
* 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;//赋值
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_73241844/article/details/132445802
Recomendado
Clasificación