吃雞開發實戰之移動與視野旋轉

作為一個FPS遊戲,無論是手游或者端游,必不可少的就是移動跟視野旋轉.

這篇文章就以吃雞為案例,用Unity來跟大家演示一下,在端游跟手游中如何實現視野旋轉以及移動的.

其實很簡單,但是為了後續的各種功能實現,也照顧到一些小小白朋友,所以還是寫出來分享一下.

首先在這裡先創建一個空的一個GameObject,坐標跟MainCamera一樣,用來存放我們的攝像機跟人物模型,以及掛載他們關聯的腳本(這是我個人的開發習慣,便於管理.)

然後按照圖中的層級關係擺放好.

Player就是空的那個GameObject, MainCamera就是攝像機,Model就是人物的模型.

創建一個腳本ConfigSetting,作為我們的配置類.因為玩過吃雞的朋友應該都知道,他裡面可以通過設置修改各種參數,讓玩家自己設置最舒服的操作體驗.接下來在裡面創建幾個靜態變數,

public static float CameraMoveSpeedX = 5f; public static float CameraMoveSpeedY = 5f; public static float MoveSpeed = 1f;

CameraMoveSpeedX,Y 這兩個變數作為我們滑鼠移動的靈敏度係數.

MoveSpeed作為我們人物移動的係數.

再創建一個腳本CameraScripts,掛載在Player上面,並把值賦好。

打開CameraScripts這個腳本.定義幾個變數

public enum OperatorModes { PC, Moblie, } public OperatorModes modes; public Camera camera; public Transform model; private bool mOnlyRoateCamera = false; private Vector3 mCurrRoate;

OperatorModes我們的操作模式枚舉,

Cameramodel即我們的主攝像機跟我們的人物模型.

mOnlyRoateCamera 是判斷我們是人物旋轉還是單純的只是攝像機旋轉,

玩過吃雞的朋友都知道,裡面有兩種旋轉模式,一種是人不動的旋轉,一種是人會動的旋轉.

mCurrRoate是則是如果單純的旋轉攝像機,那麼他將記錄旋轉前的角度,當我們停止視角旋轉時,復原.

接下來開始編寫我們的功能代碼,今天的代碼邏輯都是在Update() 方法裡面去運行的.

移動邏輯。

PC端

Vector3 _move = Vector3.zero; if (Input.GetKey(KeyCode.W)) _move +=Vector3.forward; else if (Input.GetKey(KeyCode.S)) _move += Vector3.back; if (Input.GetKey(KeyCode.A)) _move += Vector3.left; else if (Input.GetKey(KeyCode.D)) _move += Vector3.right; if (_move != Vector3.zero) transform.Translate(_move * ConfigSetting.MoveSpeed);

變數 _move 為我們移動的方向。

Input.GetKey(KeyCode)為當玩家按下按鍵為KeyCode時,會持續響應.

在這裡要注意方向上的互斥關係,預防有些大哥喜歡在向前走的同時又要向後走,如同設計界客戶要五彩斑斕的黑一樣可怕.

所以在這裡方向上的互斥我用了if 跟else if ,限制了這種大哥的騷操作.

最後把值賦給_move, 最後再用Translate去移動我們的Player,移動的方向為_move * 我們設定好的係數.

Moblie端的,

Moblie的我們一般是用搖桿來承載玩家的操作,

在搖桿拖拽的回調裡面獲取滑動球的(x,y)坐標即可得到他的移動方向了,.

因為大家的搖桿代碼都不相同,在這裡我就不舉例子了,

如果有需要搖桿代碼的朋友可以關注文章下方公眾號獲取.

接下來說一下旋轉視角的實現方式,

PC端,

if (Input.GetKeyDown(KeyCode.Z)) { mOnlyRoateCamera = true; mCurrRoate = camera.transform.localEulerAngles; model.SetParent(this.transform); } if (Input.GetKeyUp(KeyCode.Z)) { mOnlyRoateCamera = false; camera.transform.localEulerAngles = mCurrRoate; model.SetParent(camera.transform); } float _x = Input.GetAxis("Mouse X") * ConfigSetting.CameraMoveSpeedX; float _y = Input.GetAxis("Mouse Y") * ConfigSetting.CameraMoveSpeedY; if(mOnlyRoateCamera) camera.transform.localEulerAngles += new Vector3(-_y, _x); else transform.localEulerAngles += new Vector3(-_y, _x);

Input.GetKeyDown(KeyCode)表示當我們設定的按鍵按下去時,響應一次,

Input.GetKeyUp(KeyCode)同理.

這裡就是我們只旋轉視角不旋轉人物時的實現,

先把mOnlyRoateCamera的狀態設置為True,然後保存好旋轉前的攝像機角度.

最後將我們的人物模型由攝像機的子類,提到我們Player的子類.這樣做是為了讓我們的模型不會跟著攝像機旋轉。

當按鈕鬆開時復原狀態,將mOnlyRoateCamera設置為false,把旋轉前的值還給Camera,並把Model放回攝像機下面.

接下來獲取我們的滑鼠位置決定我們旋轉的角度增長值,

float _x = Input.GetAxis("Mouse X") * ConfigSetting.CameraMoveSpeedX; float _y = Input.GetAxis("Mouse Y") * ConfigSetting.CameraMoveSpeedY;

在這裡要用到Input.GetAxis() 傳入」Mouse X ,Y」,獲取滑鼠的增量,

注意:不能通過滑鼠postion的差值去旋轉,因為滑鼠的postion到達屏幕邊緣的時候就不會再變換了.

if(mOnlyRoateCamera) camera.transform.localEulerAngles += new Vector3(-_y, _x); else transform.localEulerAngles += new Vector3(-_y, _x);

最後再根據當前視角類型把值賦給對應的物體上面即可

Mobile端:

if(Input.touchCount > 0&&Input.GetTouch(0).phase == TouchPhase.Moved) { Vector3 _pos = Input.GetTouch(0).deltaPosition; camera.transform.localEulerAngles += new Vector3(-_pos.y,_pos.x); }

手機端的話我們通過Input.touchCount點擊的幀數,來判斷他是否處於點擊狀態,然後再用Input.GetTouch(0).phase獲取到我們點擊的手指的狀態,如果狀態為Moved時,獲取到他的移動增量deltaPostion,將增量賦值給camera即可.

最終PC端效果如下:

關注公眾號:[代碼律動ColdingWave] 可獲得更多項目資源與視頻教學.

回復」吃雞」可獲取完整項目,

回復」搖桿」可獲得搖桿項目

回復」倍鏡」可獲取之前倍鏡文章.


推薦閱讀:

ASO 實戰第一仗:App 名稱和關鍵詞優化
如何看待網爆的微商與奧巴馬合影握手事件?
坤鵬論:比特幣瘋了,你堅決不能瘋!
中越戰爭最大謠言:野戰醫院遭到越軍襲擊,女性衛生人員傷亡慘重
今天,我所在的公司被合併了……

TAG:互聯網 | 計算機 | Unity遊戲引擎 |