SKYXY客服
x
X-BOT WAR 人物同步教程與開發實例 | skyxy
快速建站
︿
TOP
首頁 > 研究專題 > 文章內容
X-BOT WAR 人物同步教程與開發實例
6/24/2018 8:59:48 AM
瀏覽數:3285
沈夜
前言:
此文章除了可以讓玩家了解如何開發線上同步射擊遊戲外,還有一個完整的檔案可以供玩家下載使用,在學習前,我們來看看此款遊戲的介紹。
遊戲介紹:
X-BOT WAR
是一款已經在Google Play 上架的遊戲,其內容為一款機器人即時大亂鬥競技遊戲,玩家可選擇 X-88 X-99 不同型號的機器人來加入戰鬥。玩家必須在120分鐘內打爆對手,取得最多的擊殺數。
此完整遊戲可到以下網站進行下載:
Android:
https://play.google.com/store/apps/details?id=com.playndora.xbotwar
IOS:
https://itunes.apple.com/us/app/x-bot-war/id879399563
遊戲示意圖:
下一頁我們開始討論我們要怎麼開發此專案。
開發教程
此專案使用了 Dp 與 Client 的方式進行遊戲。
想得知Dp的架構與使用請到以下鏈接參考教程。
http://www.skyxy.com/article/content.asp?id=24
GUID 設定
arcalet 使用了 GUID (金鑰)來使 client 與 服務器做連接,以下爲 本專案使用 guid 位置。

Client 端 GUID 設定
目標檔案: \Assets\Scripts\AGCC\AGCC_Options.cs
  1. Gguid
  2. Sguid
  3. Certificate
  4. Iguid_sys Server資訊
  5. Iguid_app 版本控制
  6. Iguid_pr 玩家資料
  7. Lguid_medal 排行榜

Dp 端 GUID設定
目標檔案:\AGCC\DPLogin.cs
  1. Gguid
  2. Sguid
  3. Certificate
  4. Iguid_sv  Server資訊
  5. Iguid_prinfo 玩家資料
  6. Iguid_medal 排行榜

在設定guid之前 我需要到 arcalet 後台創建新的專案才能有新的 guid
請讀者依照本專案需要的guid自行到後台創建。( 若沒有賬號需要新建新的賬號)

arcalet 開發平臺:
http://developer.arcalet.com/
Item 設定 (請新增一個新的 物品 並 需要有相同的 屬性

1. Xbot Server
 
  • PassGate 控制是否讓玩家連接遊戲
  • OfficialURL 官網鏈接
  • ChannelA~C 提供不同的Channel (poid)供開發者方便管理(如正式版使用ChannelA 連接而測試版則使用ChannelB 連接)
  • ChannelTest 除了以上2個方法 還提供了只供開發者自行連接的Channel
2. App Version Control 版本控制 (此範例使用Android,但也可通用IOS平台)
  • Ver 最小版本號(可更新但不需要強制更新)/強制最小版本號(client 版本號 小於此數值 則強制更新)
  • Market App下載首頁
(以下必須一致才能正確執行 如 Ad_PIC1 與 Ad_URL1 是同一項)
  • Ad_PIC1~3 提示/廣告視窗的圖片
  • Ad_URL1~3 提示/廣告視窗的鏈接
3. PlayerInfo 玩家資料
 
  • gold 金幣
  • medal 獎章
  • robot 選擇的機器人類型
  • upgrade 升級程度 (0-7)
  • tag_dayGift 每日獎勵
  • tag_eventGift 活動獎勵
設定需要的 物品 後 ,我們接下來設定場景與排行榜。
Scene 場景設定

這個專案因為使用了配對與動態場景的關係,所以需要另外創建一個新的動態場景,這樣就能讓玩家配對到各場景遊玩。
Ps:雖然遊戲內只供4個玩家配對,但不要忘了因為房間是由dp創建進入了才讓玩家配對進入,所以需要在人數限制調整為 4+1的人數。
Leaderboard 積分榜設定

此專案會針對擊殺分數作為指標來排行,並以每週的方式作為排行。另外在每週結束時,也會讓相應的玩家獲得獎勵。
以上我們就完成了 GUID的設定。接下來我們來看我們的遊戲是如何登錄遊戲。
登入 Client端:
登入流程
 
  • client在登入的時候會檢測本機端是否存有帳號,如沒有則會自動創建一個新的帳號再登入遊戲。
  • 登入後會先通過 GetItemClass 的方式獲取後台設定的 Server 環境設定。如此一來開發者就能通過後台即時更新各種資訊。如:Client版本號,廣告,專頁網站,伺服器連接地址等等。
  • 完成讀取後再根據現有的 Server Channel 發送註冊訊息,並在 Dp 回傳訊息後讀取個人的 GetItemInstances。都讀取成功後才算完成整個遊戲登入流程。 

以下呈現的流程圖可以讓玩家更了解此遊戲的登入流程。
登入流程圖
請從以下位置執行專案:
Assets\Scene\Login.scene

以上相關程式碼可以下列位置查看相關用法與寫法:
  • Assets\Scripts\Login\LoginManager.cs    LoadLogin()
  • Assets\Scripts\AGCC\AGCC_Login.cs   LoginGame()
  • Assets\Scripts\AGCC\AGCC_Msg.cs   PrivaMsgIn()
  • Assets\Scripts\AGCC\ArcaletControl.cs
通訊指令
在 Dp 與  Client 端 通訊時,我們需要知道其相關與相同的指令才有辦法讓 Dp 與 Client 做通訊。

PS:
  • 以下為 Client 端視角,dp則是反過來 (接受改為發送)
  • 沒有dp開頭則為不通過dp處理的訊息       

私人訊息
接收:
  • dp_reg   註冊回复 (itemid/dailyGift/eventGift)
  • dp_robot   設定robot成功 
  • dp_sid   配對場景的poid
  • dp_add   已經配對成功的玩家
  • dp_upgrade   升級成功
  • dp_readyTime   配對剩餘時間
  • dp_matchfail   配對失敗
  • dp_quit   dp關閉

發送:
  • quit  client退出
  • reg   client與dp主持
  • match  client請求配對

場景訊息
接收:
  • dp_add   dp通知配對新增新的玩家
  • dp_remove   dp通知配對刪除舊有的玩家
  • dp_ready   dp開始配對開始遊戲
  • dp_info   
  • dp_leave   dp通知有玩家離開
  • dp_start   dp通知client開始準備
  • dp_play   dp通知client開始遊戲
  • move   client移動點與角度
  • fire   fire發射點與角度
  • dp_hit
  • dp_kill
  • respawn
  • dp_gameover

發送:
  • info
  • respawn
  • fire
  • hit
  • move
  • enter
專案中,client端使用了一個 class 來做指令的轉換與整理。這樣做除了可以很自覺的知道哪裡使用了指令外,在傳輸時加密解密與轉換的過程能更加統一化。

相關程式碼可以在以下位置找到其相關使用方法:

Assets\Scripts\Command\DpCommand.cs
系統架構
此專案有使用一些比較方便的系統,如提示視窗系統與主遊戲控制器等等,以下列出此專案使用的系統。
(根據場景需要用的系統會有所不同,其中全場景為就算從專案複製出來也能獨立運作,會自行生成或是全域Static物件)

全場景:
  • Arcalet控制器
  • 視窗提示
  • 載入動畫
  • UGUI 監聽事件與動畫
  • 主聲音控制
  • dpCommand 

登入場景:
  • 登錄管理控制器
  • 登入狀態機

主大廳場景:
  • 主大廳控制器
  • 配對管理

遊戲場景:
  • 主遊戲控制器
遊戲配對流程
配對流程:

配對部分是由 dp 預先創建好的房間,並等待需要配對的玩家,在收到玩家發出配對指令  match  後,再依照現有的房間讓玩家進入房間。
Client 部分的話,收到dp進入場景訊息 dp_sid ,並根據其 sidsuid 成功登入場景(若失敗達5次 則會進入重新連線狀態),並打開配對界面後,會先收到 私人訊息 dp_add 加入 自己或原本已經配對好的玩家 才會從 場景訊息 收到 dp_add 來要加入比較晚來配對的玩家 當30秒倒數結束後就可以通過 dp 場景訊息 指令 進入遊戲。
配對流程圖:
人物同步部分
人物同步部分依據 移動 射擊 作為主要根據。

在這個專案中 移動射擊 不通過dp去處理,這樣做的好處是因為 讓 client 與 client 連線的話 能節省dp處理的負擔,但 缺點是 若就算client 端傳輸的位置是錯誤的,那 其他的client 也會受到錯誤的位置。

角色生成:
遊戲剛開始時 dp 會根據排隊次序分配 4 個玩家的位置。角色死亡後Client 會發送 respawn 指令到場景訊息,並且同步復活在同一個出生點。
移動部分:
使用電腦端會自動隱藏虛擬控制器而使用鍵盤與滑鼠,手機端則會使用虛擬控制器來讓角色移動。
  • 本機發送:
在本機端向任何一個位置移動時(限制最小移動值為 1f),每秒向場景發送一次現在的位置坐標,角度,移動速度和現在與arcalet 伺服器的延遲時間。
  • 遠端接收:
當接收其他robot 的速度大於 0 時,才會執行移動動作。讓遠端機器人移動前,client端 會先把收到的移動資訊再加以計算,如收到對方的延遲時間與自己的延遲時間相加。這樣,就能預測出1秒後遠端機器人會走到的位置,解決延遲收到資訊時還移動到之前的位置而造成有不同步的情形。

PS: 如還需要更詳細的解說,還請查看以下付費文章,了解更多使用方法。
http://www.skyxy.com/article/content.asp?id=39
射擊部分:
射擊部分不需要發送與接收延遲部分,因為子彈產生的位置已經是產生在預判位置後的機器人上,所以只需要知道角度即可。(不過產生位置還是需要再次判斷位置以做同步產生)
另外射擊有分 擊中 與 擊殺。
  • 擊中只需讓 Client端 檢測子彈是否觸碰其他機器人,再把訊息傳到dp 讓dp 去做血量運算才回傳到場景中。
  • 擊殺則只需在機器人血量少於0時,dp 傳送到 死亡指令到client端即可。(死亡時 client端 鎖定操控)
遊戲結算
遊戲右上角會有倒數計時設定。在遊戲開始時,dp也會記錄相關時間,並且進行倒數。
遊戲進行時,右手邊會有一個排行機制,讓玩家可以隨時查看自己的排行,或其他人的血量,擊殺與死亡數。
當時間結束後,dp 就會判斷每個人的擊殺數與死亡數,並根據當場排行給予金幣獎勵或減少玩家的金幣。
專案內使用插件
除了arcalet的插件外,此專案也使用了 如 dotween,與 unity purchase 等插件。

dotween 是一個能很便捷的製作動畫的插件。的相關用法可到 官方網站 查詢使用詳情,此專案通常利用dotween來製作ui 的動畫效果。
而 Unity Purchase 則是unity 在unity 5.2 後發布的內購插件(完全免費),此插件能很便捷的使用 個平台的內購,讓開發者不需要花費太多時間,就能在個平台使用內購功能。
Dp 部分
GUID 設定:

在使用dp時 開發者只需要設定好 Form_Main.cs 裡面的 全部GUID 就可以使用 Dp 功能。
dp使用的賬號為超級開發者賬號,開發者需要到後台進行設定。詳情的設定請參考  arcalet 超級使用者

GUID 設定範例圖 :
超級使用者 設定範例圖 (函式位於 DPLogin.cs 裡) :
登入設定:

使用 VisualStudio 打開後(推薦2015版本),按下F5 即可執行 Debug 模式。
在跳出視窗後,我們選擇 "- select a superuser -" => 選擇 登入帳號 與 Channel => Login 即可完成登入。

Ps:State需要出現 600 才算是登入成功。
Dp出錯機制:
若 Dp 發生 Exception , 檔案會記錄在 C:/XBot/Log , 裡面會有詳細的 錯誤資料 共開發者閱讀。
(或開發者可自行定義 Log 的位置 , 程式碼位於 Form_Main.cs 裡 的 60 行)


以上就是本專案的使用技巧,更多內容還請開發者自行下載檔案測試,裡面會有詳細說明。
1
2
3
4
5
6
7
8
 Xbot_War.zip  (141.47 MB)
您也可能喜歡這些文章
留言給作者
不公開此留言     登入即可留言
讀者留言
載入更多留言