diff --git a/Src/Core/Kcp/KcpNetClient.cs b/Src/Core/Kcp/KcpNetClient.cs index 86c6703..42ea7e5 100644 --- a/Src/Core/Kcp/KcpNetClient.cs +++ b/Src/Core/Kcp/KcpNetClient.cs @@ -170,8 +170,16 @@ namespace BITKit.Net var id = reader.ReadInt32(); try { - var value = BITBinary.Read(reader); - _p2p.TryAdd(id,value); + if (reader.ReadBoolean()) + { + var value = BITBinary.Read(reader); + _p2p.TryAdd(id,value); + } + else + { + var message = reader.ReadString(); + _p2p.TryAdd(id,new Exception(message)); + } } catch (Exception e) { @@ -189,21 +197,30 @@ namespace BITKit.Net { throw new NotImplementedException($"未找到对应的方法:{commandObj.GetType().FullName}"); } - - var value = await func.As>>().Invoke(commandObj); using var _ms = new MemoryStream(); using var _writer = new BinaryWriter(_ms); _writer.Write((byte)NetCommandType.ReturnToServer); _writer.Write(requestId); - BITBinary.Write(_writer, value); - var _bytes = _ms.ToArray(); - commandQueue.Enqueue(_bytes); + try + { + var value = await func.As>>().Invoke(commandObj); + + _writer.Write(true); + BITBinary.Write(_writer, value); + var _bytes = _ms.ToArray(); + commandQueue.Enqueue(_bytes); + } + catch (Exception e) + { + BIT4Log.LogException(e); + _writer.Write(false); + _writer.Write(e.Message); + } } catch(Exception e) { BIT4Log.LogException(e); } - break; default: BIT4Log.Log($"未知消息类型:{type},字节:{(byte)type}"); @@ -280,6 +297,10 @@ namespace BITKit.Net if (_p2p.TryRemove(id, out var value)) { + if (value is Exception e) + { + throw e; + } return (T)value; } await Task.Delay(100); diff --git a/Src/Core/Kcp/KcpNetServer.cs b/Src/Core/Kcp/KcpNetServer.cs index 6499be4..7bf77cb 100644 --- a/Src/Core/Kcp/KcpNetServer.cs +++ b/Src/Core/Kcp/KcpNetServer.cs @@ -189,36 +189,59 @@ namespace BITKit.Net server.Send(Id,new byte[]{(byte)NetCommandType.Ping},channel); break; case NetCommandType.GetFromServer: + { + var requestId = reader.ReadInt32(); + var commandObj = BITBinary.Read(reader); + + using var _ms = new MemoryStream(); + using var _writer = new BinaryWriter(_ms); + _writer.Write((byte)NetCommandType.ReturnToClient); + _writer.Write(requestId); + try { - var requestId = reader.ReadInt32(); - var commandObj = BITBinary.Read(reader); - - if (_rpc.TryGetValue(commandObj.GetType().FullName, out var func) is false) + if (_rpc.TryGetValue(commandObj.GetType()!.FullName!, out var func) is false) { - throw new NotImplementedException($"未找到对应的方法:{commandObj.GetType().FullName}"); + _writer.Write(false); + _writer.Write("未找到对应的Rpc方法"); + } + else + { + try + { + var value = await func.As>>().Invoke(commandObj); + _writer.Write(true); + BITBinary.Write(_writer, value); + } + catch (Exception e) + { + BIT4Log.LogException(e); + _writer.Write(false); + _writer.Write(e.Message); + } } - - var value =await func.As>>().Invoke(commandObj); - using var _ms = new MemoryStream(); - using var _writer = new BinaryWriter(_ms); - _writer.Write((byte)NetCommandType.ReturnToClient); - _writer.Write(requestId); - BITBinary.Write(_writer,value); var _bytes = _ms.ToArray(); - server.Send(Id,_bytes,KcpChannel.Reliable); + server.Send(Id, _bytes, KcpChannel.Reliable); } catch (Exception e) { BIT4Log.LogException(e); - Send(Id,NetCommandType.ReturnToClient,-1,0); } + } break; case NetCommandType.ReturnToServer: { var id = reader.ReadInt32(); - var value = BITBinary.Read(reader); - _p2p.TryAdd(id, value); + if (reader.ReadBoolean()) + { + var value = BITBinary.Read(reader); + _p2p.TryAdd(id, value); + } + else + { + var message = reader.ReadString(); + _p2p.TryAdd(id, new Exception(message)); + } } break; default: @@ -274,6 +297,10 @@ namespace BITKit.Net if (_p2p.TryRemove(index, out var value)) { + if (value is Exception e) + { + throw e; + } return (T)value; } await Task.Delay(100); diff --git a/Src/UnityEditor/ScriptableObjectGroupEditor.cs b/Src/UnityEditor/ScriptableObjectGroupEditor.cs index d7284da..27446e9 100644 --- a/Src/UnityEditor/ScriptableObjectGroupEditor.cs +++ b/Src/UnityEditor/ScriptableObjectGroupEditor.cs @@ -15,6 +15,7 @@ namespace BITKit.GameEditor public class ScriptableObjectGroupEditor : EditorWindow where T : ScriptableObject { protected virtual string AssetsPath => $"Assets/Artists/"; + protected virtual string ExportPathKey => $"{typeof(T).Name}.ExportPath"; protected readonly List List=new(); private ListView _listView; @@ -105,15 +106,26 @@ namespace BITKit.GameEditor private void ExportData() { - var exportPath = EditorUtility.OpenFolderPanel("select path", "",typeof(T).FullName); + var path = Environment.CurrentDirectory; + + if (PlayerPrefs.HasKey(ExportPathKey)) + { + path = PlayerPrefs.GetString(ExportPathKey); + } + + var exportPath = EditorUtility.SaveFilePanel("select path", path, $"{typeof(T).Name}.bytes", "bytes"); if(string.IsNullOrEmpty(exportPath))return; + PlayerPrefs.SetString(ExportPathKey, exportPath); + PlayerPrefs.Save(); + ExportData(exportPath); + } protected virtual void ExportData(string path) { - + throw new NotImplementedException($"暂未实现{typeof(T).Name}的导出功能"); } protected virtual void ItemsChosen(IEnumerable obj)