Unity 3D 人物移动朝向跟随摄像机(第一人称)

原理

以人物身体旋转控制镜头左右滑动
以摄像机旋转控制镜头上下滑动

详细解析

首先我们要知道 摄像机是作为人物的子物体的(充当眼睛)
所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度
从而达到 眼睛(摄像机)注视的方向一定是人物的正前方

那么这样做有什么好处呢?
若摄像机镜头锁定为人物正前方
操控人物的移动方向就会变得非常精准

如果只单纯以摄像机来控制镜头的上下左右滑动
虽然这样也能实现全方位的第一视角
但当人物移动时 就会出现方向的错误
因为此时虽然镜头朝向变了 人物朝向却没有变
例如:你将镜头向左转90度,按 W 准备向前走,却发现向右移动了(初始方向的前)
在这里插入图片描述

所以想要移动方向精准 摄像机朝向必须和人物朝向一致
在这里插入图片描述
*注意区别两幅图人物和摄像机的朝向

代码讲解

核心部分

//俯仰
//以摄像机的旋转控制镜头上下滑动
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;//赋值
}

详细解析

获取人物和摄像机

public Transform player;
public Transform playerCam;

设定俯仰和偏转的灵敏度(俯仰、偏转的具体讲解在上期文章)

public float pitchSensitivity; //Y方向 俯仰(绕X轴)
public float yawSensitivity; //X方向 偏转(绕Y轴)

限定最大俯仰角度(水平方向上的偏转不用限制)

public float pitchLimit = 75;

计算旋转角度

float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;

绕指定的轴进行旋转

Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right);//绕X轴负方向旋转的度数
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数

理解 Quaternion.AngleAxis

Quaternion:四元数 这个在Unity中基本就是用于计算方位、旋转的
AngleAxis:围绕的一个轴
整体就是:指定一个轴,围绕该轴旋转指定的角度,得到一个新的旋转结果

targetRotation = Quaternion.AngleAxis(angel, direction);

angle:代表旋转多少度
direction:围绕哪个轴的哪个方向(如Vector3.up、Vector3.right等)

将欧拉角转换为四元数

Quaternion finalAngle = playerCam.localRotation * pitch;
Quaternion finalAngle = player.localRotation * yaw;

完成最终赋值
摄像机

if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
        {
    
    
            playerCam.localRotation = finalAngle;
        }

人物

player.localRotation =finalAngle;

完整代码

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;//赋值
    }
}

猜你喜欢

转载自blog.csdn.net/m0_73241844/article/details/132445802