This commit is contained in:
xianyi
2025-10-15 11:03:14 +08:00
parent bd63a8a006
commit f357a9c3a1
2 changed files with 92 additions and 18 deletions

View File

@@ -63,7 +63,7 @@ namespace TcgEngine.Client
match_timer += Time.deltaTime; match_timer += Time.deltaTime;
//Send periodic request //Send periodic request
if (IsConnected() && timer > 2f) if (IsConnected() && TcgNetwork.Get().ClientID != 0 && timer > 2f)
{ {
timer = 0f; timer = 0f;
SendMatchRequest(true, matchmaking_group, matchmaking_players); SendMatchRequest(true, matchmaking_group, matchmaking_players);
@@ -118,7 +118,7 @@ namespace TcgEngine.Client
{ {
Connect(NetworkData.Get().url, NetworkData.Get().port, (bool success) => Connect(NetworkData.Get().url, NetworkData.Get().port, (bool success) =>
{ {
if(success) if (success)
SendMatchmakingListRequest(); SendMatchmakingListRequest();
}); });
} }
@@ -132,10 +132,10 @@ namespace TcgEngine.Client
}); });
} }
public void Connect(string url, ushort port, UnityAction<bool> callback=null) public void Connect(string url, ushort port, UnityAction<bool> callback = null)
{ {
//Must be logged in to API to connect //Must be logged in to API to connect
if(!Authenticator.Get().IsSignedIn()) if (!Authenticator.Get().IsSignedIn())
{ {
callback?.Invoke(false); callback?.Invoke(false);
return; return;

View File

@@ -112,13 +112,44 @@ namespace TcgEngine
Send(type, target, writer, delivery); Send(type, target, writer, delivery);
writer.Dispose(); writer.Dispose();
} }
public void SendObject<T>(string type, ulong target, T data, NetworkDelivery delivery) where T : INetworkSerializable public void SendObject<T>(string type, ulong target, T data, NetworkDelivery delivery) where T : INetworkSerializable
{ {
FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); Debug.Log("=== SendObject 开始 ===");
writer.WriteNetworkSerializable(data); Debug.Log("SendObject 步骤1: 参数检查 - type: " + type + " target: " + target + " data: " + data + " delivery: " + delivery);
Send(type, target, writer, delivery);
writer.Dispose(); // 增加初始缓冲区大小,特别是对于包含字符串的对象
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 ---------- //--------- Send Multi ----------
@@ -187,12 +218,12 @@ namespace TcgEngine
writer.Dispose(); writer.Dispose();
} }
} }
public void SendObject<T>(string type, IReadOnlyList<ulong> targets, T data, NetworkDelivery delivery) where T : INetworkSerializable public void SendObject<T>(string type, IReadOnlyList<ulong> targets, T data, NetworkDelivery delivery) where T : INetworkSerializable
{ {
if (IsServer) if (IsServer)
{ {
FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); FastBufferWriter writer = new FastBufferWriter(1024, Allocator.Temp, TcgNetwork.MsgSizeMax);
writer.WriteNetworkSerializable(data); writer.WriteNetworkSerializable(data);
Send(type, targets, writer, delivery); Send(type, targets, writer, delivery);
writer.Dispose(); writer.Dispose();
@@ -270,7 +301,7 @@ namespace TcgEngine
{ {
if (IsServer) if (IsServer)
{ {
FastBufferWriter writer = new FastBufferWriter(256, Allocator.Temp, TcgNetwork.MsgSizeMax); FastBufferWriter writer = new FastBufferWriter(1024, Allocator.Temp, TcgNetwork.MsgSizeMax);
writer.WriteNetworkSerializable(data); writer.WriteNetworkSerializable(data);
SendAll(type, writer, delivery); SendAll(type, writer, delivery);
writer.Dispose(); writer.Dispose();
@@ -281,10 +312,24 @@ namespace TcgEngine
public void Send(string type, ulong target, FastBufferWriter writer, NetworkDelivery delivery) 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) if (IsOnline)
{
Debug.Log("Send 步骤2: 在线模式,调用 SendOnline");
SendOnline(type, target, writer, delivery); SendOnline(type, target, writer, delivery);
else if(target == ClientID) }
else if (target == ClientID && ClientID != 0)
{
Debug.Log("Send 步骤2: 离线模式且目标是自己,调用 SendOffline");
SendOffline(type, writer); SendOffline(type, writer);
}
else
{
Debug.Log("Send 步骤2: 离线模式但目标不是自己,跳过发送");
}
Debug.Log("=== Send 方法结束 ===");
} }
public void Send(string type, IReadOnlyList<ulong> targets, FastBufferWriter writer, NetworkDelivery delivery) public void Send(string type, IReadOnlyList<ulong> targets, FastBufferWriter writer, NetworkDelivery delivery)
@@ -302,7 +347,23 @@ namespace TcgEngine
private void SendOnline(string type, ulong target, FastBufferWriter writer, NetworkDelivery delivery) 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<ulong> targets, FastBufferWriter writer, NetworkDelivery delivery) private void SendOnline(string type, IReadOnlyList<ulong> 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 //Just copy the message from writer to reader locally and call the callback immediately
private void SendOffline(string type, FastBufferWriter writer) private void SendOffline(string type, FastBufferWriter writer)
{ {
Debug.Log("=== SendOffline 方法开始 ===");
Debug.Log("SendOffline 步骤1: 查找消息类型 '" + type + "' 的监听器");
bool found = msg_dict.TryGetValue(type, out System.Action<ulong, FastBufferReader> callback); bool found = msg_dict.TryGetValue(type, out System.Action<ulong, FastBufferReader> callback);
Debug.Log("SendOffline 步骤2: 监听器查找结果 - 找到: " + found);
if (found) if (found)
{ {
Debug.Log("SendOffline 步骤3: 创建 FastBufferReader 从 writer 复制数据");
FastBufferReader reader = new FastBufferReader(writer, Allocator.Temp); FastBufferReader reader = new FastBufferReader(writer, Allocator.Temp);
Debug.Log("SendOffline 步骤4: 调用回调函数ClientID: " + ClientID + ", reader 长度: " + reader.Length);
callback?.Invoke(ClientID, reader); callback?.Invoke(ClientID, reader);
Debug.Log("SendOffline 步骤5: 释放 reader 资源");
reader.Dispose(); reader.Dispose();
Debug.Log("SendOffline 步骤6: 离线消息处理完成");
} }
else
{
Debug.Log("SendOffline 步骤3: 未找到消息类型 '" + type + "' 的监听器,跳过处理");
}
Debug.Log("=== SendOffline 方法结束 ===");
} }
//--------- Forward msgs ---------- //--------- 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 //Make sure you finished reading the reader before forwarding
public void Forward(string type, ulong target, FastBufferReader reader, NetworkDelivery delivery) public void Forward(string type, ulong target, FastBufferReader reader, NetworkDelivery delivery)
{ {
@@ -373,7 +447,7 @@ namespace TcgEngine
foreach (ulong client in ClientList) 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); network.NetworkManager.CustomMessagingManager.SendNamedMessage(type, client, writer, delivery);
} }
writer.Dispose(); writer.Dispose();
@@ -391,7 +465,7 @@ namespace TcgEngine
} }
public IReadOnlyList<ulong> ClientList { get { return network.GetClientsIds(); } } public IReadOnlyList<ulong> 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 bool IsServer { get { return network.IsServer; } }
public ulong ServerID { get { return network.ServerID; } } public ulong ServerID { get { return network.ServerID; } }
public ulong ClientID { get { return network.ClientID; } } public ulong ClientID { get { return network.ClientID; } }