前言
本文要带大家学习的是如何运用商业游戏中的服务器架构快速的开发一款MMO游戏,我们会结合项目中用到的技术来给大家讲解商业MMO游戏中的服务器架构实现原理
版权声明
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源
目标和效果(演示效果非最终效果)
登陆效果演示
![]()
这是我们的Demo场景,在游戏运行时游戏的服务器也会同步运行,点击Game窗口右上角的Login按钮时会使用默认的账号密码登陆并打印日志信息
角色的创建与选择
![]()
登录之后可以点击Game窗口右上角的第二个按钮会打印出当前角色列表,上图中可以看到当前获取到的玩家列表的元素个数是零个,也就是说现在还没有创建玩家,或者没有角色列表
创建一个玩家
![]()
点击Game窗口右上角的第三个按钮创建角色,创建角色时客户端会向服务器提出创建角色请求,服务器会给客户端返回一个结果
创建角色时会从我们的机构名称幽梦创客随机选择其中一个字来作为这个角色的名字(如下图)
![]()
可以看到这里随机出的角色名是梦,而且这个角色在服务器上会存储一个编号,也就是name前的dbid,程序中一般不用字符串来作为识别这个人的编号,因为名字可能重名而编号不可能重名
得到角色的数据库id后就可以用这个id进行角色登录
![]()
点击第四个按钮就可以使用已创建的角色进行登陆了
游戏效果
![]()
上面就是此Demo的游戏画面了,虽然看上去有点简陋但该有的功能是一点都不少的
角色移动
![]()
角色传送
![]()
怪物巡逻
![]()
NPC对话
![]()
![]()
通过使用鼠标点击NPC可以触发对话并打印到控制台,之后我们会使用Unity的UGUI来把NPC的对话和对话选项显示到客户端的窗口上
怪物战斗
![]()
Game窗口左上角的enemyid代表当前要攻击的怪物的id,现在为0是因为当前没有选中怪物(如上图)
![]()
通过鼠标点击怪物后enemyid的数值会变为2038,这代表那个怪物的id,也表示鼠标选中了这个怪物(如上图)
![]()
选中怪物后可以通过键盘上的按键对怪物进行攻击,攻击时会在控制面板中打印攻击信息(如上图)
![]()
怪物血量归零时就会消失,之后服务器会在原本的位置重新刷出来一只怪物
登录功能流程详解
在实现登录功能之前先来看一下登录的总体流程,下面是按照游戏开发的规范画的UML时序图,它主要表现了客户端跟服务器的交互流程
![]()
![]()
大型商业项目的服务器通常不是一个服务器,而是一组服务器,其中的每一种服务器可能有多个服务器来支撑系统功能,比如登陆服务器在处理一百万人同时登录时肯定不是一台服务器处理,而是由多台服务器同时处理
客户端登录流程
1,显示启动动画
2,客户端进行初始化
3,登录账号
在登录时客户端会向服务器发出登录请求,这个请求会由登陆服务器来处理
4,账号查询
登陆服务器需要通过账号数据库服务器来查询这个账号是否已经注册,如果没有注册就会在账号数据库服务器里注册一个
5,登录成功
账号查询完以后会有登录成功与登录失败两种情况,登录成功时会将玩家账号登录到网关服务器
游戏服务器可以分成登录服务器和处理游戏业务的服务器,登录服务器在登录完以后就不再跟用户打交道,之后会由网关服务器来处理客户端发送的跟游戏相关的事件
6,登录失败
登录失败时会给客户端返回登录失败结果
7,请求版本文件
向资源更新服务器请求资源版本信息,资源更新服务器会返回最新版本的资源的相关信息
8,返回版本号,版本号内的文件信息
资源更新服务器返回的最新版本的资源相关信息包括了资源版本号和版本内的所有文件信息
9,客户端版本文件与服务器做对比
用服务器版本文件跟客户端版本文件做比对,如果发现有一些内容需要更新,就会进入第十个步骤
10,下载更新(异步)
从资源更新服务器下载更新资源,这是一个异步的操作,可以一边下载资源一边在客户端UI上提示当前下载信息
12,资源替换
得到更新完以后的服务器版本资源后,就需要把客户端旧版本资源替换成新版本资源,
13,资源解压
通过对资源进行解压得到最新的资源后就登陆成功了
登陆功能实现
在Unity场景里创建一个空对象,名叫TotaMgr,也就是总管(如下图)
![]()
为TotaMgr添加一个REMian组件,这是客户端与服务器通信的主要组件,它既能支持KCP通信也能支持TCP通信,也就是说它即支持了MMO游戏开发,也支持帧同步对战游戏开发
添加完这个组件后客户端就能与服务器进行通信了
![]()
这个Demo里已经定义好了客户端与服务器的通讯协议,名叫Login,,登录时可以像调用的方法一样发送协议到服务器
Login有三个参数,第一个参数是登录时的账号,第二个参数是用户密码,第三个参数是登录时的一些额外信息,这里用三个问号表示,因为这个信息是可以按照自己的需求来传递的(如下图)
![]()
接下来开始编写TotaMgr的脚本
创建TotaMgr脚本,并把它拖到TotaMgr对象上
![]()
因为这个Demo里已经将客户端与服务器进行登录通讯的协议定义好了,所以TotaMgr脚本里只需要进行一些简单的操作就可以了
public class TotalMgr : MonoBehaviour{ public void Start(){ // 把TotalMgr脚本注册为登录结果的接受者 RayEngine.Event.registerOut("onConnectionState", this, "onConnectionState"); } public void onConnectionState(bool ok){ Debug.log($"onConnectionState({ok})"); } public void OnGUI(){ if(GUILayout.Button("Login")) { Debug.log("你点击了登录按钮"); // 给服务器发送登录消息 RayEngine.Event.fireIn("login", "111111", "111111", System.Text.Encoding.UTF8.GetBytes("91make.ke.qq.com")); } }}
写完脚本后运行游戏就可以在Game面板左上角显示Login按钮了,点击按钮时会向服务器发送登录请求,并在控制面板中打印是否登录成功(详细代码讲解可以点击原文链接查看)
写在最后
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源
本文要带大家学习的是如何运用商业游戏中的服务器架构快速的开发一款MMO游戏,我们会结合项目中用到的技术来给大家讲解商业MMO游戏中的服务器架构实现原理
版权声明
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源
目标和效果(演示效果非最终效果)
登陆效果演示
这是我们的Demo场景,在游戏运行时游戏的服务器也会同步运行,点击Game窗口右上角的Login按钮时会使用默认的账号密码登陆并打印日志信息
角色的创建与选择
登录之后可以点击Game窗口右上角的第二个按钮会打印出当前角色列表,上图中可以看到当前获取到的玩家列表的元素个数是零个,也就是说现在还没有创建玩家,或者没有角色列表
创建一个玩家
点击Game窗口右上角的第三个按钮创建角色,创建角色时客户端会向服务器提出创建角色请求,服务器会给客户端返回一个结果
创建角色时会从我们的机构名称幽梦创客随机选择其中一个字来作为这个角色的名字(如下图)
可以看到这里随机出的角色名是梦,而且这个角色在服务器上会存储一个编号,也就是name前的dbid,程序中一般不用字符串来作为识别这个人的编号,因为名字可能重名而编号不可能重名
得到角色的数据库id后就可以用这个id进行角色登录
点击第四个按钮就可以使用已创建的角色进行登陆了
游戏效果
上面就是此Demo的游戏画面了,虽然看上去有点简陋但该有的功能是一点都不少的
角色移动
角色传送
怪物巡逻
NPC对话
通过使用鼠标点击NPC可以触发对话并打印到控制台,之后我们会使用Unity的UGUI来把NPC的对话和对话选项显示到客户端的窗口上
怪物战斗
Game窗口左上角的enemyid代表当前要攻击的怪物的id,现在为0是因为当前没有选中怪物(如上图)
通过鼠标点击怪物后enemyid的数值会变为2038,这代表那个怪物的id,也表示鼠标选中了这个怪物(如上图)
选中怪物后可以通过键盘上的按键对怪物进行攻击,攻击时会在控制面板中打印攻击信息(如上图)
怪物血量归零时就会消失,之后服务器会在原本的位置重新刷出来一只怪物
登录功能流程详解
在实现登录功能之前先来看一下登录的总体流程,下面是按照游戏开发的规范画的UML时序图,它主要表现了客户端跟服务器的交互流程
大型商业项目的服务器通常不是一个服务器,而是一组服务器,其中的每一种服务器可能有多个服务器来支撑系统功能,比如登陆服务器在处理一百万人同时登录时肯定不是一台服务器处理,而是由多台服务器同时处理
客户端登录流程
1,显示启动动画
2,客户端进行初始化
3,登录账号
在登录时客户端会向服务器发出登录请求,这个请求会由登陆服务器来处理
4,账号查询
登陆服务器需要通过账号数据库服务器来查询这个账号是否已经注册,如果没有注册就会在账号数据库服务器里注册一个
5,登录成功
账号查询完以后会有登录成功与登录失败两种情况,登录成功时会将玩家账号登录到网关服务器
游戏服务器可以分成登录服务器和处理游戏业务的服务器,登录服务器在登录完以后就不再跟用户打交道,之后会由网关服务器来处理客户端发送的跟游戏相关的事件
6,登录失败
登录失败时会给客户端返回登录失败结果
7,请求版本文件
向资源更新服务器请求资源版本信息,资源更新服务器会返回最新版本的资源的相关信息
8,返回版本号,版本号内的文件信息
资源更新服务器返回的最新版本的资源相关信息包括了资源版本号和版本内的所有文件信息
9,客户端版本文件与服务器做对比
用服务器版本文件跟客户端版本文件做比对,如果发现有一些内容需要更新,就会进入第十个步骤
10,下载更新(异步)
从资源更新服务器下载更新资源,这是一个异步的操作,可以一边下载资源一边在客户端UI上提示当前下载信息
12,资源替换
得到更新完以后的服务器版本资源后,就需要把客户端旧版本资源替换成新版本资源,
13,资源解压
通过对资源进行解压得到最新的资源后就登陆成功了
登陆功能实现
在Unity场景里创建一个空对象,名叫TotaMgr,也就是总管(如下图)
为TotaMgr添加一个REMian组件,这是客户端与服务器通信的主要组件,它既能支持KCP通信也能支持TCP通信,也就是说它即支持了MMO游戏开发,也支持帧同步对战游戏开发
添加完这个组件后客户端就能与服务器进行通信了
这个Demo里已经定义好了客户端与服务器的通讯协议,名叫Login,,登录时可以像调用的方法一样发送协议到服务器
Login有三个参数,第一个参数是登录时的账号,第二个参数是用户密码,第三个参数是登录时的一些额外信息,这里用三个问号表示,因为这个信息是可以按照自己的需求来传递的(如下图)
接下来开始编写TotaMgr的脚本
创建TotaMgr脚本,并把它拖到TotaMgr对象上
因为这个Demo里已经将客户端与服务器进行登录通讯的协议定义好了,所以TotaMgr脚本里只需要进行一些简单的操作就可以了
public class TotalMgr : MonoBehaviour{ public void Start(){ // 把TotalMgr脚本注册为登录结果的接受者 RayEngine.Event.registerOut("onConnectionState", this, "onConnectionState"); } public void onConnectionState(bool ok){ Debug.log($"onConnectionState({ok})"); } public void OnGUI(){ if(GUILayout.Button("Login")) { Debug.log("你点击了登录按钮"); // 给服务器发送登录消息 RayEngine.Event.fireIn("login", "111111", "111111", System.Text.Encoding.UTF8.GetBytes("91make.ke.qq.com")); } }}
写完脚本后运行游戏就可以在Game面板左上角显示Login按钮了,点击按钮时会向服务器发送登录请求,并在控制面板中打印是否登录成功(详细代码讲解可以点击原文链接查看)
写在最后
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源