Unity3d_FPS遊戲(人物控制篇)
在FPS遊戲中,人物控制十分重要。人物控制包括,人物行走,跳躍,人物跟隨鏡頭旋轉,人物的右手(持槍部位)根據滑鼠旋轉而旋轉。
首先,我們來看看如何使人物進行移動,在這裡我使用了Sphere和Capsule作為身體,將攝像頭放在Character的物件下,位置放在身體裡面。
人物移動有許許多多多的方法,這裡我簡單介紹幾種。
我們統一設定移動的速度為mMoveSpeed,移動的距離distance為Time.deltatime*mMoveSpeed.
第一種:通過transform.Translate(new Vector3(X,X,X))
第一種方法實現所有的行走模式,之後的方法只用向前(A)作為演示。
這種方法最簡單,也最普遍
例如向前走
if(Input.GetKey(KeyCode.W))
{
transform.Translate(new Vector3(0,0,distance);
return true;
}
// 後
if (Input.GetKey(KeyCode.S)) {
transform.Translate(new Vector3(0, 0, -distance));
return true;
}
// 左
if (Input.GetKey(KeyCode.A)) {
transform.Translate(new Vector3(-distance, 0, 0));
return true;
}
// 右
if (Input.GetKey(KeyCode.D)) {
transform.Translate(new Vector3(distance, 0, 0));
return true;
}
//左前方移動
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
transform.Translate(new Vector3(-distance, 0, distance));
return true;
}
//右前方
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D))
{
transform.Translate(new Vector3(distance,0,distance));
return true;
}
//左下方
if(Input.GetKey(KeyCode.A)&&Input.GetKey(KeyCode.S))
{
transform.Translate(new Vector3(-distance,0,-distance));
return true;
}
//右下方
if(Input.GetKey(KeyCode.S)&&Input.GetKey(KeyCode.D))
{
transform.Translate(new Vector3(distance,0,-distance));
return true;
}
//前後不動
if(Input.GetKey(KeyCode.W)&&Input.GetKey(KeyCode.S))
{
return true;
}
//左右不動
if(Input.GetKey(KeyCode.A)&&Input.GetKey(KeyCode.D))
{
return true;
}
這裡實現了,總共八個方向的移動,並且在同時按住前進和後退,以及向左和向右鍵,保持不動,大家可以對照自己玩過的FPS遊戲,是不是所有的移動方法都已經包括了。
第二種方法:
使用系統給的Vector.forward等方法。
例如
//向前
if(XXXX)
{
transform.Translate(Vector.forward*distance);
return true;
}
其他同樣的道理,向右是Vector.right,向上時Vector.up.
Vector沒有向後和向左,但很簡單,-Vector.forward 就是向後,向左也一樣,加個符號。
Vector.forward實際上就是(0,0,1),是一個Z軸上長度為1的向量,是系統給定的。
第三種方法:
以上兩種方法,移動的速度都是mMoveSpeed,距離都是distance,可以說移動的速度是不變的(這裡的Time.deltaTime會有細微的變化)
第三種方法事實上有一種加速的效果,就是速度從慢到快
例如
//向前
if(XXX)
{
transform.Translate(Input.GetAxis("Horizontal")*distance);
return true;
};
這段程式碼最重要的就是Input.GetAxis("Horizontal")這個方法。
這個方法用於獲得鍵盤輸入在當前X軸上的變化量。
在Edit->project Setting->Input中修改和檢視
它以你當前所在X軸為中心,當你按住A鍵,人物向左移動,Input.GetAxis("Horizontal")返回的是移動的量,從0到-1,D鍵向右,value從0到1.
所以,當我們按住向左的A鍵時,速度是從0*distance,上升到1*distance的,所以產生了一個加速效果。
第四種方法:
// 前
if (Input.GetKey(KeyCode.W)) {
float x = Mathf.Sin(transform.eulerAngles.y * Mathf.Deg2Rad) * distance;
float z = Mathf.Cos(transform.eulerAngles.y * Mathf.Deg2Rad) * distance;
transform.Translate(new Vector3(x,0,z), Space.World);
return true;
}
這是網上一個教材的原始碼,這種實現方法我也看不太懂,但的確可以實現。原理還是通過transform.Translate。
至於為什麼用正弦函式用來賦值給X不清楚原作者的用意。不排除像第三種方法那樣實現了某種特殊的加速效果。
第五種也是最簡單的一種方法:
private Vector3 move = Vector3.zero;
move = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
transform.Translate(move*distance);
使用move變數時時獲取物體在X軸和Z軸上的變化量,通過transform.Translate函式時時變化。
總結:
第一種方法:最自由,可以根據自己的意願來修改任意的行走速度
第二種方法:與第一種類似,只是使用了Vector類自帶的向量
第三種方法:比較麻煩,但是可以模擬產生加速的效果
第五種方法:最簡單,省力。