《絕地求生大逃殺》(下稱PUBG)這款遊戲已經發布一年了,獲取了很多讚譽和獎項。然而因爲神仙氾濫,讓我等原本就夕陽紅槍法的玩家成盒機率大大上升。雖然有大牛開發了仿PUBG的練槍遊戲,但這些遊戲都是單機的,一我的練槍太無聊,想要和小夥伴一塊兒練,怎麼辦呢?html
Unity
開發功底,以及入門級的Java
語法;Import
到 Unity 內;Unity SDK
、GameCloud SDK
;BmobGame_UnitySDK_vx.x.x_xxxxxx.unitypackage
Import 到Unity內;delegate
用於處理各類通知;LocalPlayer
的移動、面向角度、姿態(臥倒/下蹲/持有手槍/持有步槍)等數據,調用SDK接口同步到服務器;LocalPlayer
的瞬時動做(如開火/跳躍/換彈匣、拾取物品等Pose)經過SDK接口直接發送到其它玩家;LocalPlayer
的血量、擊殺數、名次,並渲染其它玩家的位置、角度、姿態。獲取其它玩家直接發送的瞬時動做,操做Animator;BGS官網
登陸管理後臺,建立遊戲,修改 服務器運行配置
,包括 每秒幀率
(默認60Hz)、房間最多玩家數
(2個或以上);玩家眷性配置
,設置各個屬性的名稱、類型、長度、值域、由雲端/客戶端編輯、其它玩家是否可見等。下方有 PUBG
的玩家眷性例子;Eclipse
或 Android Studio
,建立Java項目,導入 BmobGame_JavaCloud_vx.x.x_xxxxxx.jar
,並建立 Player.java
和 Room.java
,分別繼承自 PlayerBase.class
和 RoomBase.class
後,編寫遊戲邏輯代碼。下方有案例;接下來大概介紹一下開發的要點,Demo源碼、具體開發流程敬請期待後續教程java
本人Unity不熟絡,在拿着一個半成品的Unity FPS項目的狀況下,添加3D模型、製做Animation和Animator花費了較多時間,到如今尚未把持有武器狀態下的模型和動做結合起來。數據庫
可是在基於客戶端基本完工的狀況下,接入BGS,把它從一個單機遊戲變成了多人聯網遊戲,僅花費1小時。立刻就能夠多人開黑啦。後端
超清/720P模式觀看體驗更好哦安全
能夠說除了動做不完善以外,聯網射擊對戰遊戲基本上的要素都具有啦服務器
玩家的屬性有如下幾種類型:網絡
類型 | 使用案例 |
---|---|
boolean | 是否無敵狀態 |
int | 血量、分數 |
float | 2D遊戲的面朝角度 |
double | 吟唱讀條進度 |
boolean[] | 各類持續姿態 |
int[] | 物品欄、外觀項 |
float[] | 角色位置、3D遊戲的面朝角度 |
double[] | 高物理精度遊戲的部分參數 |
當屬性類型爲 int
、 int[]
時,須要指定最大值 max
,以便服務器優化同步效率ide
當屬性類型爲 xxx[]
時,須要指定數組長度 count
,以便服務器優化同步效率函數
每一個玩家眷性還有 export
、editable
兩個開關,默認都爲false,如下是這兩個開關的描述:
Export :
值 | 效果 | 使用案例 |
---|---|---|
true | 該玩家眷性對全部玩家開放 | 位置、角度、姿態、外觀項 |
false | 該玩家眷性僅本玩家可獲取 | PUBG 的血量、擊殺數等 |
Editable :
值 | 效果 | 使用案例 |
---|---|---|
true | 該值由客戶端進行修改,服務器只讀 | 位置、角度、姿態 |
false | 該值由服務器進行修改,客戶端只讀 | PUBG 的血量、擊殺數等 |
一個屬性不能同時 Export==false 且 Editable==True,由於這種屬性每每不須要通過網絡
如下是 PUBG
的推薦玩家眷性配置
名稱 | 類型 | 最大值/數組長度 | Export | Editable | 描述 |
---|---|---|---|---|---|
hp | int | 100 / - | false | false | 血量 |
score | int | 100 / - | false | false | 擊殺數 |
position | float[] | - / 3 | true | true | 位置 |
rotation | float[] | - / 3 | true | true | 角度 |
surface | int[] | 255 / 8 | true | true | 外觀件 |
knapsack | int[] | 65535 / 255 | false | false | 物品欄 |
案例中的 knapsack(揹包),設計原理是index爲物品id,對應數字爲物品個數 例如遊戲中共有3種道具,分別是槍、子彈、手雷,咱們定它們的id分別爲0、一、2 那麼knapsack爲[1,8,4]意味着這個玩家有 1把槍、8顆子彈、4顆手雷 這個屬性之因此Editable爲false,是爲了防止客戶端外掛能夠隨意編輯生成道具 取而代之的是客戶端發送拾取、消耗、丟棄道具的指令到雲端代碼,經由合法性判斷後操做該屬性、同步到客戶端
Bmob.class
的用法與 Bmob Java雲函數 的 modules.oData
徹底一致主要須要開發者實現的有 Room.java
、Player.java
繼承自 RoomBase.class
, 做用是管理、監控房間的生命週期
如下是類屬性 :
名稱 | 類型 | 做用 |
---|---|---|
roomId | int | 房間id,建立房間時產生,客戶端SDK加入房間時須要攜帶 |
players | Player.class[] | 該房間內全部玩家 |
playerCount | int | 該房間內玩家數 |
masterId | String | 建立房間的玩家id |
masterKey | String | 銷燬/踢出玩家須要攜帶的key |
joinKey | String | 加入房間須要攜帶的key |
isPlaying | boolean | 該房間是在遊戲中仍是等待中 |
startTime | long | 該房間的遊戲開始時間毫秒數 |
如下是可主動調用的方法 :
方法名 | 參數 | 返回值 | 做用 |
---|---|---|---|
dispatchGameOver | - | - | 讓房間遊戲結束 |
sendToAll | byte[] | boolean | 向全部玩家推送消息 |
sendToAllExcept | byte[],Player | boolean | 向某玩家之外的全部玩家推送消息 |
如下是須要Override的生命週期相關監聽方法 :
這些方法都沒有參數,返回值均爲void
方法名 | 調用時機 | 使用案例 |
---|---|---|
onCreate | 房間被建立時 | 將房間的 id 、joinKey 等保存到 Bmob數據庫 ,可進行好友對戰、匹配對戰 |
onGameStart | 全部玩家均已準備,遊戲開始時 | 初始化物品數量和位置、安全區的位置 |
onTick | 遊戲中,以每秒屢次的頻率調用(取決於每秒幀率配置) | 實現安全區、轟炸區等遊戲設定 |
onDestroy | 房間被銷燬時 | 將房間信息從 Bmob數據庫 刪除 |
繼承自 PlayerBase.class
, 做用有:
如下是類屬性 :
名稱 | 類型 | 做用 |
---|---|---|
room | Room | 房間對象 |
no | int | 玩家在該房間的id,加入房間時分配 |
roommates | Player.class[] | 該房間內全部玩家,能夠用roommates[no]進行索引 |
如下是可主動調用的方法 :
方法名 | 參數 | 返回值 | 做用 |
---|---|---|---|
syncToClient | - | void | 修改參數結束後,將修改同步到客戶端 |
getStatus | - | int | 獲取玩家狀態,有無人/等待/準備/遊戲中/被淘汰/掉線 |
getUserId | - | String | 加入房間時傳入的用戶id |
send | byte[] | boolean | 向本玩家推送消息 |
sendToAll | byte[] | boolean | 向該房間的全部玩家推送消息 |
sendToOthers | byte[] | boolean | 向本玩家之外的全部玩家推送消息 |
kick | - | boolean | 將本玩家踢出房間 |
如下是須要Override的生命週期相關監聽方法 :
這些方法都沒有參數,返回值均爲void
方法名 | 調用時機 | 使用案例 |
---|---|---|
onJoin | 玩家加入房間時 | 操做Bmob數據庫 |
onLeave | 玩家主動退出房間時 | 操做Bmob數據庫 |
onReady | 玩家在房間內準備時 | - |
onUnready | 玩家取消準備 | - |
onGameStart | 本輪遊戲開始 | 初始化玩家眷性 |
onTick | 遊戲開始後以必定頻率被調用 | 更新安全區位置和半徑、發送通知 |
onGameOver | 遊戲結束 | 保存遊戲記錄到Bmob數據庫 |
onOffline | 玩家掉線 | 可通知其它玩家 |
onReconn | 玩家重連 | 更新一些自定義數據到本玩家,並通知其它玩家 |
onKicked | 玩家被踢出房間 | - |
Player.java 容許自定義 獲取屬性方法、修改屬性方法、監聽屬性方法
例如,若是雲端代碼須要修改玩家的hp屬性,須要在 Player.java
添加方法:
@BmobGameSDKHook public native void setHp(int hp);
若是須要獲取玩家的position屬性,添加方法:
@BmobGameSDKHook public native float[] getPosition();
須要監聽玩家的position屬性變更,添加方法:
@BmobGameSDKHook strictfp void onUpdate_Position() { // TODO 與當前安全區進行計算,是否扣除玩家血量 }
須要處理客戶端的 Action
, 如客戶端上報擊中其它玩家,Action
爲 Damage
,添加方法
@BmobGameSDKHook public void onAction_Damage(byte[] damage) { // 使用setHp修改被擊中玩家的血量,若是<=0,則斷定死亡,通知全部用戶 }