1. 程式人生 > >Unity3d_FPS遊戲(人物控制篇)

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類自帶的向量

第三種方法:比較麻煩,但是可以模擬產生加速的效果

第五種方法:最簡單,省力。