From a2f9cb4963ad4f1ea8b785a34c2d05b0ba73ae78 Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Tue, 17 Oct 2023 13:05:31 +0800 Subject: + net object test --- "Documents/\350\265\204\346\226\231.xlsx" | Bin 2453852 -> 2522393 bytes .../MultiplayerToolkit/Backend/Wrap/NetClient.cs | 18 +- .../MultiplayerToolkit/Backend/Wrap/NetServer.cs | 24 +- .../Assets/MultiplayerToolkit/NetObject.cs | 7 +- .../MultiplayerToolkit/Test/TestNetObject.meta | 8 + .../Test/TestNetObject/TestNeObject.unity | 542 +++++++++++++++++++++ .../Test/TestNetObject/TestNeObject.unity.meta | 7 + .../Test/TestNetObject/TestNetObjectClient.cs | 63 +++ .../Test/TestNetObject/TestNetObjectClient.cs.meta | 11 + .../Test/TestNetObject/TestNetObjectCube.cs | 25 + .../Test/TestNetObject/TestNetObjectCube.cs.meta | 11 + .../Test/TestNetObject/TestNetObjectHost.cs | 85 ++++ .../Test/TestNetObject/TestNetObjectHost.cs.meta | 11 + .../Test/TestNetObject/TestNetObjectServer.cs | 124 +++++ .../Test/TestNetObject/TestNetObjectServer.cs.meta | 11 + .../Test/TestWrap/TestWrapClient.cs | 12 +- .../Test/TestWrap/TestWrapServer.cs | 7 + .../ProjectSettings/ProjectSettings.asset | 2 +- .../ProjectSettings/TimelineSettings.asset | 16 + 19 files changed, 951 insertions(+), 33 deletions(-) create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject.meta create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity.meta create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs.meta create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs.meta create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs.meta create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs create mode 100644 MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs.meta create mode 100644 MultiplayerToolkit/ProjectSettings/TimelineSettings.asset diff --git "a/Documents/\350\265\204\346\226\231.xlsx" "b/Documents/\350\265\204\346\226\231.xlsx" index f390a9a..52af55a 100644 Binary files "a/Documents/\350\265\204\346\226\231.xlsx" and "b/Documents/\350\265\204\346\226\231.xlsx" differ diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetClient.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetClient.cs index be0f772..e894cc7 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetClient.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetClient.cs @@ -28,6 +28,22 @@ namespace MultiplayerToolkit.Backend.Wrap public IPAddress remoteUdpIP; public int remoteUdpPort; + public static NetClientSetting Get(IPAddress remoteTcpIP, int remoteTcpPort, IPAddress remoteUdpIP, int remoteUdpPort) + { + NetClientSetting setting = new NetClientSetting(); + setting.tcpLocalIp = IPAddress.Any; + setting.tcpLocalPort = 0; // 随机生成 + setting.udpLocalIp = IPAddress.Any; + setting.udpLocalPort = 0;// 随机生成 + + setting.remoteTcpIP = remoteTcpIP; + setting.remoteTcpPort = remoteTcpPort; + setting.remoteUdpIP = remoteUdpIP; + setting.remoteUdpPort = remoteUdpPort; + + return setting; + } + } public class TcpConnection @@ -150,7 +166,7 @@ namespace MultiplayerToolkit.Backend.Wrap byte[] buffer = result.Buffer; if(onReceiveData != null) { - onReceiveData(buffer, buffer.Length, ESendOption.Reliable); + onReceiveData(buffer, buffer.Length, ESendOption.Unreliable); } } } diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetServer.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetServer.cs index 7c09bbe..8cd94ad 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetServer.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Backend/Wrap/NetServer.cs @@ -30,6 +30,7 @@ namespace MultiplayerToolkit.Backend.Wrap private UdpClient m_UdpClient; // server UdpClient private IPEndPoint m_UdpEndPoint; + public IPEndPoint udpEndpoint { get { return m_UdpEndPoint; } } private bool m_IsTcpBind; public bool isTcpBind { get { return m_IsTcpBind; } } @@ -54,7 +55,6 @@ namespace MultiplayerToolkit.Backend.Wrap { m_UdpClient = server; m_UdpEndPoint = udpEndPoint; - ReceiveUdpAsync(); } public void Disconnect() @@ -70,14 +70,16 @@ namespace MultiplayerToolkit.Backend.Wrap m_UdpEndPoint = null; } - public bool IsBindWith(TcpClient client) + public bool IsBindWithTcp(TcpClient client) { return m_TcpClient == client; } - public bool IsBindWith(IPEndPoint udpEP) + public bool IsBindWithUdp(IPEndPoint udpEP) { - return m_UdpEndPoint == udpEP; + if (m_UdpEndPoint == null || udpEP == null) + return false; + return m_UdpEndPoint.ToString() == udpEP.ToString(); } private async void ReceiveTcpAsync() @@ -102,16 +104,6 @@ namespace MultiplayerToolkit.Backend.Wrap } } - private async void ReceiveUdpAsync() - { - while (true) - { - UdpReceiveResult result = await m_UdpClient.ReceiveAsync(); - byte[] buffer = result.Buffer; - OnReceiveData(buffer, result.Buffer.Length); - } - } - private async void SendUdpData(byte[] data, int offset, int length) { try @@ -186,13 +178,13 @@ namespace MultiplayerToolkit.Backend.Wrap IPEndPoint ep = new IPEndPoint(setting.tcpLocalIP, setting.tcpLocalPort); m_TcpListener = new TcpListener(ep); m_TcpListener.Start(); - LogNet.Log("TcpListener on " + setting.tcpLocalIP.ToString() + ":" + setting.tcpLocalPort); + LogNet.Log("TcpListener on " + ((IPEndPoint)m_TcpListener.Server.LocalEndPoint).Address.ToString() + ":" + ((IPEndPoint)m_TcpListener.Server.LocalEndPoint).Port); ListenTcp(); // UDP IPEndPoint localEP = new IPEndPoint(setting.udpLocalIP, setting.udpLocalPort); m_UdpClient = new UdpClient(localEP); - LogNet.Log("UdpClient on " + setting.udpLocalIP.ToString() + ":" + setting.udpLocalPort); + LogNet.Log("UdpListener on " + ((IPEndPoint)m_UdpClient.Client.LocalEndPoint).Address.ToString() + ":" + ((IPEndPoint)m_UdpClient.Client.LocalEndPoint).Port); ListenUdp(); } diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/NetObject.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/NetObject.cs index 0734b64..8d1091a 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/NetObject.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/NetObject.cs @@ -29,12 +29,11 @@ namespace MultiplayerToolkit public int ownerId; // 如果是玩家本身,表明这个物体对应的玩家 - public abstract void HandleRpc(byte callId, MessageReader reader); + public abstract void HandleRpc(byte callId, Packet reader); - public abstract bool Serialize(MessageWriter writer, bool initialState); - - public abstract void Deserialize(MessageReader reader, bool initialState); + public abstract bool Serialize(Packet writer, bool initialState); + public abstract void Deserialize(Packet reader, bool initialState); public int CompareTo(NetObject other) diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject.meta new file mode 100644 index 0000000..29530c2 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26719ba94d9a81b488463384da838a0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity new file mode 100644 index 0000000..75aa4c5 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity @@ -0,0 +1,542 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &22240160 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 22240161} + - component: {fileID: 22240162} + m_Layer: 0 + m_Name: Client + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &22240161 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 22240160} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94249153, y: 2.0594454, z: -1.0593891} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &22240162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 22240160} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 41cd5956bb4bd7449a9390d41a33cd14, type: 3} + m_Name: + m_EditorClassIdentifier: + cube: {fileID: 0} +--- !u!1 &306321770 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 306321771} + - component: {fileID: 306321773} + - component: {fileID: 306321772} + m_Layer: 0 + m_Name: Host + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &306321771 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306321770} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94249153, y: 2.0594454, z: -1.0593891} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &306321772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306321770} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 36ca53b38c957254ebbe51e1c6d49482, type: 3} + m_Name: + m_EditorClassIdentifier: + cube: {fileID: 1417017923} +--- !u!114 &306321773 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306321770} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56626dc70cbae3a4d8f18b957f050aab, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &777111706 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 777111708} + - component: {fileID: 777111707} + - component: {fileID: 777111709} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &777111707 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777111706} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &777111708 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777111706} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &777111709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777111706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 1 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} +--- !u!1 &1417017918 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1417017922} + - component: {fileID: 1417017921} + - component: {fileID: 1417017920} + - component: {fileID: 1417017919} + - component: {fileID: 1417017923} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &1417017919 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417017918} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1417017920 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417017918} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1417017921 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417017918} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1417017922 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417017918} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 10, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1417017923 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417017918} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3825dac70149a094fa4f7474889769ed, type: 3} + m_Name: + m_EditorClassIdentifier: + netId: 0 + amOwner: 0 + dirtyBits: 0 + sendOption: 0 + ownerId: 0 +--- !u!1 &1829339243 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1829339246} + - component: {fileID: 1829339245} + - component: {fileID: 1829339244} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1829339244 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829339243} + m_Enabled: 1 +--- !u!20 &1829339245 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829339243} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1829339246 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829339243} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity.meta new file mode 100644 index 0000000..894226d --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNeObject.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0230fe7329dff88449b47a4a8125a3cd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs new file mode 100644 index 0000000..b368526 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs @@ -0,0 +1,63 @@ +using MultiplayerToolkit.Backend.Wrap; +using MultiplayerToolkit; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// 玩家 +public class TestNetObjectClient : MonoBehaviour +{ + NetClient client; + + public NetObject cube; + + private void Start() + { + NetClientSetting setting = NetClientSetting.Get(TestNetObjectsConstant.serverIP, TestNetObjectsConstant.serverTcpPort, TestNetObjectsConstant.serverIP, TestNetObjectsConstant.serverUdpPort); + + client = new NetClient(); + client.onReceiveData += OnRecvData; + + ConnectServer(setting); + } + + private async void ConnectServer(NetClientSetting setting) + { + await client.ConnectToServer(setting); + + Packet packet = Packet.GetWritablePacket(); + packet.WriteString("hello, world"); + packet.WriteQuaternion(Quaternion.identity); + + client.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), ESendOption.Reliable); + } + + private void OnRecvData(byte[] data, int len, ESendOption sendOption) + { + Packet packet = Packet.GetReadablePacket(data, 0, len); + if (sendOption == ESendOption.Reliable) + { + if (packet.GetUnreadLength() >= 4) + { + int value = packet.ReadInt(); + if (value == 51825) // hello + { + int id = packet.ReadInt(); + Packet echo = Packet.GetWritablePacket(); + echo.WriteInt((int)51825); + echo.WriteInt(id); + echo.WriteString("UDP haloha"); + client.SendData(echo.ToArray(), 0, echo.GetWritableBufferLength(), ESendOption.Unreliable); + return; + } + } + } + + int msg = packet.ReadInt(); + if(msg == 253) + { + cube.Deserialize(packet, false); + } + + } +} diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs.meta new file mode 100644 index 0000000..e60708f --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41cd5956bb4bd7449a9390d41a33cd14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs new file mode 100644 index 0000000..ab892c6 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs @@ -0,0 +1,25 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using MultiplayerToolkit; + +public class TestNetObjectCube : NetObject +{ + public override void Deserialize(Packet reader, bool initialState) + { + Vector3 pos = reader.ReadVector3(); + transform.position = pos; + } + + public override void HandleRpc(byte callId, Packet reader) + { + } + + public override bool Serialize(Packet writer, bool initialState) + { + //writer.WriteInt(21538052); + writer.WriteVector3(transform.position); + + return false; + } +} diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs.meta new file mode 100644 index 0000000..74756cb --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3825dac70149a094fa4f7474889769ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs new file mode 100644 index 0000000..287fc15 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs @@ -0,0 +1,85 @@ +using MultiplayerToolkit.Backend.Wrap; +using MultiplayerToolkit; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System.Threading.Tasks; + +// 主机 +public class TestNetObjectHost : MonoBehaviour +{ + + public NetObject cube; + + NetClient client; + + bool connected = false; + + private async void Start() + { + await Task.Delay(1000); + + NetClientSetting setting = NetClientSetting.Get(TestNetObjectsConstant.serverIP, TestNetObjectsConstant.serverTcpPort, TestNetObjectsConstant.serverIP, TestNetObjectsConstant.serverUdpPort); + + client = new NetClient(); + client.onReceiveData += OnRecvData; + + ConnectServer(setting); + } + + private async void ConnectServer(NetClientSetting setting) + { + await client.ConnectToServer(setting); + + Packet packet = Packet.GetWritablePacket(); + packet.WriteString("hello, world"); + packet.WriteQuaternion(Quaternion.identity); + + client.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), ESendOption.Reliable); + } + + private void OnRecvData(byte[] data, int len, ESendOption sendOption) + { + Packet packet = Packet.GetReadablePacket(data, 0, len); + if (sendOption == ESendOption.Reliable) + { + if (packet.GetUnreadLength() >= 4) + { + int value = packet.ReadInt(); + if (value == 51825) // hello + { + int id = packet.ReadInt(); + Packet echo = Packet.GetWritablePacket(); + echo.WriteInt((int)51825); + echo.WriteInt(id); + echo.WriteString("UDP haloha"); + client.SendData(echo.ToArray(), 0, echo.GetWritableBufferLength(), ESendOption.Unreliable); + connected = true; + Debug.Log("connected"); + return; + } + } + } + + } + + void SendPacket(Packet packet, ESendOption option) + { + client.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), option); + } + + private void FixedUpdate() + { + if (!connected) + return; + + if(cube != null) + { + Packet write = Packet.GetWritablePacket(); + write.WriteInt(253); + cube.Serialize(write, false); + SendPacket(write, ESendOption.Unreliable); + } + } + +} diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs.meta new file mode 100644 index 0000000..c3e0b3d --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36ca53b38c957254ebbe51e1c6d49482 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs new file mode 100644 index 0000000..d4fcf58 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs @@ -0,0 +1,124 @@ +using MultiplayerToolkit.Backend.Wrap; +using MultiplayerToolkit; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using UnityEngine; +using UnityEditor.UI; + +public static class TestNetObjectsConstant +{ + public static IPAddress serverIP = IPAddress.Loopback; + public static int serverTcpPort = 34543; + public static int serverUdpPort = 34545; +} + +// 服务器 +public class TestNetObjectServer : MonoBehaviour +{ + NetServer server; + + public class Player + { + private static int IdCount = 1; + + public int id; + + public NetMember member; + + public Player() + { + member = new NetMember(); + this.id = Interlocked.Increment(ref IdCount); + } + } + + private List playerList = new List(); + + void Start() + { + NetServerSetting setting = new NetServerSetting(); + setting.tcpLocalIP = IPAddress.Any; + setting.tcpLocalPort = 34543; + setting.udpLocalIP = IPAddress.Any; + setting.udpLocalPort = 34545; + + server = new NetServer(); + server.onNewTcpClient += OnNewTcpClient; + server.onUdpReceiveData += OnUdpReceiveData; + + server.Start(setting); + } + + private void OnNewTcpClient(TcpClient client) + { + //TestReceive(client); + Player player = new Player(); + player.member.BindTcpClient(client); + player.member.onReceiveData += OnRecvData; + playerList.Add(player); + + // welcome + Packet hello = Packet.GetWritablePacket(); + hello.WriteInt((int)51825); // magic number s + hello.WriteInt((int)player.id); + player.member.SendData(hello.ToArray(), 0, hello.GetWritableBufferLength(), ESendOption.Reliable); + } + + private void OnRecvData(byte[] data, int len) + { + Packet packet = Packet.GetReadablePacket(data); + string str = packet.ReadString(); + Debug.Log(str); + } + + private void BroadcastToAll(Packet packet, ESendOption option) + { + for (int i = 0; i < playerList.Count; ++i) + { + playerList[i].member.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), option); + } + } + + private void OnUdpReceiveData(UdpReceiveResult result) + { + IPEndPoint ep = result.RemoteEndPoint; + + Player sender = playerList.Find(p => p.member.IsBindWithUdp(ep)); + if (sender != null) + { + // 处理消息 + using Packet read = Packet.GetReadablePacket(result.Buffer); + int id = read.ReadInt(); + if (id == 253) + { + using Packet write = Packet.GetWritablePacket(read); + BroadcastToAll(write, ESendOption.Unreliable); + } + return; + } + + using Packet packet = Packet.GetReadablePacket(result.Buffer, 0, result.Buffer.Length); + + if (packet.GetUnreadLength() >= 4) + { + int value = packet.ReadInt(); + if (value == 51825) // hello + { + int id = packet.ReadInt(); + string content = packet.ReadString(); + Debug.Log(id); + Debug.Log(content); + var player = playerList.Find(x => x.id == id); + if (player != null) + { + Debug.Log("BindUdpClient to " + result.RemoteEndPoint); + player.member.BindUdpClient(server.udpClient, result.RemoteEndPoint); + } + } + } + } + +} diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs.meta b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs.meta new file mode 100644 index 0000000..ee03470 --- /dev/null +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56626dc70cbae3a4d8f18b957f050aab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapClient.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapClient.cs index 4e31a68..80eb02d 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapClient.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapClient.cs @@ -12,17 +12,7 @@ public class TestWrapClient : MonoBehaviour private void Start() { - - NetClientSetting setting = new NetClientSetting(); - setting.tcpLocalIp = IPAddress.Any; - setting.tcpLocalPort = 22334; - setting.udpLocalIp = IPAddress.Any; - setting.udpLocalPort = 33445; - - setting.remoteTcpIP = IPAddress.Loopback; - setting.remoteTcpPort = 34543; - setting.remoteUdpIP = IPAddress.Loopback; - setting.remoteUdpPort = 34545; + NetClientSetting setting = NetClientSetting.Get(TestWrapConstant.serverIP, TestWrapConstant.serverTcpPort, TestWrapConstant.serverIP, TestWrapConstant.serverUdpPort); client = new NetClient(); client.onReceiveData += OnRecvData; diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapServer.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapServer.cs index c44f5b3..705354a 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapServer.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestWrap/TestWrapServer.cs @@ -9,6 +9,13 @@ using Steamworks; using System; using System.Threading; +public static class TestWrapConstant +{ + public static IPAddress serverIP = IPAddress.Loopback; + public static int serverTcpPort = 34543; + public static int serverUdpPort = 34545; +} + public class TestWrapServer : MonoBehaviour { NetServer server; diff --git a/MultiplayerToolkit/ProjectSettings/ProjectSettings.asset b/MultiplayerToolkit/ProjectSettings/ProjectSettings.asset index ad659a4..6f0a8a5 100644 --- a/MultiplayerToolkit/ProjectSettings/ProjectSettings.asset +++ b/MultiplayerToolkit/ProjectSettings/ProjectSettings.asset @@ -76,7 +76,7 @@ PlayerSettings: androidFullscreenMode: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 - runInBackground: 0 + runInBackground: 1 captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 diff --git a/MultiplayerToolkit/ProjectSettings/TimelineSettings.asset b/MultiplayerToolkit/ProjectSettings/TimelineSettings.asset new file mode 100644 index 0000000..cfaebd7 --- /dev/null +++ b/MultiplayerToolkit/ProjectSettings/TimelineSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3} + m_Name: + m_EditorClassIdentifier: + assetDefaultFramerate: 60 + m_DefaultFrameRate: 60 -- cgit v1.1-26-g67d0