【商業(yè)MMO實(shí)戰(zhàn)訓(xùn)練營】01-登陸篇

前言
本文要帶大家學(xué)習(xí)的是如何運(yùn)用商業(yè)游戲中的服務(wù)器架構(gòu)快速的開發(fā)一款MMO游戲,我們會(huì)結(jié)合項(xiàng)目中用到的技術(shù)來給大家講解商業(yè)MMO游戲中的服務(wù)器架構(gòu)實(shí)現(xiàn)原理
版權(quán)聲明
本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明
更多學(xué)習(xí)資源請加QQ:1517069595或WX:alice17173獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對一指導(dǎo))
點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源
目標(biāo)和效果(演示效果非最終效果)
登陸效果演示

這是我們的Demo場景,在游戲運(yùn)行時(shí)游戲的服務(wù)器也會(huì)同步運(yùn)行,點(diǎn)擊Game窗口右上角的Login按鈕時(shí)會(huì)使用默認(rèn)的賬號(hào)密碼登陸并打印日志信息
角色的創(chuàng)建與選擇

登錄之后可以點(diǎn)擊Game窗口右上角的第二個(gè)按鈕會(huì)打印出當(dāng)前角色列表,上圖中可以看到當(dāng)前獲取到的玩家列表的元素個(gè)數(shù)是零個(gè),也就是說現(xiàn)在還沒有創(chuàng)建玩家,或者沒有角色列表
創(chuàng)建一個(gè)玩家

點(diǎn)擊Game窗口右上角的第三個(gè)按鈕創(chuàng)建角色,創(chuàng)建角色時(shí)客戶端會(huì)向服務(wù)器提出創(chuàng)建角色請求,服務(wù)器會(huì)給客戶端返回一個(gè)結(jié)果
創(chuàng)建角色時(shí)會(huì)從我們的機(jī)構(gòu)名稱幽夢創(chuàng)客隨機(jī)選擇其中一個(gè)字來作為這個(gè)角色的名字(如下圖)

可以看到這里隨機(jī)出的角色名是夢,而且這個(gè)角色在服務(wù)器上會(huì)存儲(chǔ)一個(gè)編號(hào),也就是name前的dbid,程序中一般不用字符串來作為識(shí)別這個(gè)人的編號(hào),因?yàn)槊挚赡苤孛幪?hào)不可能重名
得到角色的數(shù)據(jù)庫id后就可以用這個(gè)id進(jìn)行角色登錄

點(diǎn)擊第四個(gè)按鈕就可以使用已創(chuàng)建的角色進(jìn)行登陸了
游戲效果

上面就是此Demo的游戲畫面了,雖然看上去有點(diǎn)簡陋但該有的功能是一點(diǎn)都不少的
角色移動(dòng)

角色傳送

怪物巡邏

NPC對話


通過使用鼠標(biāo)點(diǎn)擊NPC可以觸發(fā)對話并打印到控制臺(tái),之后我們會(huì)使用Unity的UGUI來把NPC的對話和對話選項(xiàng)顯示到客戶端的窗口上
怪物戰(zhàn)斗

Game窗口左上角的enemyid代表當(dāng)前要攻擊的怪物的id,現(xiàn)在為0是因?yàn)楫?dāng)前沒有選中怪物(如上圖)

通過鼠標(biāo)點(diǎn)擊怪物后enemyid的數(shù)值會(huì)變?yōu)?038,這代表那個(gè)怪物的id,也表示鼠標(biāo)選中了這個(gè)怪物(如上圖)

選中怪物后可以通過鍵盤上的按鍵對怪物進(jìn)行攻擊,攻擊時(shí)會(huì)在控制面板中打印攻擊信息(如上圖)

怪物血量歸零時(shí)就會(huì)消失,之后服務(wù)器會(huì)在原本的位置重新刷出來一只怪物
登錄功能流程詳解
在實(shí)現(xiàn)登錄功能之前先來看一下登錄的總體流程,下面是按照游戲開發(fā)的規(guī)范畫的UML時(shí)序圖,它主要表現(xiàn)了客戶端跟服務(wù)器的交互流程


大型商業(yè)項(xiàng)目的服務(wù)器通常不是一個(gè)服務(wù)器,而是一組服務(wù)器,其中的每一種服務(wù)器可能有多個(gè)服務(wù)器來支撐系統(tǒng)功能,比如登陸服務(wù)器在處理一百萬人同時(shí)登錄時(shí)肯定不是一臺(tái)服務(wù)器處理,而是由多臺(tái)服務(wù)器同時(shí)處理
客戶端登錄流程
1,顯示啟動(dòng)動(dòng)畫
2,客戶端進(jìn)行初始化
3,登錄賬號(hào)
在登錄時(shí)客戶端會(huì)向服務(wù)器發(fā)出登錄請求,這個(gè)請求會(huì)由登陸服務(wù)器來處理
4,賬號(hào)查詢
登陸服務(wù)器需要通過賬號(hào)數(shù)據(jù)庫服務(wù)器來查詢這個(gè)賬號(hào)是否已經(jīng)注冊,如果沒有注冊就會(huì)在賬號(hào)數(shù)據(jù)庫服務(wù)器里注冊一個(gè)
5,登錄成功
賬號(hào)查詢完以后會(huì)有登錄成功與登錄失敗兩種情況,登錄成功時(shí)會(huì)將玩家賬號(hào)登錄到網(wǎng)關(guān)服務(wù)器
游戲服務(wù)器可以分成登錄服務(wù)器和處理游戲業(yè)務(wù)的服務(wù)器,登錄服務(wù)器在登錄完以后就不再跟用戶打交道,之后會(huì)由網(wǎng)關(guān)服務(wù)器來處理客戶端發(fā)送的跟游戲相關(guān)的事件
6,登錄失敗
登錄失敗時(shí)會(huì)給客戶端返回登錄失敗結(jié)果
7,請求版本文件
向資源更新服務(wù)器請求資源版本信息,資源更新服務(wù)器會(huì)返回最新版本的資源的相關(guān)信息
8,返回版本號(hào),版本號(hào)內(nèi)的文件信息
資源更新服務(wù)器返回的最新版本的資源相關(guān)信息包括了資源版本號(hào)和版本內(nèi)的所有文件信息
9,客戶端版本文件與服務(wù)器做對比
用服務(wù)器版本文件跟客戶端版本文件做比對,如果發(fā)現(xiàn)有一些內(nèi)容需要更新,就會(huì)進(jìn)入第十個(gè)步驟
10,下載更新(異步)
從資源更新服務(wù)器下載更新資源,這是一個(gè)異步的操作,可以一邊下載資源一邊在客戶端UI上提示當(dāng)前下載信息
12,資源替換
得到更新完以后的服務(wù)器版本資源后,就需要把客戶端舊版本資源替換成新版本資源,
13,資源解壓
通過對資源進(jìn)行解壓得到最新的資源后就登陸成功了
登陸功能實(shí)現(xiàn)
在Unity場景里創(chuàng)建一個(gè)空對象,名叫TotaMgr,也就是總管(如下圖)

為TotaMgr添加一個(gè)REMian組件,這是客戶端與服務(wù)器通信的主要組件,它既能支持KCP通信也能支持TCP通信,也就是說它即支持了MMO游戲開發(fā),也支持幀同步對戰(zhàn)游戲開發(fā)
添加完這個(gè)組件后客戶端就能與服務(wù)器進(jìn)行通信了

這個(gè)Demo里已經(jīng)定義好了客戶端與服務(wù)器的通訊協(xié)議,名叫Login,,登錄時(shí)可以像調(diào)用的方法一樣發(fā)送協(xié)議到服務(wù)器
Login有三個(gè)參數(shù),第一個(gè)參數(shù)是登錄時(shí)的賬號(hào),第二個(gè)參數(shù)是用戶密碼,第三個(gè)參數(shù)是登錄時(shí)的一些額外信息,這里用三個(gè)問號(hào)表示,因?yàn)檫@個(gè)信息是可以按照自己的需求來傳遞的(如下圖)

接下來開始編寫TotaMgr的腳本
創(chuàng)建TotaMgr腳本,并把它拖到TotaMgr對象上

因?yàn)檫@個(gè)Demo里已經(jīng)將客戶端與服務(wù)器進(jìn)行登錄通訊的協(xié)議定義好了,所以TotaMgr腳本里只需要進(jìn)行一些簡單的操作就可以了
寫完腳本后運(yùn)行游戲就可以在Game面板左上角顯示Login按鈕了,點(diǎn)擊按鈕時(shí)會(huì)向服務(wù)器發(fā)送登錄請求,并在控制面板中打印是否登錄成功(詳細(xì)代碼講解可以點(diǎn)擊文末完整視頻鏈接查看)
寫在最后
更多學(xué)習(xí)資源請加QQ:1517069595或WX:alice17173獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對一指導(dǎo))
點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源