ET學習筆記之五星麻將1

前言

雖然只是在記錄學習經過,但是對於我來說要表述清楚整個邏輯也並非易事。於是我能做的就是儘量把整個思路詳實記錄下來,這樣即使表述不清也可以供人蔘考,就像代碼的執行過程的Review一樣。
因此,我大概就是通過這樣的Review來成文的,整個執行過程都可以通過Debug來確認重現。
關於ET整個框架,關於五星麻將,上一篇已經鋪墊差不多了,這一篇講整個登錄流程。

登錄流程

上一篇我們已經可以展示登錄界面了,如下圖所示:
登錄界面
我們通過資源加載流程也可以找到對應的預設:
登錄預設
UGUI的基本組件很簡單,沒有什麼好說的,當點下登錄按鈕就觸發連接服務器的方法Game.Scene.GetComponent<KCPUseManage>().LoginAndConnect(LoginType.Editor, mAccountInputField.text);這裏使用的是編輯器模式,對應的方法在LoginPanelComponent.cs中。
邏輯比較簡單,如果是測試就使用醜陋的紅色登錄界面,如果是正式的就會使用微信登錄。當然,還有快捷登錄方式,也就是說用戶終端上已經記錄了登錄憑證,就通過憑證快速登錄了。
代碼就不復制了,UI的MVC模式也是老生常談的技術了,所以也不囉嗦了。

聯網登錄KCPUseManage

上篇講過事件機制,這裏跳過,直接上LoginAndConnect的代碼:

        //登陸並連接
        public async void LoginAndConnect(int loginType, string dataStr,bool isReconnection=false)
        {
            _UpLoginType = loginType;
            _UpLoginDataStr = dataStr;
            if (_mStateManage.pKCPNetWorkState == KCPNetWorkState.BebeingConnect|| _mStateManage.pKCPNetWorkState == KCPNetWorkState.Connect)
            {
                Log.Warning("正在連接 請不要重複連接 或已經成功連接");
            }
            try
            {
                
               
                _mStateManage.StartConnect();
                //根據是否重連 註冊 連接成功 是連接失敗的事件
                mSocketCantConnectCall = _mStateManage.ConnectFailure;//連接失敗
                Action<G2C_GateLogin> connectSuccesAction = _mStateManage.ConnectSuccess;//連接成功
                //如果是重連 更改一下回調
                if (isReconnection)
                {
                    mSocketCantConnectCall = _mStateManage.AgainConnectFailure;
                    connectSuccesAction = _mStateManage.AgainConnectSuccess;
                }
                Log.Debug("驗證服地址:"+ GameVersionsConfigMgr.Ins.ServerAddress);
                // 創建一個ETModel層的Session
                ETModel.Session session = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(GameVersionsConfigMgr.Ins.ServerAddress);
                // 創建一個ETHotfix層的Session, ETHotfix的Session會通過ETModel層的Session發送消息
                Session realmSession = ComponentFactory.Create<Session, ETModel.Session>(session);
                realmSession.session.GetComponent<SessionCallbackComponent>().DisposeCallback += RealmSessionDisposeCallback;
                //登陸驗證服務器
                R2C_CommonLogin r2CLogin =(R2C_CommonLogin)await realmSession.Call(new C2R_CommonLogin()
                {
                    LoginType = loginType,
                    PlatformType = HardwareInfos.pCurrentPlatform,
                    DataStr = dataStr,
                });
                realmSession.Dispose();
                if (!string.IsNullOrEmpty(r2CLogin.Message))
                {
                    if (PlayerPrefs.HasKey(GlobalConstant.LoginVoucher))
                    {
                        PlayerPrefs.DeleteKey(GlobalConstant.LoginVoucher);//登陸失敗的話 如果有憑證 就刪除憑證
                    }
                    UIComponent.GetUiView<PopUpHintPanelComponent>().ShowOptionWindow(r2CLogin.Message,null, PopOptionType.Single);//顯示提示
                    UIComponent.GetUiView<LoadingIconPanelComponent>().Hide();//隱藏圈圈
                    _mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//狀態改爲斷開連接
                    Game.Scene.GetComponent<ToyGameComponent>().StartGame(ToyGameId.Login);//進入登陸界面
                    return;
                }
                PlayerPrefs.SetString(GlobalConstant.LoginVoucher, r2CLogin.LoginVoucher);//記錄登陸憑證
                //登陸網關服務器
                G2C_GateLogin g2CLoginGate =await ConnectGate(r2CLogin.Address, r2CLogin.Key, loginType);
                if (!string.IsNullOrEmpty(g2CLoginGate.Message))
                {
                    UIComponent.GetUiView<PopUpHintPanelComponent>().ShowOptionWindow(g2CLoginGate.Message, null, PopOptionType.Single);
                    UIComponent.GetUiView<LoadingIconPanelComponent>().Hide();//隱藏圈圈
                    _mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//狀態改爲斷開連接
                    return;
                }
                //發起連接成功事件
                connectSuccesAction(g2CLoginGate);
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }

當我們隨便輸入一個帳號,再點擊登陸按鈕,就觸發上面這個方法了,但是我們是連不上的。原因很簡單,這裏的驗證服地址GameVersionsConfigMgr.Ins.ServerAddress根本不是我們配置的本地服務器地址。

聯網配置

所以我們需要重新配置,打開配置文件重新配置即可,如下圖所示:
配置文件
打開這個配置文件,配置如下:

{"AssetBundleServerUrl":"http://*:8080/","Address":"127.0.0.1:10002"}

這個時候我們還需要檢查下服務器的配置,找到…/Config/StartConfig/LocalAllServer.txt文件,配置如下:

{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "C" : [{ "_t" : "OuterConfig", "Address" : "127.0.0.1:10002", "Address2" : "127.0.0.1:10002" }, { "_t" : "InnerConfig", "Address" : "127.0.0.1:20000" }, { "_t" : "HttpConfig", "Url" : "http://*:8080/", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "ConnectionString" : "mongodb://127.0.0.1:27017", "DBName" : "GaneGather" }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }

關於ET的配置規則,屬於是基本操作了,如果閣下不太明白,我在上一篇留下了傳送門。

數據庫MongoDB

ET的默認數據是MongoDB,當然,我們完全可以修改成其他數據庫,只是MongoDB仍然是我們的首選。原因ET的作者熊貓大佬也解釋的非常清楚了,這裏不再重複贅述。
那麼我們上面的那個配置文件中也對MongoDB進行了配置,這裏要做的實際上是安裝。
MongoDB的安裝和使用,已經有另外一個大佬講過了,所以我也不講,這裏留下傳送門
TA的博客模版很好看,二次元可愛風,所以按照TA的教程安裝即可。至於MongoDB的Compass,TA沒有安裝,我卻安裝了,畢竟可視化的軟件可以減少我們很多工作量。
編譯運行服務器端,呃,這個真的是基本操作了。運行之後,我們發現MongoDB中已經有配置文件中對應的數據了。配置文件中DBName是GaneGather,對應的數據庫是根據配置文件來創建的,如圖所示:
GaneGather數據庫
作者非常貼心地爲我們準備好了許多基礎數據,直接使用即可。

進入遊戲大廳

數據庫和服務器都沒有問題了,接下來登錄即可,登錄後進入遊戲大廳,如圖所示:
遊戲大廳
至此,登錄流程就走完了,實際上省略了非常多東西,真實的項目登錄起來會有更多流程:
1:由第三方平臺(如九遊,騰訊遊戲平臺等)提供的 SDK 裏的界面進行註冊或登錄,其登錄將給我們一個 token
2:請求最新的服務器列表,可通過 http 取下來.(優化:服務器列表可以分成若干文件提高用戶體驗)
3:前端向登錄服務器請求連接,然後一連接成功就會收到一個登錄服務器的隨機值(challenge)
4:前端發一個經過 dhexchange 的隨機值 (handshake_client_key) 給登錄服務器
5:登錄服務器收到 handshake_client_key 後生成併發送 handshake_server_key 給前端,此時雙方可算出密鑰 secret 了
6:前端利用之前收到的 challenge 和算出的 secret 生成併發送 hmac 和 token 信息(包含帳號密碼和遊戲服務器標識)給登錄服務器
7:登錄服務器驗證用戶信息後告訴前端是否驗證成功(200 subid 或者400 Bad Request 等)
8:開始請求連接遊戲服務器 M,連接上後前端利用 secret 和 subid 生成併發送握手校驗給 M
9:收到遊戲服務器 M 的校驗結果(成功爲200)
10:可以正常向遊戲服務器收發協議了
這些流程,也許以後會講一下,畢竟現在我不具備商業資質,所以恐怕根本跑不通。當然也不一定需要具備資質才能講,第三方開放平臺就可以申請到一些方便的微信和QQ登錄通道。
Anyway,這一篇還是儘量簡單點好了,登錄到遊戲大廳後,我們會發現幀同步不太爽。
欲知後事如何,請聽下回分解!

作者的話

Alt

如果喜歡可以點贊支持一下,謝謝鼓勵!如果有什麼疑問可以給我留言,有錯漏的地方請批評指證!
技術難題?加入開發者聯盟:566189328(QQ付費羣)提供有限技術探討,以及,心靈雞湯Orz!
當然,不需要技術探討也歡迎加入進來,在這裏劈柴、遛狗、聊天、擼貓!( ̄┰ ̄*)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章