本教程内容来源于UWA的字母哥,基于ET6编写,本教程将其整理成了图文,还有很多可以直接复制的源码,写博客不易还望多多支持
ET框架源码地址https://github.com/egametang/ET
将需要gate网关转发的消息称之为actlocation消息
接下来我们将使用login用例来初步使用网络通讯消息
进入demo/Proto/
编写OuterMessage.proto
普通消息协议,在这个测试中,我们需要向服务器发送登录请求,服务器验证登录消息然后向客户端回复结果,若登陆成功客户端向服务器发送Hello
,当客户端退出登录时又会向服务器发送GoodBye
//Irequest注释:标识该消息需要服务器回复
//C2R 由客户端直接发送给服务器
message C2R_LoginTest //IRequest
{
int32 RpcID=90; //若需要服务器回复就必须加这个变量,标识固定是90.如果不需要服务器回复就不需要这个变量
string Account=1;
string Password=2;
}
//IResponse:标识改消息是用来回复客户端请求的
//R2C 由服务器直接发送给客户端
message R2C_LoginTest //IResponse
{
int32 RpcID=90;
int32 Error=91;
string Message=92;
//前三条消息是必须要有的
string GateAddress=1; //网关地址
string key=2;
}
//IMessage:不需要回复的消息标识
message C2R_SayHello //IMessage
{
string Hello = 1;
}
message C2R_SayGoodBye //IMessage
{
string GoodBye = 1;
}
目录内的其它协议
InnerMessage.poto——用于服务器内部进行通讯的消息定义
MongoMessage.poto——也是服务器于服务器之间进行通讯用的,于innerMessage最大的区别在于MongoMessage可以用来传送Entity实体的消息定义文件
OuterMessage.poto——用来定义服务器于客户端进行直连通讯的消息
编写完成后执行该目录下的win_startProtoExport.bat来编译生成消息协议实体,输出proto2cs succeed!字样后代表运行成功
打开Demo的源代码,在Client-Server项目中可以找到LoginHelper类,在这里,我们新建一个静态LoginTest方法
public static async ETTask LoginTest(Scene zoneScene,string addrs){
Session session =null; //登录会话
R2C_LoginTest r2CLogintTest = null;
try{
try{
//从zoneScene中获取当前的网络会话
session = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint());
{
//Call:服务器处理完之后会回复消息的消息则使用call请求
//发送登录请求
r2CLogintTest=(R2C_LoginTest) await session.Call(new C2R_LoginTest(){Account="".Password=""});
Log.Debug(r2CLoginTest.key);
//Send:发送消息而不需要回复的消息传递方法
//向服务器发送Hello消息
session.Send(new C2R_SayHello(){Hello="Hello Server!"})
//等待两秒,用于其它请求的响应
await TimerComponent.instance.WaitAsync(2000);
}
}finally{
session?.Dispose(); //断开会话
}
}catch(Exception e){
Log.Error(e.ToString())
}
}
在Server项目下的Server.Hotfix/Demo下添加一个新目录Login
,在该目录下创建C2R_LoginTestHandler,其命名空间在ET下,继承自AMRpcHandler<Message,Message>
namespace ET
{
[Messagehandle]
public class C2R_LoginTestHandle : AMRpcHandler<C2R_LoginTest,R2C_LoginTest>{
//AMRpcHandler接口的虚方法
protected override async ETTask Run(Session session, C2R_LoginTest request,R2C_Logintest response,Action reply){
Response.key="1111";//定义消息的具体参数
replay();//服务器向服务端发回一条消息
await ETTask.CompletedTask();
}
}
}
在Server/server.Hotfix/Demo/Login下新建类C2R_SayHello
namespace ET{
//AMHandler<Message>只负责发送消息
[MessageHandler]
public class C2R_SayHello : AMHandler<C2R_SayHello>
{
protected override async ETTask Run(Session session,C2R_SayHello message)
{
log.Debug(message.Hello);
session.Send(new R2C_SayGoodBye(){GoodBye="GoodBye"});
await ETTask.CompletedTask();
}
}
}
Client-Server/server.Hotfix/Demo/Login下新建R2C_SayGoodByeHandler
namespace ET{
[MessageHandler]
public class R2C_SayGoodByeHandler : AMHandler<R2C_SayGoodBye>
{
protected override async ETTask Run(Session session,R2C_SayGoodBye message){
log.Debug(message.GoodBye);
await ETTask.CompletedTask();
}
}
}
Client-Server/Unity.Hotfix/Codes/Hotfixview/Demo/UI/uiLogin下编写UILoginComponentSystem.cs/UILoginComponentSystem/OnLogin
先注释掉该方法原来的代码,我们重新用LoginTest写一遍
public static void OnLogin(this UILoginComponent self){
LoginHelper.LoginTest(self.DomainScene(),ConstValue.LoginAddress).Coroutine();
}
右键Client-Server编译项目,然后启动Server.app
在unity项目内,在顶部导航栏选择Tools/buildDebug编译源代码
启动游戏
查看Demo/Logs内的目录文件,查看debug(最底下)
通过上述案例,我们学习了如何使用et框架进行客户端与服务器的通讯,可以是Gate网关也可以是Realm网关,若是需要gate服务器转发到Map服务器的消息就被称之为Actor消息
下一节课:Actor消息模型