From f357a9c3a16d3fc5f792d515a0e22144bb0ad4fe Mon Sep 17 00:00:00 2001 From: xianyi Date: Wed, 15 Oct 2025 11:03:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=951?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameClient/GameClientMatchmaker.cs | 8 +- .../Scripts/Network/NetworkMessaging.cs | 102 +++++++++++++++--- 2 files changed, 92 insertions(+), 18 deletions(-) diff --git a/Assets/TcgEngine/Scripts/GameClient/GameClientMatchmaker.cs b/Assets/TcgEngine/Scripts/GameClient/GameClientMatchmaker.cs index 6c72400..57fd953 100644 --- a/Assets/TcgEngine/Scripts/GameClient/GameClientMatchmaker.cs +++ b/Assets/TcgEngine/Scripts/GameClient/GameClientMatchmaker.cs @@ -63,7 +63,7 @@ namespace TcgEngine.Client match_timer += Time.deltaTime; //Send periodic request - if (IsConnected() && timer > 2f) + if (IsConnected() && TcgNetwork.Get().ClientID != 0 && timer > 2f) { timer = 0f; SendMatchRequest(true, matchmaking_group, matchmaking_players); @@ -118,7 +118,7 @@ namespace TcgEngine.Client { Connect(NetworkData.Get().url, NetworkData.Get().port, (bool success) => { - if(success) + if (success) SendMatchmakingListRequest(); }); } @@ -132,10 +132,10 @@ namespace TcgEngine.Client }); } - public void Connect(string url, ushort port, UnityAction callback=null) + public void Connect(string url, ushort port, UnityAction callback = null) { //Must be logged in to API to connect - if(!Authenticator.Get().IsSignedIn()) + if (!Authenticator.Get().IsSignedIn()) { callback?.Invoke(false); return; diff --git a/Assets/TcgEngine/Scripts/Network/NetworkMessaging.cs b/Assets/TcgEngine/Scripts/Network/NetworkMessaging.cs index d584264..c34e1df 100644 --- a/Assets/TcgEngine/Scripts/Network/NetworkMessaging.cs +++ b/Assets/TcgEngine/Scripts/Network/NetworkMessaging.cs @@ -112,13 +112,44 @@ namespace TcgEngine Send(type, target, writer, delivery); writer.Dispose(); } - + public void SendObject(string type, ulong target, T data, NetworkDelivery delivery) where T : INetworkSerializable { - FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); - writer.WriteNetworkSerializable(data); - Send(type, target, writer, delivery); - writer.Dispose(); + Debug.Log("=== SendObject 开始 ==="); + Debug.Log("SendObject 步骤1: 参数检查 - type: " + type + " target: " + target + " data: " + data + " delivery: " + delivery); + + // 增加初始缓冲区大小,特别是对于包含字符串的对象 + int initialSize = 1024; // 从 256 增加到 1024 + Debug.Log("SendObject 步骤2: 创建 FastBufferWriter,初始大小: " + initialSize + ", 最大大小: " + TcgNetwork.MsgSizeMax); + FastBufferWriter writer = new FastBufferWriter(initialSize, Allocator.Temp, TcgNetwork.MsgSizeMax); + + try + { + Debug.Log("SendObject 步骤3: 序列化数据到 writer"); + writer.WriteNetworkSerializable(data); + Debug.Log("SendObject 步骤4: 序列化完成,writer 当前位置: " + writer.Position + ", 总长度: " + writer.Length); + + // 检查是否超出最大大小 + if (writer.Length > TcgNetwork.MsgSizeMax) + { + Debug.LogError("SendObject 错误: 消息大小 " + writer.Length + " 超出最大限制 " + TcgNetwork.MsgSizeMax); + writer.Dispose(); + return; + } + + Debug.Log("SendObject 步骤5: 调用 Send 方法"); + Send(type, target, writer, delivery); + } + catch (System.Exception e) + { + Debug.LogError("SendObject 序列化失败: " + e.Message); + } + finally + { + Debug.Log("SendObject 步骤6: 释放 writer 资源"); + writer.Dispose(); + } + Debug.Log("=== SendObject 结束 ==="); } //--------- Send Multi ---------- @@ -187,12 +218,12 @@ namespace TcgEngine writer.Dispose(); } } - + public void SendObject(string type, IReadOnlyList targets, T data, NetworkDelivery delivery) where T : INetworkSerializable { if (IsServer) { - FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); + FastBufferWriter writer = new FastBufferWriter(1024, Allocator.Temp, TcgNetwork.MsgSizeMax); writer.WriteNetworkSerializable(data); Send(type, targets, writer, delivery); writer.Dispose(); @@ -270,7 +301,7 @@ namespace TcgEngine { if (IsServer) { - FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); + FastBufferWriter writer = new FastBufferWriter(1024, Allocator.Temp, TcgNetwork.MsgSizeMax); writer.WriteNetworkSerializable(data); SendAll(type, writer, delivery); writer.Dispose(); @@ -281,10 +312,24 @@ namespace TcgEngine public void Send(string type, ulong target, FastBufferWriter writer, NetworkDelivery delivery) { + Debug.Log("=== Send 方法开始 ==="); + Debug.Log("Send 步骤1: 检查网络状态 - IsOnline: " + IsOnline + ", target: " + target + ", ClientID: " + ClientID); + if (IsOnline) + { + Debug.Log("Send 步骤2: 在线模式,调用 SendOnline"); SendOnline(type, target, writer, delivery); - else if(target == ClientID) + } + else if (target == ClientID && ClientID != 0) + { + Debug.Log("Send 步骤2: 离线模式且目标是自己,调用 SendOffline"); SendOffline(type, writer); + } + else + { + Debug.Log("Send 步骤2: 离线模式但目标不是自己,跳过发送"); + } + Debug.Log("=== Send 方法结束 ==="); } public void Send(string type, IReadOnlyList targets, FastBufferWriter writer, NetworkDelivery delivery) @@ -302,7 +347,23 @@ namespace TcgEngine private void SendOnline(string type, ulong target, FastBufferWriter writer, NetworkDelivery delivery) { - network.NetworkManager.CustomMessagingManager.SendNamedMessage(type, target, writer, delivery); + Debug.Log("=== SendOnline 方法开始 ==="); + Debug.Log("SendOnline 步骤1: 参数验证 - type: " + type + " target: " + target + " delivery: " + delivery); + Debug.Log("SendOnline 步骤2: 检查 NetworkManager 状态 - 是否为 null: " + (network.NetworkManager == null)); + Debug.Log("SendOnline 步骤3: 检查 CustomMessagingManager 状态 - 是否为 null: " + (network.NetworkManager?.CustomMessagingManager == null)); + Debug.Log("SendOnline 步骤4: 准备发送消息,writer 长度: " + writer.Length); + + try + { + Debug.Log("SendOnline 步骤5: 调用 Unity Netcode 的 SendNamedMessage"); + network.NetworkManager.CustomMessagingManager.SendNamedMessage(type, target, writer, delivery); + Debug.Log("SendOnline 步骤6: 消息发送成功"); + } + catch (System.Exception e) + { + Debug.LogError("SendOnline 步骤6: 消息发送失败 - " + e.Message); + } + Debug.Log("=== SendOnline 方法结束 ==="); } private void SendOnline(string type, IReadOnlyList targets, FastBufferWriter writer, NetworkDelivery delivery) @@ -313,18 +374,31 @@ namespace TcgEngine //Just copy the message from writer to reader locally and call the callback immediately private void SendOffline(string type, FastBufferWriter writer) { + Debug.Log("=== SendOffline 方法开始 ==="); + Debug.Log("SendOffline 步骤1: 查找消息类型 '" + type + "' 的监听器"); bool found = msg_dict.TryGetValue(type, out System.Action callback); + Debug.Log("SendOffline 步骤2: 监听器查找结果 - 找到: " + found); + if (found) { + Debug.Log("SendOffline 步骤3: 创建 FastBufferReader 从 writer 复制数据"); FastBufferReader reader = new FastBufferReader(writer, Allocator.Temp); + Debug.Log("SendOffline 步骤4: 调用回调函数,ClientID: " + ClientID + ", reader 长度: " + reader.Length); callback?.Invoke(ClientID, reader); + Debug.Log("SendOffline 步骤5: 释放 reader 资源"); reader.Dispose(); + Debug.Log("SendOffline 步骤6: 离线消息处理完成"); } + else + { + Debug.Log("SendOffline 步骤3: 未找到消息类型 '" + type + "' 的监听器,跳过处理"); + } + Debug.Log("=== SendOffline 方法结束 ==="); } //--------- Forward msgs ---------- - - //Forward a client message to one client + + //Forward a client message to one client //Make sure you finished reading the reader before forwarding public void Forward(string type, ulong target, FastBufferReader reader, NetworkDelivery delivery) { @@ -373,7 +447,7 @@ namespace TcgEngine foreach (ulong client in ClientList) { - if(client != source_client && client != ClientID) + if (client != source_client && client != ClientID) network.NetworkManager.CustomMessagingManager.SendNamedMessage(type, client, writer, delivery); } writer.Dispose(); @@ -391,7 +465,7 @@ namespace TcgEngine } public IReadOnlyList ClientList { get { return network.GetClientsIds(); } } - public bool IsOnline { get { return network.IsOnline; } } + public bool IsOnline { get { return network.IsOnline && network.ClientID != 0; } } public bool IsServer { get { return network.IsServer; } } public ulong ServerID { get { return network.ServerID; } } public ulong ClientID { get { return network.ClientID; } }