文章目录
1. 准备事项
1.1 通过GitClone去拉取ET-EUI项目
目的是为了同步更新
同时也要创建一个自己的分支
1.2 MongoDB正确安装
1.3 Robo 3T 数据库可视化软件
Robo 3T 数据库可视化软件是用来对MongoDB数据库进行可视化的
2.数据库相关
2.1 游戏区服
游戏区服的概念就是我们有两个区,比如说区1和区2
那么这两个区对应的数据库也是不一样的,所以我们需要在这里进行配置
2.2 创建自己的数据库
由于我们的放置类游戏只需要一个区服,所以创建一个数据库即可
我们打开Robo 3T创建Database 名为ET1
然后在ET1这个数据库里面创建一个Account集合
3.定义Account账户实体
我们来思考一下,这个实体是否会被客户端使用,如果不需要,则将Account实体创建在Server的Model数据层下面
4.启用MongoDB的功能
NetKcpComponent,可以让客户端直接连接到该服务器上面
也可以接受到客户端的连接
添加数据库管理组件DBManagerComponent
Account就有了对数据库进行操作的能力
如果一个进程有多个DBManagerComponent,则会发生错乱
因为它是一个单例
所以一个服务器进程只需要一个,也就是一个区服只需要一个
所以我们可以直接在根节点Scene上面挂载一个,然后整个进程都可以用了
DBManagerComponent
5.配置Excel
我们添加Account的服务器
插入一行,表示我们的账号服务器
这里为什么Location和Map都没有外网端口呢?因为都不需要连接客户端,只需要连接服务器端就行。比如Location连接Gate,然后Map也连接Gate
6. 查看服务器是否添加成功
编译项目
导表
运行服务器,发现log里面提示创建成功
Scene的类型 Scene的名字 Scene的ID Scene的InstanceID Scene所属的进程
7. 普通消息的编写
这里的Token代表的是用户令牌,AccountId是账户的唯一标识
令牌就是用于账号服务器的连接,就是验证码
然后就是导表
代码逻辑编写
我们来理一下登录的流程:
1.定义Protobuf里面消息
2.在客户端发送登录消息
3.在服务器处理登录消息,然后返回消息
4.客户端拿到服务器返回的消息,执行下一步操作
8.编写服务器处理消息代码
我们在Serveer下面的Hotfix代码里面创建Account文件夹,表示是Account服务器处理文件夹,我们所有服务器上面和Account相关的都放在这个下面。然后我们创建Handler文件夹,专门用来处理消息
我们编写对C2A_LoginAccount消息的处理函数,留到下一节去写具体的事件
9.修改客户端的登录方法
我们在登录的逻辑层修改登录的逻辑
我们通过ErrorCode来告诉显示层,调用是否成功
当显示层调用Login这个逻辑层代码的时候,可以通过拿到的返回值来知道是否登录成功
public static async ETTask<int> Login(Scene zoneScene, string address, string account, string password)
{
A2C_LoginAccount a2C_LoginAccount =null;
Session accountSession = null;
try
{
//我们从zoneScene上面获取NetKcpComponent的IP地址,通过这个来创建一个新的Session
accountSession = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(address));
//发送一条登录消息给服务器 拿到服务器的返回消息
a2C_LoginAccount = (A2C_LoginAccount)await accountSession.Call(
new C2A_LoginAccount() {AccountName=account,Password=password});
}
catch (Exception e)
{
//如果出错
accountSession?.Dispose(); //关掉session
Log.Error(e.ToString()); //debug error
return ErrorCode.ERR_NetWorkError; //返回错误码,提示登录失败
}
//如果错误码不是成功的话
if (a2C_LoginAccount.Error != ErrorCode.ERR_Success)
{
accountSession?.Dispose();
return a2C_LoginAccount.Error; //返回Error
}
//如果成功,则将session保留给zoneScene,作为通讯的接口
zoneScene.AddComponent<SessionComponent>().Session = accountSession;
return ErrorCode.ERR_Success;