Unity 学习笔记#1:网络消息处理

Unity 学习笔记#1:网络消息处理

Zahkrii Lv2

添加自定义协议,实现自定义消息收发。

添加自定义协议

添加自定义 Request

前往 ..\Src\Lib\proto 打开 message.proto 文件,在 message NetMessageRequest 下添加自定义 Request. 等号后面按 1、2、3 依次摆列。

1
2
3
4
5
6
7
8
9
10
message NetMessageRequest{
/*
...
*/
MapEntitySyncRequest mapEntitySync = 8;
MapTeleportRequest mapTeleport = 9;

// 自定义消息Request
FirstTestRequest firstTest = 10;
}

空白处添加自定义 Request. 等号后面 1、2、3 依次摆列。

// Test Protocol
message FirstTestRequest {
string testMessage = 1;
//string passward = 2;
}

生成协议

前往 ..\Tools 运行 genproto.cmd,生成协议。

生成解决方案

前往服务端文件,打开解决方案,右键解决方案,**不是项目**,生成解决方案。确保成功生成 3 个项目。

拷贝必要文件

前往 ..\Src\Lib\Protocol\bin\Debug 拷贝除 .pdb 以外 3 个文件到 ..\Src\Client\Assets\References,因为客户端的协议不会自动更新,所以要手动拷贝。

使用协议实现收发消息

使用协议实现收发消息。

客户端

新建 Request.

SkillBridge.Message.FirstTestRequest firstTestRequest = new SkillBridge.Message.FirstTestRequest();
firstTestRequest.testMessage = "Hello! Test Succeed.";

打包并发送消息。

SkillBridge.Message.NetMessage msg = new SkillBridge.Message.NetMessage();
msg.Request = new SkillBridge.Message.NetMessageRequest();
msg.Request.firstTest = firstTestRequest;

NetClient.Instance.SendMessage(msg);

不要忘了首先 Init()Connect().

NetClient.Instance.Init("127.0.0.1", 8000);
NetClient.Instance.Connect();

服务端

首先在 GameServer 项目 Service 文件夹下添加专用消息处理类,如 TestService.cs.

TestService.cs 中代码如下,别忘了 using Common; 等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
internal class TestService : Singleton<TestService>
{
public void Init()
{
}

public void Start()
{
MessageDistributer<NetConnection<NetSession>>.Instance.Subscribe<FirstTestRequest>(this.OnFirstTestRequest);
}

public void Stop()
{
}

private void OnFirstTestRequest(NetConnection<NetSession> sender, FirstTestRequest request)
{
Log.InfoFormat("FirstTestRequest: Test Message: {0}", request.testMessage);
}
}

再修改 GameServer.cs 代码,修改 public bool Init() 以及 public void Start().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public bool Init()
{
network = new NetService();
network.Init(8000);
// 自定义协议消息
TestService.Instance.Init();

thread = new Thread(new ThreadStart(this.Update));

return true;
}

public void Start()
{
network.Start();
// 自定义协议消息
TestService.Instance.Start();

running = true;
thread.Start();
}

然后前往 Common 项目 Network 文件夹,修改 MessageDispatch.cs 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
public void Dispatch(T sender, SkillBridge.Message.NetMessageRequest message)
{
if (message.userRegister != null) { MessageDistributer<T>.Instance.RaiseEvent(sender,message.userRegister); }
if (message.userLogin != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.userLogin); }
if (message.createChar != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.createChar); }
if (message.gameEnter != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.gameEnter); }
if (message.gameLeave != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.gameLeave); }
if (message.mapCharacterEnter != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.mapCharacterEnter); }
if (message.mapEntitySync != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.mapEntitySync); }
if (message.mapTeleport != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.mapTeleport); }
// 自定义协议消息
if (message.firstTest != null) { MessageDistributer<T>.Instance.RaiseEvent(sender, message.firstTest); }
}

到此自定义协议消息收发完成。

  • 标题: Unity 学习笔记#1:网络消息处理
  • 作者: Zahkrii
  • 创建于 : 2022/02/02 18:04:09
  • 更新于 : 2024/06/24 23:52:02
  • 链接: https://zahkrii.github.io/2022/02/02/unity-notes-1/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。