diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper.meta new file mode 100644 index 00000000..2410227b --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9de71dee8e9fb74469064a1e1cf7a77b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs new file mode 100644 index 00000000..52e5bc63 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs @@ -0,0 +1,13 @@ +namespace TEngine.Runtime +{ + public abstract class CSPacketBase : PacketBase + { + public override PacketType PacketType + { + get + { + return PacketType.ClientToServer; + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs.meta new file mode 100644 index 00000000..3811dce3 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae0dc3216c53aaa4bb05456c6acc64f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs new file mode 100644 index 00000000..5690669f --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs @@ -0,0 +1,13 @@ +namespace TEngine.Runtime +{ + public sealed class CSPacketHeader : PacketHeaderBase + { + public override PacketType PacketType + { + get + { + return PacketType.ClientToServer; + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs.meta new file mode 100644 index 00000000..00eff30f --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/CSPacketHeader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 383e04755715b054f9e57b1ab1d322af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs new file mode 100644 index 00000000..23522103 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs @@ -0,0 +1,255 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using ProtoBuf; +using ProtoBuf.Meta; + +namespace TEngine.Runtime +{ + public class NetworkChannelHelper : INetworkChannelHelper + { + private readonly Dictionary m_ServerToClientPacketTypes = new Dictionary(); + private readonly MemoryStream m_CachedStream = new MemoryStream(1024 * 8); + private INetworkChannel m_NetworkChannel = null; + + /// + /// 获取消息包头长度。 + /// + public int PacketHeaderLength => sizeof(int); + + /// + /// 初始化网络频道辅助器。 + /// + /// 网络频道。 + public void Initialize(INetworkChannel networkChannel) + { + m_NetworkChannel = networkChannel; + + // 反射注册包和包处理函数。 + Type packetBaseType = typeof(SCPacketBase); + Type packetHandlerBaseType = typeof(PacketHandlerBase); + Assembly assembly = Assembly.GetExecutingAssembly(); + Type[] types = assembly.GetTypes(); + for (int i = 0; i < types.Length; i++) + { + if (!types[i].IsClass || types[i].IsAbstract) + { + continue; + } + + if (types[i].BaseType == packetBaseType) + { + PacketBase packetBase = (PacketBase)Activator.CreateInstance(types[i]); + Type packetType = GetServerToClientPacketType(packetBase.Id); + if (packetType != null) + { + Log.Warning("Already exist packet type '{0}', check '{1}' or '{2}'?.", packetBase.Id.ToString(), packetType.Name, packetBase.GetType().Name); + continue; + } + + m_ServerToClientPacketTypes.Add(packetBase.Id, types[i]); + } + else if (types[i].BaseType == packetHandlerBaseType) + { + IPacketHandler packetHandler = (IPacketHandler)Activator.CreateInstance(types[i]); + m_NetworkChannel.RegisterHandler(packetHandler); + } + } + + NetEvent.Instance.Subscribe(NetworkConnectedEventArgs.EventId, OnNetworkConnected); + NetEvent.Instance.Subscribe(NetworkClosedEventArgs.EventId, OnNetworkClosed); + NetEvent.Instance.Subscribe(NetworkMissHeartBeatEventArgs.EventId, OnNetworkMissHeartBeat); + NetEvent.Instance.Subscribe(NetworkErrorEventArgs.EventId, OnNetworkError); + NetEvent.Instance.Subscribe(NetworkCustomErrorEventArgs.EventId, OnNetworkCustomError); + } + + /// + /// 准备进行连接。 + /// + public void PrepareForConnecting() + { + m_NetworkChannel.Socket.ReceiveBufferSize = 1024 * 64; + m_NetworkChannel.Socket.SendBufferSize = 1024 * 64; + } + + /// + /// 发送心跳消息包。 + /// + /// 是否发送心跳消息包成功。 + public bool SendHeartBeat() + { + m_NetworkChannel.Send(MemoryPool.Acquire()); + return true; + } + + /// + /// 序列化消息包。 + /// + /// 消息包类型。 + /// 要序列化的消息包。 + /// 要序列化的目标流。 + /// 是否序列化成功。 + public bool Serialize(T packet, Stream destination) where T : Packet + { + PacketBase packetImpl = packet as PacketBase; + if (packetImpl == null) + { + Log.Warning("Packet is invalid."); + return false; + } + + if (packetImpl.PacketType != PacketType.ClientToServer) + { + Log.Warning("Send packet invalid."); + return false; + } + + m_CachedStream.SetLength(m_CachedStream.Capacity); // 此行防止 Array.Copy 的数据无法写入 + m_CachedStream.Position = 0L; + + CSPacketHeader packetHeader = MemoryPool.Acquire(); + Serializer.Serialize(m_CachedStream, packetHeader); + MemoryPool.Release(packetHeader); + + Serializer.SerializeWithLengthPrefix(m_CachedStream, packet, PrefixStyle.Fixed32); + MemoryPool.Release((IMemory)packet); + + m_CachedStream.WriteTo(destination); + return true; + } + + /// + /// 反序列化消息包。 + /// + /// 消息包头。 + /// 要反序列化的来源流。 + /// 用户自定义错误数据。 + /// 反序列化后的消息包。 + public Packet DeserializePacket(IPacketHeader packetHeader, Stream source, out object customErrorData) + { + // 注意:此函数并不在主线程调用! + customErrorData = null; + + SCPacketHeader scPacketHeader = packetHeader as SCPacketHeader; + if (scPacketHeader == null) + { + Log.Warning("Packet header is invalid."); + return null; + } + + Packet packet = null; + if (scPacketHeader.IsValid) + { + Type packetType = GetServerToClientPacketType(scPacketHeader.Id); + if (packetType != null) + { + packet = (Packet)RuntimeTypeModel.Default.DeserializeWithLengthPrefix(source, MemoryPool.Acquire(packetType), packetType, PrefixStyle.Fixed32, 0); + } + else + { + Log.Warning("Can not deserialize packet for packet id '{0}'.", scPacketHeader.Id.ToString()); + } + } + else + { + Log.Warning("Packet header is invalid."); + } + + MemoryPool.Release(scPacketHeader); + return packet; + } + + public IPacketHeader DeserializePacketHeader(Stream source, out object customErrorData) + { + // 注意:此函数并不在主线程调用! + customErrorData = null; + return (IPacketHeader)RuntimeTypeModel.Default.Deserialize(source, MemoryPool.Acquire(), typeof(SCPacketHeader)); + } + + private Type GetServerToClientPacketType(int id) + { + Type type = null; + if (m_ServerToClientPacketTypes.TryGetValue(id, out type)) + { + return type; + } + return null; + } + + /// + /// 关闭并清理网络频道辅助器。 + /// + public void Shutdown() + { + NetEvent.Instance.Unsubscribe(NetworkConnectedEventArgs.EventId, OnNetworkConnected); + NetEvent.Instance.Unsubscribe(NetworkClosedEventArgs.EventId, OnNetworkClosed); + NetEvent.Instance.Unsubscribe(NetworkMissHeartBeatEventArgs.EventId, OnNetworkMissHeartBeat); + NetEvent.Instance.Unsubscribe(NetworkErrorEventArgs.EventId, OnNetworkError); + NetEvent.Instance.Unsubscribe(NetworkCustomErrorEventArgs.EventId, OnNetworkCustomError); + + m_NetworkChannel = null; + } + + #region Handle + private void OnNetworkConnected(object sender, GameEventArgs e) + { + NetworkConnectedEventArgs ne = (NetworkConnectedEventArgs)e; + if (ne.NetworkChannel != m_NetworkChannel) + { + return; + } + Log.Info("Network channel '{0}' connected, local address '{1}', remote address '{2}'.", ne.NetworkChannel.Name, ne.NetworkChannel.Socket.LocalEndPoint.ToString(), ne.NetworkChannel.Socket.RemoteEndPoint.ToString()); + } + + private void OnNetworkClosed(object sender, GameEventArgs e) + { + NetworkClosedEventArgs ne = (NetworkClosedEventArgs)e; + if (ne.NetworkChannel != m_NetworkChannel) + { + return; + } + Log.Info("Network channel '{0}' closed.", ne.NetworkChannel.Name); + } + + private void OnNetworkMissHeartBeat(object sender, GameEventArgs e) + { + NetworkMissHeartBeatEventArgs ne = (NetworkMissHeartBeatEventArgs)e; + if (ne.NetworkChannel != m_NetworkChannel) + { + return; + } + + Log.Info("Network channel '{0}' miss heart beat '{1}' times.", ne.NetworkChannel.Name, ne.MissCount.ToString()); + + if (ne.MissCount < 2) + { + return; + } + ne.NetworkChannel.Close(); + } + + private void OnNetworkError(object sender, GameEventArgs e) + { + NetworkErrorEventArgs ne = (NetworkErrorEventArgs)e; + if (ne.NetworkChannel != m_NetworkChannel) + { + return; + } + + Log.Info("Network channel '{0}' error, error code is '{1}', error message is '{2}'.", ne.NetworkChannel.Name, ne.ErrorCode.ToString(), ne.ErrorMessage); + + ne.NetworkChannel.Close(); + } + + private void OnNetworkCustomError(object sender, GameEventArgs e) + { + NetworkCustomErrorEventArgs ne = (NetworkCustomErrorEventArgs)e; + if (ne.NetworkChannel != m_NetworkChannel) + { + return; + } + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs.meta new file mode 100644 index 00000000..0a65b0f1 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/NetworkChannelHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 02d761e658b2dcd4ea9ebff4ce324968 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet.meta new file mode 100644 index 00000000..0269249f --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 77278504198432741b5b1efb12e04803 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs new file mode 100644 index 00000000..5cb0056f --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs @@ -0,0 +1,19 @@ +using System; +using ProtoBuf; + +namespace TEngine.Runtime +{ + [Serializable, ProtoContract(Name = @"CSHeartBeat")] + public class CSHeartBeat : CSPacketBase + { + public CSHeartBeat() + { + } + + public override int Id => 1; + + public override void Clear() + { + } + } +} diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs.meta new file mode 100644 index 00000000..f360eefc --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/CSHeartBeat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0df96c80b0460c24fad98087851fd96c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs new file mode 100644 index 00000000..8728d203 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs @@ -0,0 +1,20 @@ +using ProtoBuf; +using System; + +namespace TEngine.Runtime +{ + [Serializable, ProtoContract(Name = @"SCHeartBeat")] + public class SCHeartBeat : SCPacketBase + { + public SCHeartBeat() + { + } + + public override int Id => 2; + + + public override void Clear() + { + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs.meta new file mode 100644 index 00000000..f0b601b4 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/Packet/SCHeartBeat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c6c67efd23a0ea49b469cde0c44f234 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs new file mode 100644 index 00000000..159d4ebd --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs @@ -0,0 +1,24 @@ +using ProtoBuf; + +namespace TEngine.Runtime +{ + public abstract class PacketBase : Packet, IExtensible + { + private IExtension m_ExtensionObject; + + public PacketBase() + { + m_ExtensionObject = null; + } + + public abstract PacketType PacketType + { + get; + } + + IExtension IExtensible.GetExtensionObject(bool createIfMissing) + { + return Extensible.GetExtensionObject(ref m_ExtensionObject, createIfMissing); + } + } +} diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs.meta new file mode 100644 index 00000000..8cdcba05 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8f72df0df1102a4493aac4a082edb0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs new file mode 100644 index 00000000..24b70660 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs @@ -0,0 +1,12 @@ +namespace TEngine.Runtime +{ + public abstract class PacketHandlerBase : IPacketHandler + { + public abstract int Id + { + get; + } + + public abstract void Handle(object sender, Packet packet); + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs.meta new file mode 100644 index 00000000..caa10e78 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHandlerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6da38694044dff944af5213c4cb2d413 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs new file mode 100644 index 00000000..9da97d0b --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs @@ -0,0 +1,36 @@ +namespace TEngine.Runtime +{ + public abstract class PacketHeaderBase : IPacketHeader, IMemory + { + public abstract PacketType PacketType + { + get; + } + + public int Id + { + get; + set; + } + + public int PacketLength + { + get; + set; + } + + public bool IsValid + { + get + { + return PacketType != PacketType.Undefined && Id > 0 && PacketLength >= 0; + } + } + + public void Clear() + { + Id = 0; + PacketLength = 0; + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs.meta new file mode 100644 index 00000000..d280b59c --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketHeaderBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 279045bf4ec72144aa03880102a04057 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs new file mode 100644 index 00000000..5e61c1ce --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs @@ -0,0 +1,20 @@ +namespace TEngine +{ + public enum PacketType : byte + { + /// + /// 未定义。 + /// + Undefined = 0, + + /// + /// 客户端发往服务器的包。 + /// + ClientToServer, + + /// + /// 服务器发往客户端的包。 + /// + ServerToClient, + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs.meta new file mode 100644 index 00000000..fe4dea65 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/PacketType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71e37d0b444a9f646984e673744d2bcf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs new file mode 100644 index 00000000..af5d18da --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs @@ -0,0 +1,49 @@ +using System.IO; + +namespace TEngine.Runtime +{ + public class ProtoUtils + { + /// + /// 序列化 MainPack -> byte[] + /// + /// + /// + /// + public static byte[] Serialize(T mainPack) where T : class + { + try + { + using (var stream = new System.IO.MemoryStream()) + { + ProtoBuf.Serializer.Serialize(stream, mainPack); + return stream.ToArray(); + } + } + catch (IOException ex) + { + Log.Error($"[Serialize] Error:{ex.Message}, {ex.Data["StackTrace"]}"); + return null; + } + } + + /// + /// 反序列化 + /// + /// + /// + /// + public static T DeSerialize(byte[] buffer) where T : class + { + try + { + return ProtoBuf.Serializer.Deserialize(typeof(T), new System.IO.MemoryStream(buffer)) as T; + } + catch (IOException ex) + { + Log.Error(($"[DeSerialize] 错误:{ex.Message}, {ex.Data["StackTrace"]}")); + return null; + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs.meta new file mode 100644 index 00000000..ebbdc4f6 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/ProtoUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ab82c8abf14856489102fe60cc78926 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs new file mode 100644 index 00000000..4fcdfce9 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs @@ -0,0 +1,13 @@ +namespace TEngine.Runtime +{ + public abstract class SCPacketBase : PacketBase + { + public override PacketType PacketType + { + get + { + return PacketType.ServerToClient; + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs.meta new file mode 100644 index 00000000..a67e7e90 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bf44767ac4b0ff43b0c6b86d8d255ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs new file mode 100644 index 00000000..b55b44e7 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs @@ -0,0 +1,13 @@ +namespace TEngine.Runtime +{ + public sealed class SCPacketHeader : PacketHeaderBase + { + public override PacketType PacketType + { + get + { + return PacketType.ServerToClient; + } + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs.meta new file mode 100644 index 00000000..57c6308d --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Helper/SCPacketHeader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2855018a5b9e3d641a4275143aed88f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: