放大招!!!落地成盒?教你開發本身的聯網"吃雞"遊戲

《絕地求生大逃殺》(下稱PUBG)這款遊戲已經發布一年了,獲取了很多讚譽和獎項。然而因爲神仙氾濫,讓我等原本就夕陽紅槍法的玩家成盒機率大大上升。雖然有大牛開發了仿PUBG的練槍遊戲,但這些遊戲都是單機的,一我的練槍太無聊,想要和小夥伴一塊兒練,怎麼辦呢?html


步驟

  1. 要看懂這篇文章,首先,你得有必定的Unity開發功底,以及入門級的Java語法;
  2. 訪問 Unity 的 Asset Store 下載一個射擊類遊戲項目,而且 Import 到 Unity 內;
  3. 訪問 BGS官網,註冊帳號並下載 Unity SDKGameCloud SDK;
  4. BmobGame_UnitySDK_vx.x.x_xxxxxx.unitypackage Import 到Unity內;
  5. 修改SDK,將遊戲開始跳轉的 Scene 改成你下載的射擊類遊戲 Demo Scene;
  6. 在 Demo Scene 進行SDK的初始化,綁定 delegate 用於處理各類通知;
  7. 將本地角色 LocalPlayer 的移動、面向角度、姿態(臥倒/下蹲/持有手槍/持有步槍)等數據,調用SDK接口同步到服務器;
  8. LocalPlayer 的瞬時動做(如開火/跳躍/換彈匣、拾取物品等Pose)經過SDK接口直接發送到其它玩家;
  9. 擊中其它玩家時,將事件詳情通知到服務器雲端代碼,包括所用武器、擊中身體部位、對方的id;
  10. 讀取服務器同步的數據,修改 LocalPlayer 的血量、擊殺數、名次,並渲染其它玩家的位置、角度、姿態。獲取其它玩家直接發送的瞬時動做,操做Animator;
  11. BGS官網 登陸管理後臺,建立遊戲,修改 服務器運行配置 ,包括 每秒幀率(默認60Hz)、房間最多玩家數 (2個或以上);
  12. 修改 玩家眷性配置,設置各個屬性的名稱、類型、長度、值域、由雲端/客戶端編輯、其它玩家是否可見等。下方有 PUBG 的玩家眷性例子;
  13. 打開 EclipseAndroid Studio,建立Java項目,導入 BmobGame_JavaCloud_vx.x.x_xxxxxx.jar,並建立 Player.javaRoom.java,分別繼承自 PlayerBase.classRoomBase.class 後,編寫遊戲邏輯代碼。下方有案例;
  14. 打包運行遊戲,就能夠多人同時在線對戰啦~

接下來大概介紹一下開發的要點,Demo源碼、具體開發流程敬請期待後續教程java


開發體驗

本人Unity不熟絡,在拿着一個半成品的Unity FPS項目的狀況下,添加3D模型、製做Animation和Animator花費了較多時間,到如今尚未把持有武器狀態下的模型和動做結合起來。數據庫

可是在基於客戶端基本完工的狀況下,接入BGS,把它從一個單機遊戲變成了多人聯網遊戲,僅花費1小時。立刻就能夠多人開黑啦。後端


運行效果

Demo測試運行視頻 (B站無廣告傳送門) 數組

超清/720P模式觀看體驗更好哦安全

能夠說除了動做不完善以外,聯網射擊對戰遊戲基本上的要素都具有啦服務器


玩家眷性配置

玩家的屬性有如下幾種類型:網絡

類型 使用案例
boolean 是否無敵狀態
int 血量、分數
float 2D遊戲的面朝角度
double 吟唱讀條進度
boolean[] 各類持續姿態
int[] 物品欄、外觀項
float[] 角色位置、3D遊戲的面朝角度
double[] 高物理精度遊戲的部分參數

當屬性類型爲 intint[]時,須要指定最大值 max,以便服務器優化同步效率ide

當屬性類型爲 xxx[] 時,須要指定數組長度 count,以便服務器優化同步效率函數


每一個玩家眷性還有 exporteditable 兩個開關,默認都爲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,是爲了防止客戶端外掛能夠隨意編輯生成道具
    取而代之的是客戶端發送拾取、消耗、丟棄道具的指令到雲端代碼,經由合法性判斷後操做該屬性、同步到客戶端

雲端代碼

  • BGS的雲端代碼能夠完美實現遊戲的後端邏輯層,而且有熱更新機制,能夠隨時修改、升級
  • 縫合了Bmob數據服務,能夠快速進行Bmob數據庫的增刪查改,其中 Bmob.class 的用法與 Bmob Java雲函數modules.oData 徹底一致

主要須要開發者實現的有 Room.javaPlayer.java


Room.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 房間被建立時 將房間的 idjoinKey等保存到 Bmob數據庫,可進行好友對戰、匹配對戰
onGameStart 全部玩家均已準備,遊戲開始時 初始化物品數量和位置、安全區的位置
onTick 遊戲中,以每秒屢次的頻率調用(取決於每秒幀率配置) 實現安全區、轟炸區等遊戲設定
onDestroy 房間被銷燬時 將房間信息從 Bmob數據庫 刪除

Player.java

繼承自 PlayerBase.class , 做用有:

  1. 管理、監控玩家的行爲和生命週期
  2. 修改玩家眷性值(editable==false的屬性)
  3. 監聽玩家眷性值變更(editable==true的屬性)

如下是類屬性

名稱 類型 做用
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, 如客戶端上報擊中其它玩家,ActionDamage,添加方法

@BmobGameSDKHook
public void onAction_Damage(byte[] damage) {
    // 使用setHp修改被擊中玩家的血量,若是<=0,則斷定死亡,通知全部用戶
}

代碼節選

  • Room.java的代碼很簡單,只在房間建立、開始、銷燬等時候進行Bmob數據庫的操做

Room.java


  • Player.java的代碼承擔了大多數的遊戲邏輯,例以下面是某玩家上報擊中另外一個玩家時的處理器

Player.java


  • Unity內代碼(屬性同步)

Player.cs

感興趣我:小小琪QQ:2967459363

其餘教程:

Unity聯網對戰遊戲小Demo
如何實現各類遊戲的思路雜想

相關文章
相關標籤/搜索