吃雞開發實戰之移動與視野旋轉
作為一個FPS遊戲,無論是手游或者端游,必不可少的就是移動跟視野旋轉.
這篇文章就以吃雞為案例,用Unity來跟大家演示一下,在端游跟手游中如何實現視野旋轉以及移動的.
其實很簡單,但是為了後續的各種功能實現,也照顧到一些小小白朋友,所以還是寫出來分享一下.
首先在這裡先創建一個空的一個GameObject,坐標跟MainCamera一樣,用來存放我們的攝像機跟人物模型,以及掛載他們關聯的腳本(這是我個人的開發習慣,便於管理.)
然後按照圖中的層級關係擺放好.
創建一個腳本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我們的操作模式枚舉,
Camera跟model即我們的主攝像機跟我們的人物模型.
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 名稱和關鍵詞優化
※如何看待網爆的微商與奧巴馬合影握手事件?
※坤鵬論:比特幣瘋了,你堅決不能瘋!
※中越戰爭最大謠言:野戰醫院遭到越軍襲擊,女性衛生人員傷亡慘重
※今天,我所在的公司被合併了……