- 前言
- 登录流程
- 联网登录KCPUseManage
- 联网配置
- 数据库MongoDB
- 进入游戏大厅
- 作者的话
虽然只是在记录学习经过,但是对于我来说要表述清楚整个逻辑也并非易事。于是我能做的就是尽量把整个思路详实记录下来,这样即使表述不清也可以供人参考,就像代码的执行过程的Review一样。 因此,我大概就是通过这样的Review来成文的,整个执行过程都可以通过Debug来确认重现。 关于ET整个框架,关于五星麻将,上一篇已经铺垫差不多了,这一篇讲整个登录流程。
登录流程上一篇我们已经可以展示登录界面了,如下图所示: 我们通过资源加载流程也可以找到对应的预设:
UGUI的基本组件很简单,没有什么好说的,当点下登录按钮就触发连接服务器的方法
Game.Scene.GetComponent().LoginAndConnect(LoginType.Editor, mAccountInputField.text);
这里使用的是编辑器模式,对应的方法在LoginPanelComponent.cs中。 逻辑比较简单,如果是测试就使用丑陋的红色登录界面,如果是正式的就会使用微信登录。当然,还有快捷登录方式,也就是说用户终端上已经记录了登录凭证,就通过凭证快速登录了。 代码就不复制了,UI的MVC模式也是老生常谈的技术了,所以也不啰嗦了。
上篇讲过事件机制,这里跳过,直接上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 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().Create(GameVersionsConfigMgr.Ins.ServerAddress);
// 创建一个ETHotfix层的Session, ETHotfix的Session会通过ETModel层的Session发送消息
Session realmSession = ComponentFactory.Create(session);
realmSession.session.GetComponent().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().ShowOptionWindow(r2CLogin.Message,null, PopOptionType.Single);//显示提示
UIComponent.GetUiView().Hide();//隐藏圈圈
_mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//状态改为断开连接
Game.Scene.GetComponent().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().ShowOptionWindow(g2CLoginGate.Message, null, PopOptionType.Single);
UIComponent.GetUiView().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的配置规则,属于是基本操作了,如果阁下不太明白,我在上一篇留下了传送门。
数据库MongoDBET的默认数据是MongoDB,当然,我们完全可以修改成其他数据库,只是MongoDB仍然是我们的首选。原因ET的作者熊猫大佬也解释的非常清楚了,这里不再重复赘述。 那么我们上面的那个配置文件中也对MongoDB进行了配置,这里要做的实际上是安装。 MongoDB的安装和使用,已经有另外一个大佬讲过了,所以我也不讲,这里留下传送门。 TA的博客模版很好看,二次元可爱风,所以按照TA的教程安装即可。至于MongoDB的Compass,TA没有安装,我却安装了,毕竟可视化的软件可以减少我们很多工作量。 编译运行服务器端,呃,这个真的是基本操作了。运行之后,我们发现MongoDB中已经有配置文件中对应的数据了。配置文件中DBName是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,这一篇还是尽量简单点好了,登录到游戏大厅后,我们会发现帧同步不太爽。 欲知后事如何,请听下回分解!
如果喜欢可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证! 技术难题?加入开发者联盟:566189328(QQ付费群)提供有限技术探讨,以及,心灵鸡汤Orz! 当然,不需要技术探讨也欢迎加入进来,在这里劈柴、遛狗、聊天、撸猫!( ̄┰ ̄*)