原理
以人物身體旋轉(zhuǎn)控制鏡頭左右滑動
以攝像機(jī)旋轉(zhuǎn)控制鏡頭上下滑動
詳細(xì)解析
首先我們要知道 攝像機(jī)是作為人物的子物體的(充當(dāng)眼睛)
所以當(dāng)人物旋轉(zhuǎn)時(shí) 攝像機(jī)會跟隨它朝相同的方向旋轉(zhuǎn)相同的角度
從而達(dá)到 眼睛(攝像機(jī))注視的方向一定是人物的正前方
那么這樣做有什么好處呢?
若攝像機(jī)鏡頭鎖定為人物正前方
操控人物的移動方向就會變得非常精準(zhǔn)
如果只單純以攝像機(jī)來控制鏡頭的上下左右滑動
雖然這樣也能實(shí)現(xiàn)全方位的第一視角
但當(dāng)人物移動時(shí) 就會出現(xiàn)方向的錯(cuò)誤
因?yàn)榇藭r(shí)雖然鏡頭朝向變了 人物朝向卻沒有變
例如:你將鏡頭向左轉(zhuǎn)90度,按 W 準(zhǔn)備向前走,卻發(fā)現(xiàn)向右移動了(初始方向的前)
所以想要移動方向精準(zhǔn) 攝像機(jī)朝向必須和人物朝向一致
*注意區(qū)別兩幅圖人物和攝像機(jī)的朝向
代碼講解
核心部分
//俯仰
//以攝像機(jī)的旋轉(zhuǎn)控制鏡頭上下滑動
void Pitch()
{
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //繞X軸負(fù)方向旋轉(zhuǎn)的度數(shù)
Quaternion finalAngle = playerCam.localRotation * pitch; //歐拉角轉(zhuǎn)化為四元數(shù) 使攝像機(jī)旋轉(zhuǎn)
//限定俯仰的角度
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;//賦值
}
}
//偏轉(zhuǎn)
//以人物的旋轉(zhuǎn)控制鏡頭左右滑動
void Yaw()
{
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //繞Y軸旋轉(zhuǎn)的度數(shù)
Quaternion finalAngle = player.localRotation * yaw; //歐拉角轉(zhuǎn)化為四元數(shù) 使人物旋轉(zhuǎn)
player.localRotation =finalAngle;//賦值
}
詳細(xì)解析
獲取人物和攝像機(jī)
public Transform player;
public Transform playerCam;
設(shè)定俯仰和偏轉(zhuǎn)的靈敏度(俯仰、偏轉(zhuǎn)的具體講解在上期文章)
public float pitchSensitivity; //Y方向 俯仰(繞X軸)
public float yawSensitivity; //X方向 偏轉(zhuǎn)(繞Y軸)
限定最大俯仰角度(水平方向上的偏轉(zhuǎn)不用限制)
public float pitchLimit = 75;
計(jì)算旋轉(zhuǎn)角度
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
繞指定的軸進(jìn)行旋轉(zhuǎn)
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right);//繞X軸負(fù)方向旋轉(zhuǎn)的度數(shù)
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //繞Y軸旋轉(zhuǎn)的度數(shù)
理解 Quaternion.AngleAxis
Quaternion:四元數(shù) 這個(gè)在Unity中基本就是用于計(jì)算方位、旋轉(zhuǎn)的
AngleAxis:圍繞的一個(gè)軸
整體就是:指定一個(gè)軸,圍繞該軸旋轉(zhuǎn)指定的角度,得到一個(gè)新的旋轉(zhuǎn)結(jié)果
targetRotation = Quaternion.AngleAxis(angel, direction);
angle:代表旋轉(zhuǎn)多少度
direction:圍繞哪個(gè)軸的哪個(gè)方向(如Vector3.up、Vector3.right等)
將歐拉角轉(zhuǎn)換為四元數(shù)
Quaternion finalAngle = playerCam.localRotation * pitch;
Quaternion finalAngle = player.localRotation * yaw;
完成最終賦值
攝像機(jī)文章來源:http://www.zghlxwxcb.cn/news/detail-832790.html
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;
}
人物文章來源地址http://www.zghlxwxcb.cn/news/detail-832790.html
player.localRotation =finalAngle;
完整代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerLookControl : MonoBehaviour
{
//獲取攝像機(jī)和人物
public Transform player;
public Transform playerCam;
//俯仰和偏轉(zhuǎn)的靈敏度
public float pitchSensitivity; //Y方向 俯仰(繞X軸)
public float yawSensitivity; //X方向 偏轉(zhuǎn)(繞Y軸)
//最大俯仰角度
public float pitchLimit = 75;
private Quaternion playerCamCenter;
void Start()
{
playerCamCenter = playerCam.localRotation;
Cursor.lockState = CursorLockMode.Locked; //將鼠標(biāo)光標(biāo)鎖定在窗口中心
Cursor.visible = false; //隱藏鼠標(biāo)光標(biāo)
}
void Update()
{
Pitch();
Yaw();
}
//俯仰
//以攝像機(jī)的旋轉(zhuǎn)控制鏡頭上下滑動
void Pitch()
{
float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //繞X軸負(fù)方向旋轉(zhuǎn)的度數(shù)
Quaternion finalAngle = playerCam.localRotation * pitch; //歐拉角轉(zhuǎn)化為四元數(shù) 使攝像機(jī)旋轉(zhuǎn)
//限定俯仰的角度
if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
{
playerCam.localRotation = finalAngle;//賦值
}
}
//偏轉(zhuǎn)
//以人物的旋轉(zhuǎn)控制鏡頭左右滑動
void Yaw()
{
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //繞Y軸旋轉(zhuǎn)的度數(shù)
Quaternion finalAngle = player.localRotation * yaw; //歐拉角轉(zhuǎn)化為四元數(shù) 使人物旋轉(zhuǎn)
player.localRotation =finalAngle;//賦值
}
}
到了這里,關(guān)于Unity 3D 人物移動朝向跟隨攝像機(jī)(第一人稱)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!