[Unity3D]最簡單最詳細的第一人稱角色控制器
自學Unity3D有一段時間了,一直想弄一個第一人稱角色控制器,網上還是有很多教程和資料,但感覺有很多教程和資料理解起來比較復雜,在這里我結合網上所學的知識自己寫了一個比較容易理解的Unity3D第一人稱控制器腳本,
首先來看一下完成后的效果

接下來逐步講解如何實作這個功能
- 首先我們打開Unity創建一個Unity3D工程

2.在Hierarchy面板空白處單擊右鍵,點擊Create Empty創建一個空物件,點擊創建好的空物件,右鍵單擊rename重新命名為Player

3.在Hierarchy面板下單擊右鍵,選擇3D Object—Terrain創建一個地形,再單擊右鍵,選擇3D Object—Capsule創建一個膠囊體充當角色,將其拖拽至Player下使其成為Player的一個子物件
此時場景如圖所示

再右鍵單擊Hierarchy面板,點擊3D Object—cube創建一個正方體,適當調整其Transform數值,調整其大小和位置,使其位于膠囊體的正前方,以此辨別方向


調整完成后一個人物的基本模型就制作好了,如圖所示

4.在Hierarchy面板下單擊Player,在其Inspector面板下點擊Add Component添加一個Character Controller組件,添加成功后會出現綠色的網格將膠囊體包圍,如下圖所示,調整Character Controller上的數值可以改變其網格的大小(如果你的網格不是恰好把你的這個人物包圍好的話)
5.在Hierarchy面板下單擊Player,在其Inspector面板下點擊Add Component添加一腳本,命名為PlayerMove
PlayerMove創建好后雙擊紅色圈圈里面的腳本,進入Visual Studio 中進行撰寫腳本

6.PlayerMove腳本的編輯
//定義一個移動速度MoveSpeed 其型別為public型別
public float MoveSpeed;
//用戶在PlayerMove腳本界面可以對其進行調整
//(用public定義,腳本外可以修改,并以腳本外修改的為主)
//(如果是private型別則只能在腳本修改)
//定義兩個私有型別的浮點型資料horizontal和vertical來記錄A、D鍵和
//W、S鍵的資料,也可以理解為記錄水平軸和豎直軸的資料,即X軸和Y軸
private float horizontal;
private float vertical;
//定義一個重力gravity
private float gravity = 9.8f;
//定義一個起跳速度
public float JumpSpeed = 15f;
//定義一個公有型別的CharacterController,將其命名為PlayerController
//用于實體化物件
public CharacterController PlayerController;
//定義一個Vector3
//Vector3向量既可以用來表示位置,也可以用來表示方向
//在立體三維坐標系中,分別取與x軸、y軸,z軸方向相同的3個單位向量i,j, k作為一組基底,
//若a為該坐標系內的任意向量,以坐標原點O為起點作向量OP=a,由空間基本定理知,有且只有一組實數(x,y, z)
//使得 a=向量OP=xi+yj+zk,因此把實數對(x,y, z)叫做向量a的坐標
//記作a=(x,y, z),這就是向量a的坐標表示,其中(x,y, z),也就是點P的坐標,向量OP稱為點P的位置向量,
Vector3 Player_Move;
//如果還是不理解的話可以去CSDN上詳細了解,這里就不做過多說明了
//放在Updata里面每一幀都會執行,導致不能夠保存前一時刻的值
void Update()
{
//判斷PlayerController是否在地面上,如果不是在地面上就不能夠前后左右移動,也不能夠起跳
if(PlayerController.isGrounded)
{
//Input.GetAxis("Horizontal")為獲取X(橫軸)軸方向的值給horizontal
horizontal = Input.GetAxis("Horizontal");
//Input.GetAxis("Vertical")為獲取Z(縱軸)軸方向的值給Vertical
vertical = Input.GetAxis("Vertical");
//transform為本物體所在位置,forward是向前的一個分量
//transform.forward * vertical為物體向前的方向乘獲取的Z軸的值,即物體向前移動的量,如果vertical為負數,則物體后退
//transform.right * horizontal為物體向右的方向乘獲取的X軸的值,即物體向右移動的量,如果horizon為負數,則物體向左
//兩者相加后最后面乘移動數度,賦值給Vector3型別的Player_Move即為物體實際運動的方向
Player_Move = (transform.forward * vertical + transform.right * horizontal) * MoveSpeed;
//判斷玩家是否按下空格鍵
if (Input.GetAxis("Jump")==1)
{
//按下空格鍵,給其豎直方向添加一個向上的數度,使其跳起
//Player_Move.y相當于Player_Move下的Vector3(0,1,0)
Player_Move.y = Player_Move.y + JumpSpeed;
}
}
//模擬重力下降的效果,讓向上的量減去重力下降的量
//變數deltaTime表示為unity本地變數,作為Time類中的資料在各幀中被更新,在各幀中,該變數顯示了距上一幀所經歷的時間值(以秒計算),
//這個變數的優點: 使用這個函式他會與你的游戲幀速率無關 放在Update()函式中的代碼是以幀來執行的
//我們需要將移動的物體乘以秒來執行,而乘以deltaTime其就可以實作
//例如:想讓一個游戲物件向前以每秒10m移動的話 用你的速度10乘Time.deltaTime 他表示每秒移動的距離為10m而不是每幀10m
Player_Move.y = Player_Move.y - gravity * Time.deltaTime;
//PlayerController下的.Move為實作物體運動的函式
//Move()括號內放入一個Vector3型別的量,本例中為Player_Move
PlayerController.Move(Player_Move*Time.deltaTime);
}
到這里我們Ctrl+S保存,回到Unity中,將CharacterController拖拽至PlayerMove腳本下的PlayerController中
7.單擊運行按鈕,在鍵盤上點擊W、A、S、D就可以移動啦

8.但是現在我們還不能夠控制角色移動的方向,接下來我們要為Camera寫一個腳本來控制人物移動的方向,在這之前,我們要移動攝像機,調整攝像機Mian Camera的Transform數值,使其位于人物的頭部,如圖所示,并將Main Camera移動到Player下使其成為Player的一個子物件,

9.單擊Camera,在其Inspector面板下單擊Add Component,輸入CameraControlle來New Script一個攝像機腳本,雙擊進去編輯

接下來編輯CameraController腳本,使其能夠讓玩家用滑鼠控制方向
//創建一個Transform型別的量CameraRotation用來保存實作相機旋轉
public Transform CameraRotation;
//定義兩個私有型別的量Mouse_X,Mouse_Y分別接識訓鼠向各個方向滑動的值
private float Mouse_X;
private float Mouse_Y;
//鼠標靈敏度
public float MouseSensitivity;
//定義一個浮點型別的量,記錄繞X軸旋轉的角度
public float xRotation;
//放在Updata里面每一幀都會執行,導致不能夠保存前一時刻的值
void Update()
{
//獲取滑鼠左右移動的量乘上靈敏度的值
Mouse_X = Input.GetAxis("Mouse X") * MouseSensitivity * Time.deltaTime;
//獲取滑鼠上下移動的量乘上靈敏度的值
Mouse_Y = Input.GetAxis("Mouse Y") * MouseSensitivity * Time.deltaTime;
xRotation = xRotation - Mouse_Y;
//xRotation值為正時,螢屏下移,當xRotation值為負時,螢屏上移
//當滑鼠向上滑動,Mouse_Y值為正,xRotation-Mouse_Y的值為負,xRotation總的值為負,螢屏視角向上滑動
//當滑鼠向下滑動,Mouse_Y值為負,xRotation-Mouse_Y的值為正,xRotation總的值為正,螢屏視角向下滑動
//簡單來說就是要控制滑鼠滑動的方向與螢屏移動的方向要相同
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
//限制 value的值在-90f,90f之間,如果xRotation大于90f,則回傳90f,如果xRotation小于-90f,則回傳-90f,否者回傳xRotation;
//相機左右旋轉時,是以Y軸為中心旋轉的,上下旋轉時,是以X軸為中心旋轉的
CameraRotation.Rotate(Vector3.up * Mouse_X);
//Vector3.up相當于Vector3(0,1,0),CameraRotation.Rotate(Vector3.up * Mouse_X)相當于使CameraRotation物件繞y軸旋轉Mouse_X個單位
//即相機左右旋轉時,是以Y軸為中心旋轉的,此時Mouse_X控制著值的大小
//相機在上下旋轉移動時,相機方向不會隨著移動,類似于低頭和抬頭,左右移動時,相機方向會隨著向左向右移動,類似于向左向右看
//所以在控制相機向左向右旋轉時,要保證和父物體一起轉動
this.transform.localRotation = Quaternion.Euler(xRotation, 0, 0);
//this.transform指這個CameraRotation的位置,localRotation指的是旋轉軸
//transform.localRotation = Quaternion.Eular(x,y,z)控制旋轉的時候,按照X-Y-Z軸的旋轉順規
//即以圍繞X軸旋轉x度,圍繞Y軸旋轉y度,圍繞Z軸旋轉z度
//且繞軸旋轉的坐標軸是父節點本地坐標系的坐標軸
}
記住相機在水平方向的轉動是圍繞X軸來的,上下轉動是圍繞Y軸來的,所以Mouse_X的值控制相機上下移動,Mouse_Y的值控制相機左右移動,我怕有人不理解為什么CameraRotation.Rotate(Vector3.up * Mouse_X)中Vector3.up一個y方向的量要乘以滑鼠X軸方向的量,因為是繞著Y軸轉的,X值是控制其旋轉大小的值…下面畫了一張草圖(滑鼠有點問題,沒畫好),實在不懂就先這么寫著吧,或者去其它地方搜一搜T T
接下來Ctrl+S保存,回到Unity中,將hierarchy面板下的MainCamera拖拽至MainCamera中Inspector面板下CameraController的腳本中,設定滑鼠靈敏度為100
點擊運行按鈕,人物就可以轉動了O(∩_∩)O

第一次寫博客,有什么不對的地方還請多多指教,喜歡的話點個贊吧,后續還會更新更多有關于Unity的教程和內容哦(● ? ●)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224864.html
標籤:其他
