原理
以人物身体旋转控制镜头左右滑动
以摄像机旋转控制镜头上下滑动
详细解析
首先我们要知道 摄像机是作为人物的子物体的(充当眼睛)
所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度
从而达到 眼睛(摄像机)注视的方向一定是人物的正前方
那么这样做有什么好处呢?
若摄像机镜头锁定为人物正前方
操控人物的移动方向就会变得非常精准
如果只单纯以摄像机来控制镜头的上下左右滑动
虽然这样也能实现全方位的第一视角
但当人物移动时 就会出现方向的错误
因为此时虽然镜头朝向变了 人物朝向却没有变
例如:你将镜头向左转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;
完成最终赋值
摄像机文章来源:https://www.toymoban.com/news/detail-832790.html
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;
}
人物文章来源地址https://www.toymoban.com/news/detail-832790.html
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;//赋值
}
}
到了这里,关于Unity 3D 人物移动朝向跟随摄像机(第一人称)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!