From 7aa6e13205a214d66da5d7119c16797e71f234cb Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Sun, 25 Apr 2021 06:45:49 -0700 Subject: [PATCH 01/65] feat: Initial new UTP Transport wip still waiting on some packages to be published. --- .../Runtime/UTPTransport.cs | 694 ++++++++---------- .../Runtime/UTPTransport.cs.meta | 2 +- .../package.json | 10 +- testproject/Packages/manifest.json | 3 +- testproject/Packages/packages-lock.json | 50 +- .../PackageManagerSettings.asset | 8 +- .../ProjectSettings/ProjectVersion.txt | 4 +- 7 files changed, 367 insertions(+), 404 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 443e397d23..2bec79bb76 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -1,468 +1,426 @@ using System; +using System.Collections; using System.Collections.Generic; -using System.Runtime.InteropServices; - -using MLAPI.Transports; -using MLAPI.Transports.Tasks; - -using Unity.Burst; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; +using System.Threading.Tasks; using Unity.Networking.Transport; - +using Unity.Networking.Transport.Relay; +using Unity.Services.Relay; +using Unity.Services.Relay.Allocations; +using MLAPI.Transports.Tasks; using UnityEngine; -using UnityEngine.Assertions; -using NetworkEvent = Unity.Networking.Transport.NetworkEvent; -using MLAPINetworkEvent = MLAPI.Transports.NetworkEvent; +using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; +using Unity.Collections.LowLevel.Unsafe; +using Unity.Services.Relay.Models; +using System.Linq; -[StructLayout(LayoutKind.Explicit)] -public unsafe struct RawNetworkMessage -{ - [FieldOffset(0)] public int Length; - [FieldOffset(4)] public uint Type; - [FieldOffset(8)] public int Id; - [FieldOffset(12)] public byte Padding; - [FieldOffset(13)] public byte ChannelId; - [FieldOffset(14)] public fixed byte Data[NetworkParameterConstants.MTU]; -} - -[BurstCompile] -internal struct ClientUpdateJob : IJob +namespace MLAPI.Transports { - public NetworkDriver Driver; - public NativeArray Connection; - public NativeQueue PacketData; - - unsafe public void Execute() + public class UTPTransport : NetworkTransport { - if (!Connection[0].IsCreated) + public enum ProtocolType { - return; + UnityTransport, + RelayUnityTransport, } - DataStreamReader streamReader; - NetworkEvent.Type cmd; - - while ((cmd = Connection[0].PopEvent(Driver, out streamReader)) != NetworkEvent.Type.Empty) + private enum State { - if (cmd == NetworkEvent.Type.Connect) - { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = Connection[0].InternalId }; - PacketData.Enqueue(d); - } - else if (cmd == NetworkEvent.Type.Data) - { - byte channelId = streamReader.ReadByte(); - int messageSize = streamReader.ReadInt(); - - var temp = new NativeArray(messageSize, Allocator.Temp); - streamReader.ReadBytes(temp); - - var d = new RawNetworkMessage() - { - Length = messageSize, - Type = (uint)MLAPINetworkEvent.Data, - Id = Connection[0].InternalId, - ChannelId = channelId - }; - - UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length); - - PacketData.Enqueue(d); - } - else if (cmd == NetworkEvent.Type.Disconnect) - { - Connection[0] = default; - } + Disconnected, + Listening, + Connected, } - } -} -[BurstCompile] -internal struct ServerUpdateJob : IJobParallelForDefer -{ - public NetworkDriver.Concurrent Driver; - public NativeArray Connections; - public NativeQueue.ParallelWriter PacketData; + [SerializeField] private ProtocolType m_ProtocolType; + [SerializeField] private int m_MessageBufferSize; + [SerializeField] private string m_ServerAddress = "127.0.0.1"; + [SerializeField] private ushort m_ServerPort = 7777; + [SerializeField] private int m_RelayMaxPlayers = 10; - private unsafe void QueueMessage(ref DataStreamReader streamReader, int index) - { - byte channelId = streamReader.ReadByte(); - int messageSize = streamReader.ReadInt(); - - var temp = new NativeArray(messageSize, Allocator.Temp); - streamReader.ReadBytes(temp); + private State m_State = State.Disconnected; + private NetworkDriver m_Driver; + private List m_NetworkParameters; + private byte[] m_MessageBuffer; + private string m_RelayJoinCode; + private ulong m_ServerClientId; + + public override ulong ServerClientId => m_ServerClientId; - // Debug.Log($"Server: Got a message {channelId} {messageSize} "); + public string RelayJoinCode => m_RelayJoinCode; - var d = new RawNetworkMessage() + private void InitDriver() { - Length = messageSize, - Type = (uint)MLAPINetworkEvent.Data, - Id = index, - ChannelId = channelId - }; - - UnsafeUtility.MemCpy(d.Data, temp.GetUnsafePtr(), d.Length); - PacketData.Enqueue(d); - } + if (m_NetworkParameters.Count > 0) + m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); + else + m_Driver = NetworkDriver.Create(); + } - public unsafe void Execute(int index) - { - DataStreamReader streamReader; - Assert.IsTrue(Connections[index].IsCreated); + private void DisposeDriver() + { + if (m_Driver.IsCreated) + m_Driver.Dispose(); + } - NetworkEvent.Type command; - while ((command = Driver.PopEventForConnection(Connections[index], out streamReader)) != NetworkEvent.Type.Empty) + private IEnumerator ClientBindAndConnect(SocketTask task) { - if (command == NetworkEvent.Type.Data) - { - QueueMessage(ref streamReader, index); - } - else if (command == NetworkEvent.Type.Connect) + var serverEndpoint = default(NetworkEndPoint); + + if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = index }; - PacketData.Enqueue(d); + var joinTask = RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(m_RelayJoinCode))); + + while(!joinTask.IsCompleted) + yield return null; + + if (joinTask.IsFaulted) + { + Debug.LogError("Join Relay request failed"); + task.IsDone = true; + task.Success = false; + yield break; + } + + var allocation = joinTask.Result.Data.Allocation; + + serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); +#if RELAY_BIGENDIAN + // TODO: endianess of Relay server does not match + var allocationIdArray = allocation.AllocationId.ToByteArray(); + Array.Reverse(allocationIdArray, 0, 4); + Array.Reverse(allocationIdArray, 4, 2); + Array.Reverse(allocationIdArray, 6, 2); + var allocationId = RelayAllocationId.FromByteArray(allocationIdArray); +#else + var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationId.ToByteArray()); +#endif + + // TODO: workaround for receiving 271 bytes in connection data + var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData.Take(255).ToArray()); + var hostConnectionData = RelayConnectionData.FromByteArray(allocation.HostConnectionData.Take(255).ToArray()); + var key = RelayHMACKey.FromByteArray(allocation.Key); + + Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); + + Debug.Log($"client: {allocation.AllocationId}"); + + var relayServerData = new RelayServerData(serverEndpoint, 0, allocationId, connectionData, hostConnectionData, key); + relayServerData.ComputeNewNonce(); + + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); } - else if (command == NetworkEvent.Type.Disconnect) + else { - var d = new RawNetworkMessage() { Length = 0, Type = (uint)MLAPINetworkEvent.Disconnect, Id = index }; - PacketData.Enqueue(d); - Connections[index] = default; + serverEndpoint = NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort); } - } - } -} -[BurstCompile] -internal struct ServerUpdateConnectionsJob : IJob -{ - public NetworkDriver Driver; - public NativeList Connections; - public NativeQueue.ParallelWriter PacketData; + InitDriver(); - public void Execute() - { - // Clean up connections - for (int i = 0; i < Connections.Length; i++) - { - if (!Connections[i].IsCreated) + if (m_Driver.Bind(NetworkEndPoint.AnyIpv4) != 0) { - Connections.RemoveAtSwapBack(i); - --i; + Debug.LogError("Client failed to bind"); } - } - // Accept new connections - NetworkConnection c; - while ((c = Driver.Accept()) != default(NetworkConnection)) - { - Connections.Add(c); - var d = new RawNetworkMessage() { Length = 0, Type = (uint)MLAPINetworkEvent.Connect, Id = c.InternalId }; - PacketData.Enqueue(d); - Debug.Log("Accepted a connection"); - } - } -} + else + { + while (!m_Driver.Bound) + { + yield return null; + } -public class UTPTransport : NetworkTransport -{ - public ushort Port = 7777; - public string Address = "127.0.0.1"; + var serverConnection = m_Driver.Connect(serverEndpoint); + m_ServerClientId = ParseClientId(serverConnection); - [Serializable] - public struct UTPChannel - { - [HideInInspector] - public byte Id; - public string Name; - public UTPDelivery Flags; - } + while (m_Driver.GetConnectionState(serverConnection) == NetworkConnection.State.Connecting) + { + yield return null; + } - public enum UTPDelivery - { - UnreliableSequenced, - ReliableSequenced, - Unreliable - } + if (m_Driver.GetConnectionState(serverConnection) == NetworkConnection.State.Connected) + { + task.Success = true; + m_State = State.Connected; + } + else + { + Debug.LogError("Client failed to connect to server"); + } + } - public NetworkDriver Driver; - public NativeList Connections; - public NativeQueue PacketData; - private NativeArray m_PacketProcessBuffer; + task.IsDone = true; + } - private JobHandle m_JobHandle; + private IEnumerator ServerBindAndListen(SocketTask task) + { + var endpoint = NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort); - private bool m_IsClient = false; - private bool m_IsServer = false; + InitDriver(); + if (m_Driver.Bind(endpoint) != 0) + { + Debug.LogError("Server failed to bind"); + } + else + { + while (!m_Driver.Bound) + { + yield return null; + } - public override ulong ServerClientId => 0; + if (m_Driver.Listen() == 0) + { + task.Success = true; + m_State = State.Listening; + } + else + { + Debug.LogError("Server failed to listen"); + } + } - public override void DisconnectLocalClient() { _ = Driver.Disconnect(Connections[0]); } - public override void DisconnectRemoteClient(ulong clientId) - { - GetUTPConnectionDetails(clientId, out uint peerId); - var con = GetConnection(peerId); - if (con != default) - { - Driver.Disconnect(con); + task.IsDone = true; } - } - private NetworkConnection GetConnection(uint id) - { - foreach (var item in Connections) + private IEnumerator StartRelayServer(SocketTask task) { - if (item.InternalId == id) + var allocationTask = RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(m_RelayMaxPlayers))); + + while(!allocationTask.IsCompleted) { - return item; + yield return null; } - } - - return default; - } - private NetworkPipeline[] m_NetworkPipelines = new NetworkPipeline[3]; - - public override void Init() - { - Driver = NetworkDriver.Create(); + if (allocationTask.IsFaulted) + { + Debug.LogError("Create allocation request failed"); + task.IsDone = true; + task.Success = false; + yield break; + } - // So we have a bunch of different pipelines we can send :D - m_NetworkPipelines[0] = Driver.CreatePipeline(typeof(NullPipelineStage)); - m_NetworkPipelines[1] = Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); - m_NetworkPipelines[2] = Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + var allocation = allocationTask.Result.Data.Allocation; - PacketData = new NativeQueue(Allocator.Persistent); - m_PacketProcessBuffer = new NativeArray(1000, Allocator.Persistent); - } + var joinCodeTask = RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocation.AllocationId))); - [BurstCompile] - public void SendToClient(NativeArray packet, ulong clientId, int index) - { - for (int i = 0; i < Connections.Length; i++) - { - if (Connections[i].InternalId != (int)clientId) + while(!joinCodeTask.IsCompleted) { - continue; + yield return null; } - var writer = Driver.BeginSend(m_NetworkPipelines[index], Connections[i]); - - if (!writer.IsCreated) + if (joinCodeTask.IsFaulted) { - continue; + Debug.LogError("Create join code request failed"); + task.IsDone = true; + task.Success = false; + yield break; } - writer.WriteBytes(packet); - - Driver.EndSend(writer); + m_RelayJoinCode = joinCodeTask.Result.Data.JoinCode; + + var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); +#if RELAY_BIGENDIAN + var allocationIdArray = allocation.AllocationId.ToByteArray(); + Array.Reverse(allocationIdArray, 0, 4); + Array.Reverse(allocationIdArray, 4, 2); + Array.Reverse(allocationIdArray, 6, 2); + var allocationId = RelayAllocationId.FromByteArray(allocationIdArray); +#else + var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationId.ToByteArray()); +#endif + // TODO: connectionData should be 255 bytes, but we are getting 16 extra bytes + var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData.Take(255).ToArray()); + var key = RelayHMACKey.FromByteArray(allocation.Key); + + var relayServerData = new RelayServerData(serverEndpoint, 0, allocationId, connectionData, connectionData, key); + relayServerData.ComputeNewNonce(); + + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); + + yield return ServerBindAndListen(task); } - } - public override unsafe void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) - { - var pipelineIndex = 0; + private bool ProcessEvent() + { + var eventType = m_Driver.PopEvent(out var networkConnection, out var reader); - GetUTPConnectionDetails(clientId, out uint peerId); + switch (eventType) + { + case UTPNetworkEvent.Type.Connect: + InvokeOnTransportEvent(NetworkEvent.Connect, + ParseClientId(networkConnection), + NetworkChannel.Internal, + default(ArraySegment), + Time.realtimeSinceStartup); + return true; + + case UTPNetworkEvent.Type.Disconnect: + InvokeOnTransportEvent(NetworkEvent.Disconnect, + ParseClientId(networkConnection), + NetworkChannel.Internal, + default(ArraySegment), + Time.realtimeSinceStartup); + return true; + + case UTPNetworkEvent.Type.Data: + var channelId = reader.ReadByte(); + var size = reader.ReadInt(); + + if (size > m_MessageBufferSize) + { + Debug.LogError("The received message does not fit into the message buffer"); + } + else + { + unsafe + { + fixed(byte* buffer = &m_MessageBuffer[0]) + { + reader.ReadBytes(buffer, size); + } + } + InvokeOnTransportEvent(NetworkEvent.Data, + ParseClientId(networkConnection), + (NetworkChannel)channelId, + new ArraySegment(m_MessageBuffer, 0, size), + Time.realtimeSinceStartup + ); + } + return true; + } - var writer = new DataStreamWriter(data.Count + 1 + 4, Allocator.Temp); - writer.WriteByte((byte)networkChannel); - writer.WriteInt(data.Count); + return false; + } - fixed (byte* dataArrayPtr = data.Array) + private void Update() { - writer.WriteBytes(dataArrayPtr, data.Count); + if (m_Driver.IsCreated) + { + m_Driver.ScheduleUpdate().Complete(); + while(ProcessEvent() && m_Driver.IsCreated); + } } - SendToClient(writer.AsNativeArray(), peerId, pipelineIndex); - } - public override MLAPINetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) - { - clientId = 0; - networkChannel = NetworkChannel.ChannelUnused; - - payload = new ArraySegment(Array.Empty()); - receiveTime = 0; - - return MLAPINetworkEvent.Nothing; - } + private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) + { + return *(ulong*)&utpConnectionId; + } - public override ulong GetCurrentRtt(ulong clientId) => 0; + private static unsafe NetworkConnection ParseClientId(ulong mlapiConnectionId) + { + return *(NetworkConnection*)&mlapiConnectionId; + } - private void Update() - { - if (m_IsServer || m_IsClient) + public void SetRelayJoinCode(string value) { - RawNetworkMessage message; - while (PacketData.TryDequeue(out message)) + if (m_State == State.Disconnected) { - var data = m_PacketProcessBuffer.Slice(0, message.Length); - unsafe - { - UnsafeUtility.MemClear(data.GetUnsafePtr(), message.Length); - UnsafeUtility.MemCpy(data.GetUnsafePtr(), message.Data, message.Length); - } - var clientId = GetMLAPIClientId((uint)message.Id, false); - - switch ((MLAPINetworkEvent)message.Type) - { - case MLAPINetworkEvent.Data: - int size = message.Length; - byte[] arr = new byte[size]; - unsafe - { - Marshal.Copy((IntPtr)message.Data, arr, 0, size); - var payload = new ArraySegment(arr); - InvokeOnTransportEvent((MLAPINetworkEvent)message.Type, clientId, (NetworkChannel)message.ChannelId, payload, Time.realtimeSinceStartup); - } - - break; - case MLAPINetworkEvent.Connect: - { - InvokeOnTransportEvent((MLAPINetworkEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); - } - break; - case MLAPINetworkEvent.Disconnect: - InvokeOnTransportEvent((MLAPINetworkEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); - break; - case MLAPINetworkEvent.Nothing: - InvokeOnTransportEvent((MLAPINetworkEvent)message.Type, clientId, NetworkChannel.ChannelUnused, new ArraySegment(), Time.realtimeSinceStartup); - break; - } + m_RelayJoinCode = value; } + } + public override void DisconnectLocalClient() + { + Debug.Assert(m_State == State.Connected, "DisconnectLocalClient should be called on a connected client"); - if (m_JobHandle.IsCompleted) + if (m_State == State.Connected) { + m_Driver.Disconnect(ParseClientId(m_ServerClientId)); + } + } - if (m_IsServer) - { - var connectionJob = new ServerUpdateConnectionsJob - { - Driver = Driver, - Connections = Connections, - PacketData = PacketData.AsParallelWriter() + public override void DisconnectRemoteClient(ulong clientId) + { + Debug.Assert(m_State == State.Connected, "DisconnectRemoteClient should be called on a listening server"); - }; + Debug.Log("Disconnecting"); - var serverUpdateJob = new ServerUpdateJob - { - Driver = Driver.ToConcurrent(), - Connections = Connections.AsDeferredJobArray(), - PacketData = PacketData.AsParallelWriter() - }; - - m_JobHandle = Driver.ScheduleUpdate(); - m_JobHandle = connectionJob.Schedule(m_JobHandle); - m_JobHandle = serverUpdateJob.Schedule(Connections, 1, m_JobHandle); - } + if (m_State == State.Listening) + { + var connection = ParseClientId(clientId); - if (m_IsClient) + if (m_Driver.GetConnectionState(connection) != NetworkConnection.State.Disconnected) { - var job = new ClientUpdateJob - { - Driver = Driver, - Connection = Connections, - PacketData = PacketData - }; - m_JobHandle = Driver.ScheduleUpdate(); - m_JobHandle = job.Schedule(m_JobHandle); + m_Driver.Disconnect(connection); } } - - m_JobHandle.Complete(); } - } - public override void Shutdown() - { - m_JobHandle.Complete(); - - if (PacketData.IsCreated) + public override ulong GetCurrentRtt(ulong clientId) { - PacketData.Dispose(); + return 0; } - if (Connections.IsCreated) + public override void Init() { - Connections.Dispose(); + Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), "MLAPI connection id size does not match UTP connection id size"); + Debug.Assert(m_MessageBufferSize > 5, "Message buffer size must be greater than 5"); + + m_NetworkParameters = new List(); + m_MessageBuffer = new byte[m_MessageBufferSize]; } - Driver.Dispose(); - m_PacketProcessBuffer.Dispose(); - } + public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + { + clientId = default; + networkChannel = default; + payload = default; + receiveTime = default; + return NetworkEvent.Nothing; + } - // This is kind of a mess! - public override SocketTasks StartClient() - { - Connections = new NativeList(1, Allocator.Persistent); - var endpoint = NetworkEndPoint.Parse(Address, Port); - Connections.Add(Driver.Connect(endpoint)); - m_IsClient = true; + public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + { + var size = data.Count + 5; - Debug.Log("StartClient"); - return SocketTask.Working.AsTasks(); - } + if (m_Driver.BeginSend(ParseClientId(clientId), out var writer, size) == 0) + { + writer.WriteByte((byte)networkChannel); + writer.WriteInt(data.Count); - public int MLAPIChannelToPipeline(UTPDelivery type) - { - switch (type) - { - case UTPDelivery.UnreliableSequenced: - return 2; - case UTPDelivery.ReliableSequenced: - return 1; - case UTPDelivery.Unreliable: - return 0; - } + unsafe + { + fixed(byte* dataPtr = &data.Array[data.Offset]) + { + writer.WriteBytes(dataPtr, data.Count); + } + } - return 0; - } + if (m_Driver.EndSend(writer) == size) + return; + } - public ulong GetMLAPIClientId(uint peerId, bool isServer) - { - if (isServer) - { - return 0; + Debug.LogError("Error sending the message"); } - else - { - return peerId + 1; - } - } - public void GetUTPConnectionDetails(ulong clientId, out uint peerId) - { - if (clientId == 0) - { - peerId = (uint)ServerClientId; - } - else + public override void Shutdown() { - peerId = (uint)clientId - 1; + DisposeDriver(); } - } - public override SocketTasks StartServer() - { - Connections = new NativeList(300, Allocator.Persistent); - var endpoint = NetworkEndPoint.Parse(Address, Port); - m_IsServer = true; + public override SocketTasks StartClient() + { + var task = SocketTask.Working; - Debug.Log("StartServer"); + StartCoroutine(ClientBindAndConnect(task)); - if (Driver.Bind(endpoint) != 0) - { - Debug.LogError("Failed to bind to port " + Port); + return task.AsTasks(); } - else + + public override SocketTasks StartServer() { - Driver.Listen(); - } + var task = SocketTask.Working; - return SocketTask.Working.AsTasks(); + switch (m_ProtocolType) + { + case ProtocolType.UnityTransport: + StartCoroutine(ServerBindAndListen(task)); + break; + case ProtocolType.RelayUnityTransport: + StartCoroutine(StartRelayServer(task)); + break; + } + + return task.AsTasks(); + } } -} +} \ No newline at end of file diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta index e97d1c3054..471eadeb6e 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fc5ef7b69296d69458910681f29471e6 +guid: 6960e84d07fb87f47956e7a81d71c4e6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index 7a2ff11620..096e480671 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -9,10 +9,12 @@ "unity" ], "dependencies": { - "com.unity.multiplayer.mlapi": "0.0.1-preview.1", - "com.unity.transport": "0.4.1-preview.1", - "com.unity.jobs":"0.2.10-preview.13" + "com.unity.multiplayer.mlapi": "0.1.0", + "com.unity.transport": "0.8.0-preview.3", + "com.unity.jobs": "0.2.10-preview.13", + "com.unity.services.relay": "0.0.1-preview.1" }, + "registry": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", "type": "library", "hideInEditor": false -} +} \ No newline at end of file diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 36af887ba2..7dfc005176 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -46,5 +46,6 @@ "testables": [ "com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp" - ] + ], + "registry": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" } diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 253421d55c..92b93c2aac 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,11 +1,11 @@ { "dependencies": { "com.unity.burst": { - "version": "1.4.1", - "depth": 2, + "version": "1.3.0-preview.12", + "depth": 3, "source": "registry", "dependencies": { - "com.unity.mathematics": "1.2.1" + "com.unity.mathematics": "1.1.0" }, "url": "https://packages.unity.com" }, @@ -17,12 +17,12 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "0.12.0-preview.13", + "version": "0.9.0-preview.6", "depth": 2, "source": "registry", "dependencies": { - "com.unity.test-framework.performance": "2.3.1-preview", - "com.unity.burst": "1.3.2" + "com.unity.test-framework.performance": "2.0.8-preview", + "com.unity.burst": "1.3.0-preview.12" }, "url": "https://packages.unity.com" }, @@ -67,7 +67,7 @@ "url": "https://packages.unity.com" }, "com.unity.mathematics": { - "version": "1.2.1", + "version": "1.1.0", "depth": 2, "source": "registry", "dependencies": {}, @@ -88,9 +88,10 @@ "depth": 0, "source": "local", "dependencies": { - "com.unity.multiplayer.mlapi": "0.0.1-preview.1", - "com.unity.transport": "0.4.1-preview.1", - "com.unity.jobs": "0.2.10-preview.13" + "com.unity.multiplayer.mlapi": "0.1.0", + "com.unity.transport": "0.8.0-preview.3", + "com.unity.jobs": "0.2.10-preview.13", + "com.unity.services.relay": "0.0.1-preview.1" } }, "com.unity.nuget.mono-cecil": { @@ -101,7 +102,7 @@ "url": "https://packages.unity.com" }, "com.unity.nuget.newtonsoft-json": { - "version": "2.0.0", + "version": "2.0.0-preview", "depth": 4, "source": "registry", "dependencies": {}, @@ -116,6 +117,20 @@ }, "url": "https://packages.unity.com" }, + "com.unity.services.relay": { + "version": "0.0.1-preview", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.nuget.newtonsoft-json": "2.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.test-framework": { "version": "1.1.24", "depth": 0, @@ -128,7 +143,7 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "2.3.1-preview", + "version": "2.0.8-preview", "depth": 3, "source": "registry", "dependencies": { @@ -158,17 +173,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.transport": { - "version": "0.4.1-preview.1", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.burst": "1.3.0", - "com.unity.collections": "0.12.0-preview.13", - "com.unity.mathematics": "1.1.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.ugui": { "version": "1.0.0", "depth": 0, diff --git a/testproject/ProjectSettings/PackageManagerSettings.asset b/testproject/ProjectSettings/PackageManagerSettings.asset index 102c612892..b01b2f8da9 100644 --- a/testproject/ProjectSettings/PackageManagerSettings.asset +++ b/testproject/ProjectSettings/PackageManagerSettings.asset @@ -12,12 +12,11 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreReleasePackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreviewPackages: 1 + m_EnablePackageDependencies: 1 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 - m_SeeAllPackageVersions: 0 - oneTimeWarningShown: 0 + oneTimeWarningShown: 1 m_Registries: - m_Id: main m_Name: @@ -42,4 +41,3 @@ MonoBehaviour: m_Scopes: - m_SelectedScopeIndex: 0 - m_LoadAssets: 0 diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 143b639ca2..c053a437f6 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.1.1f1 -m_EditorVersionWithRevision: 2021.1.1f1 (6fdc41dfa55a) +m_EditorVersion: 2020.3.4f1 +m_EditorVersionWithRevision: 2020.3.4f1 (0abb6314276a) From cd808d2100ac6b4106c9aa3ebf9c54ba65b804d6 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Sun, 25 Apr 2021 06:46:10 -0700 Subject: [PATCH 02/65] chore: forgot these files --- .../Runtime/Utilities.cs | 69 ------------------- .../Runtime/Utilities.cs.meta | 11 --- ...com.unity.multiplayer.transport.utp.asmdef | 1 - 3 files changed, 81 deletions(-) delete mode 100644 com.unity.multiplayer.transport.utp/Runtime/Utilities.cs delete mode 100644 com.unity.multiplayer.transport.utp/Runtime/Utilities.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs b/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs deleted file mode 100644 index 09058b8495..0000000000 --- a/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; - -namespace Assets.Scripts.Transport -{ - public static class Utilities - { - private static unsafe byte[] SerializeUnmanagedArray(NativeArray value) where T : unmanaged - { - var bytes = new byte[UnsafeUtility.SizeOf() * value.Length + sizeof(int)]; - fixed (byte* ptr = bytes) - { - var buf = new UnsafeAppendBuffer(ptr, bytes.Length); - buf.Add(value); - } - - return bytes; - } - - private static unsafe NativeArray DeserializeUnmanagedArray(byte[] buffer, Allocator allocator = Allocator.Temp) where T : unmanaged - { - fixed (byte* ptr = buffer) - { - var buf = new UnsafeAppendBuffer.Reader(ptr, buffer.Length); - buf.ReadNext(out var array, allocator); - return array; - } - } - - public unsafe static byte[] SerializeUnmanaged(ref T value) where T : unmanaged - { - var bytes = new byte[UnsafeUtility.SizeOf()]; - fixed (byte* ptr = bytes) - { - UnsafeUtility.CopyStructureToPtr(ref value, ptr); - } - - return bytes; - } - - public unsafe static T DeserializeUnmanaged(byte[] buffer) where T : unmanaged - { - fixed (byte* ptr = buffer) - { - UnsafeUtility.CopyPtrToStructure(ptr, out var value); - return value; - } - } - - public unsafe static T DeserializeUnmanaged(ref NativeSlice buffer) where T : unmanaged - { - int structSize = UnsafeUtility.SizeOf(); - long ptr = (long)buffer.GetUnsafePtr(); - long size = buffer.Length; - - long addr = ptr + size - structSize; - - var data = UnsafeUtility.ReadArrayElement((void*)addr, 0); - - return data; - } - } -} diff --git a/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs.meta b/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs.meta deleted file mode 100644 index 871f561f6e..0000000000 --- a/com.unity.multiplayer.transport.utp/Runtime/Utilities.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4613e18f31d730a4c908e335ae40f832 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 3671d6a15a..10cec56f55 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -3,7 +3,6 @@ "rootNamespace": "", "references": [ "Unity.Collections", - "Unity.Networking.Transport", "Unity.Jobs", "Unity.Burst", "Unity.Multiplayer.MLAPI.Runtime" From 93790cc81f494863ea3a12bb18b8eeb4f8e88045 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 27 Apr 2021 12:52:03 -0700 Subject: [PATCH 03/65] Removing registry --- com.unity.multiplayer.transport.utp/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index 096e480671..64ea2076c3 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -14,7 +14,6 @@ "com.unity.jobs": "0.2.10-preview.13", "com.unity.services.relay": "0.0.1-preview.1" }, - "registry": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", "type": "library", "hideInEditor": false } \ No newline at end of file From b6dfb8a287b70d75778321df2b78f9f92a88a158 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 4 May 2021 23:39:28 -0700 Subject: [PATCH 04/65] feat: Some UI for authenticating and setup for relay Relay SDK stuff --- .../Runtime/UTPTransport.cs | 17 ++- ...com.unity.multiplayer.transport.utp.asmdef | 7 +- .../Tests/Editor/BasicUTPTest.cs | 1 + .../package.json | 7 +- .../Assets/Scripts/RelayJoinCodeInput.cs | 29 +++++ .../Assets/Scripts/RelayJoinCodeInput.cs.meta | 11 ++ testproject/Assets/Scripts/UIController.cs | 10 ++ testproject/Packages/manifest.json | 111 ++++++++++-------- testproject/Packages/packages-lock.json | 97 ++++++++++----- .../PackageManagerSettings.asset | 37 ++++-- 10 files changed, 234 insertions(+), 93 deletions(-) create mode 100644 testproject/Assets/Scripts/RelayJoinCodeInput.cs create mode 100644 testproject/Assets/Scripts/RelayJoinCodeInput.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 2bec79bb76..0f65a10a76 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -13,6 +13,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Services.Relay.Models; using System.Linq; +using Unity.Services.Core; namespace MLAPI.Transports { @@ -36,6 +37,7 @@ private enum State [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; + [SerializeField] private string m_RelayServer = "https://relay-allocations-test.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; @@ -54,6 +56,13 @@ private void InitDriver() m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); else m_Driver = NetworkDriver.Create(); + + + if (m_ProtocolType == ProtocolType.RelayUnityTransport) + { + Unity.Services.Relay.Configuration.BasePath = m_RelayServer; + UnityServices.Initialize(); + } } private void DisposeDriver() @@ -81,7 +90,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) yield break; } - var allocation = joinTask.Result.Data.Allocation; + var allocation = joinTask.Result.Result.Data.Allocation; serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); #if RELAY_BIGENDIAN @@ -198,7 +207,7 @@ private IEnumerator StartRelayServer(SocketTask task) yield break; } - var allocation = allocationTask.Result.Data.Allocation; + var allocation = allocationTask.Result.Result.Data.Allocation; var joinCodeTask = RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocation.AllocationId))); @@ -215,7 +224,7 @@ private IEnumerator StartRelayServer(SocketTask task) yield break; } - m_RelayJoinCode = joinCodeTask.Result.Data.JoinCode; + m_RelayJoinCode = joinCodeTask.Result.Result.Data.JoinCode; var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); #if RELAY_BIGENDIAN @@ -423,4 +432,4 @@ public override SocketTasks StartServer() return task.AsTasks(); } } -} \ No newline at end of file +} diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 10cec56f55..9af1d26958 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -5,14 +5,17 @@ "Unity.Collections", "Unity.Jobs", "Unity.Burst", - "Unity.Multiplayer.MLAPI.Runtime" + "Unity.Multiplayer.MLAPI.Runtime", + "Unity.Networking.Transport", + "Unity.Services.Relay", + "Unity.Services.Core" ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": true, "overrideReferences": false, "precompiledReferences": [], - "autoReferenced": false, + "autoReferenced": true, "defineConstraints": [], "versionDefines": [], "noEngineReferences": false diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs b/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs index 1f6ca2e81a..40fabf1933 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs @@ -4,6 +4,7 @@ using UnityEngine.TestTools; using NUnit.Framework; using Unity.Networking.Transport; +using MLAPI.Transports; namespace MLAPI.UTP.RuntimeTests { diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index 64ea2076c3..ff86cf0abb 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -10,9 +10,10 @@ ], "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.3", - "com.unity.jobs": "0.2.10-preview.13", - "com.unity.services.relay": "0.0.1-preview.1" + "com.unity.transport": "0.8.0-preview.4", + "com.unity.jobs": "0.10.0-preview.18", + "com.unity.services.relay": "0.0.1-preview.2", + "com.unity.services.authentication": "0.3.1-preview" }, "type": "library", "hideInEditor": false diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs new file mode 100644 index 0000000000..34b3a31e85 --- /dev/null +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -0,0 +1,29 @@ +using UnityEngine; +using MLAPI.Transports; +using UnityEngine.UI; + +public class RelayJoinCodeInput : MonoBehaviour +{ + public UTPTransport Transport; + private InputField m_TextInput; + + private void Start() + { + m_TextInput = GetComponent(); + } + + private void Update() + { + if (m_TextInput.IsInteractable()) { + if (!string.IsNullOrEmpty(Transport.RelayJoinCode)) { + m_TextInput.text = Transport.RelayJoinCode; + m_TextInput.readOnly = true; + } + } + } + + public void SetJoinCode() + { + Transport.SetRelayJoinCode(m_TextInput.text); + } +} diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs.meta b/testproject/Assets/Scripts/RelayJoinCodeInput.cs.meta new file mode 100644 index 0000000000..981841abab --- /dev/null +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 903872102732f5c4cbdd3863de5dbc97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 2ba3376bc3..0dab408dfc 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -1,5 +1,7 @@ using UnityEngine; using MLAPI; +using Unity.Services.Core; +using Unity.Services.Authentication; public class UIController : MonoBehaviour { @@ -28,4 +30,12 @@ private void HideButtons() { ButtonsRoot.SetActive(false); } + + public async void OnSignIn() + { + await UnityServices.Initialize(); + Debug.Log("OnSignIn"); + await Authentication.SignInAnonymously(); + Debug.Log($"Logging in with PlayerID {Authentication.PlayerId}"); + } } diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 7dfc005176..4c9bb3347b 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,51 +1,64 @@ { - "dependencies": { - "com.unity.collab-proxy": "1.3.9", - "com.unity.ide.rider": "3.0.5", - "com.unity.ide.visualstudio": "2.0.7", - "com.unity.ide.vscode": "1.2.3", - "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", - "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.test-framework": "1.1.24", - "com.unity.textmeshpro": "3.0.4", - "com.unity.timeline": "1.5.2", - "com.unity.ugui": "1.0.0", - "com.unity.modules.ai": "1.0.0", - "com.unity.modules.androidjni": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.cloth": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.screencapture": "1.0.0", - "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.terrainphysics": "1.0.0", - "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.umbra": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.unitywebrequesttexture": "1.0.0", - "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vehicles": "1.0.0", - "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.wind": "1.0.0", - "com.unity.modules.xr": "1.0.0" - }, - "testables": [ - "com.unity.multiplayer.mlapi", - "com.unity.multiplayer.transport.utp" - ], - "registry": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "dependencies": { + "com.unity.collab-proxy": "1.3.9", + "com.unity.ide.rider": "3.0.5", + "com.unity.ide.visualstudio": "2.0.7", + "com.unity.ide.vscode": "1.2.3", + "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", + "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.package-validation-suite": "0.19.2-preview", + "com.unity.test-framework": "1.1.24", + "com.unity.textmeshpro": "3.0.4", + "com.unity.timeline": "1.5.2", + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + }, + "testables": [ + "com.unity.multiplayer.mlapi", + "com.unity.multiplayer.transport.utp" + ], + "scopedRegistries": [ + { + "name": "Candidate", + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", + "scopes": [ + "com.unity.transport", + "com.unity.collections", + "com.unity.services.relay", + "com.unity.services.authentication", + "com.unity.services.core", + "com.unity.jobs" + ] + } + ] } diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 92b93c2aac..fb003123e1 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,11 +1,11 @@ { "dependencies": { "com.unity.burst": { - "version": "1.3.0-preview.12", + "version": "1.5.2", "depth": 3, "source": "registry", "dependencies": { - "com.unity.mathematics": "1.1.0" + "com.unity.mathematics": "1.2.1" }, "url": "https://packages.unity.com" }, @@ -17,14 +17,13 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "0.9.0-preview.6", + "version": "1.0.0-pre.1", "depth": 2, "source": "registry", "dependencies": { - "com.unity.test-framework.performance": "2.0.8-preview", - "com.unity.burst": "1.3.0-preview.12" + "com.unity.burst": "1.5.2" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ext.nunit": { "version": "1.0.6", @@ -57,17 +56,17 @@ "url": "https://packages.unity.com" }, "com.unity.jobs": { - "version": "0.2.10-preview.13", + "version": "0.10.0-preview.18", "depth": 1, "source": "registry", "dependencies": { - "com.unity.collections": "0.9.0-preview.6", - "com.unity.mathematics": "1.1.0" + "com.unity.collections": "0.17.0-preview.18", + "com.unity.mathematics": "1.2.1" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.mathematics": { - "version": "1.1.0", + "version": "1.2.1", "depth": 2, "source": "registry", "dependencies": {}, @@ -89,9 +88,10 @@ "source": "local", "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.3", - "com.unity.jobs": "0.2.10-preview.13", - "com.unity.services.relay": "0.0.1-preview.1" + "com.unity.transport": "0.8.0-preview.4", + "com.unity.jobs": "0.10.0-preview.18", + "com.unity.services.relay": "0.0.1-preview.2", + "com.unity.services.authentication": "0.3.1-preview" } }, "com.unity.nuget.mono-cecil": { @@ -102,8 +102,8 @@ "url": "https://packages.unity.com" }, "com.unity.nuget.newtonsoft-json": { - "version": "2.0.0-preview", - "depth": 4, + "version": "2.0.0", + "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -117,11 +117,35 @@ }, "url": "https://packages.unity.com" }, + "com.unity.services.authentication": { + "version": "0.3.1-preview", + "depth": 1, + "source": "registry", + "dependencies": { + "nuget.moq": "1.0.0", + "com.unity.nuget.newtonsoft-json": "2.0.0", + "com.unity.services.core": "0.2.0-preview", + "com.unity.modules.unitywebrequest": "1.0.0" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.services.core": { + "version": "0.2.0-preview", + "depth": 2, + "source": "registry", + "dependencies": { + "nuget.moq": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.nuget.newtonsoft-json": "2.0.0" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, "com.unity.services.relay": { - "version": "0.0.1-preview", + "version": "0.0.1-preview.2", "depth": 1, "source": "registry", "dependencies": { + "com.unity.services.core": "0.2.0-preview", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", @@ -129,7 +153,7 @@ "com.unity.modules.unitywebrequestwww": "1.0.0", "com.unity.nuget.newtonsoft-json": "2.0.0" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.test-framework": { "version": "1.1.24", @@ -142,16 +166,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.test-framework.performance": { - "version": "2.0.8-preview", - "depth": 3, - "source": "registry", - "dependencies": { - "com.unity.test-framework": "1.1.0", - "com.unity.nuget.newtonsoft-json": "2.0.0-preview" - }, - "url": "https://packages.unity.com" - }, "com.unity.textmeshpro": { "version": "3.0.4", "depth": 0, @@ -173,6 +187,17 @@ }, "url": "https://packages.unity.com" }, + "com.unity.transport": { + "version": "0.8.0-preview.4", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.collections": "1.0.0-pre.1", + "com.unity.burst": "1.5.1", + "com.unity.mathematics": "1.2.1" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, "com.unity.ugui": { "version": "1.0.0", "depth": 0, @@ -182,6 +207,22 @@ "com.unity.modules.imgui": "1.0.0" } }, + "nuget.castle-core": { + "version": "1.0.1", + "depth": 3, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "nuget.moq": { + "version": "1.0.0", + "depth": 2, + "source": "registry", + "dependencies": { + "nuget.castle-core": "1.0.1" + }, + "url": "https://packages.unity.com" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/testproject/ProjectSettings/PackageManagerSettings.asset b/testproject/ProjectSettings/PackageManagerSettings.asset index b01b2f8da9..6715a68ef7 100644 --- a/testproject/ProjectSettings/PackageManagerSettings.asset +++ b/testproject/ProjectSettings/PackageManagerSettings.asset @@ -24,20 +24,43 @@ MonoBehaviour: m_Scopes: [] m_IsDefault: 1 m_Capabilities: 7 + - m_Id: scoped:Candidate + m_Name: Candidate + m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates + m_Scopes: + - com.unity.transport + - com.unity.collections + - com.unity.services.relay + - com.unity.services.authentication + - com.unity.services.core + - com.unity.jobs + m_IsDefault: 0 + m_Capabilities: 0 m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: m_ErrorMessage: m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] + m_Id: scoped:Candidate + m_Name: Candidate + m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates + m_Scopes: + - com.unity.transport + - com.unity.collections + - com.unity.services.relay + - com.unity.services.authentication + - com.unity.services.core + - com.unity.jobs m_IsDefault: 0 m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: + m_Name: Candidate + m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates m_Scopes: - - + - com.unity.transport + - com.unity.collections + - com.unity.services.relay + - com.unity.services.authentication + - com.unity.services.core + - com.unity.jobs m_SelectedScopeIndex: 0 From 2d6a393a49cae9d08ffb87266f4d3c6cbf66dc40 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 5 May 2021 12:17:45 -0700 Subject: [PATCH 05/65] feat: pushing latest stuff Pushing latest --- .../Runtime/UTPTransport.cs | 14 +++++++------- .../ProjectSettings/ProjectSettings.asset | 17 +++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 0f65a10a76..426da692bf 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -1,3 +1,5 @@ +#define RELAY_BIGENDIAN + using System; using System.Collections; using System.Collections.Generic; @@ -56,13 +58,6 @@ private void InitDriver() m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); else m_Driver = NetworkDriver.Create(); - - - if (m_ProtocolType == ProtocolType.RelayUnityTransport) - { - Unity.Services.Relay.Configuration.BasePath = m_RelayServer; - UnityServices.Initialize(); - } } private void DisposeDriver() @@ -366,6 +361,11 @@ public override void Init() m_NetworkParameters = new List(); m_MessageBuffer = new byte[m_MessageBufferSize]; + + if (m_ProtocolType == ProtocolType.RelayUnityTransport) { + Unity.Services.Relay.Configuration.BasePath = m_RelayServer; + UnityServices.Initialize(); + } } public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 56a0024c18..541de0bf6e 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -12,12 +12,12 @@ PlayerSettings: targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 - companyName: DefaultCompany + companyName: Unity Technologies productName: testproject defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} - m_ShowUnitySplashScreen: 0 + m_ShowUnitySplashScreen: 1 m_ShowUnitySplashLogo: 1 m_SplashScreenOverlayOpacity: 1 m_SplashScreenAnimation: 1 @@ -146,7 +146,7 @@ PlayerSettings: androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 applicationIdentifier: - Standalone: com.DefaultCompany.testproject + Standalone: com.UnityTechnologies.testproject buildNumber: Standalone: 0 iPhone: 0 @@ -354,7 +354,6 @@ PlayerSettings: switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 switchUseGOLDLinker: 0 - switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: switchTitleNames_0: @@ -578,7 +577,8 @@ PlayerSettings: webGLLinkerTarget: 1 webGLThreadsSupport: 0 webGLDecompressionFallback: 0 - scriptingDefineSymbols: {} + scriptingDefineSymbols: + 1: AUTHENTICATION_TESTING_STAGING_UAS;RELAY_BIGENDIAN additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -588,6 +588,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 + useReferenceAssemblies: 1 enableRoslynAnalyzers: 1 additionalIl2CppArgs: scriptingRuntimeVersion: 1 @@ -667,11 +668,11 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: + cloudProjectId: 29e7e6bb-3cf4-46ea-bdc9-b9581a9d0b47 framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: testproject + organizationId: mlapi-test cloudEnabled: 0 legacyClampBlendShapeWeights: 0 virtualTexturingSupportEnabled: 0 From 8dbad67a1194c29c17c65d4fac83752df1b87566 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 5 May 2021 15:55:25 -0700 Subject: [PATCH 06/65] chore: fixing define and changing buffer to 1024 --- com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 426da692bf..9542f7ba41 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -1,5 +1,3 @@ -#define RELAY_BIGENDIAN - using System; using System.Collections; using System.Collections.Generic; From 43cd593fe387630ae7dead3f99443ff00aaa2b41 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 5 May 2021 21:47:59 -0700 Subject: [PATCH 07/65] chore: updating package updating UTP to preview 5 with Relay ping support fixing issue with endpoint --- .../Runtime/UTPTransport.cs | 16 +++++++++++----- com.unity.multiplayer.transport.utp/package.json | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 9542f7ba41..92ada849bf 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -147,18 +147,20 @@ private IEnumerator ClientBindAndConnect(SocketTask task) { Debug.LogError("Client failed to connect to server"); } + + } task.IsDone = true; } - private IEnumerator ServerBindAndListen(SocketTask task) + private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoint) { - var endpoint = NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort); + //var endpoint = NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort); InitDriver(); - if (m_Driver.Bind(endpoint) != 0) + if (m_Driver.Bind(endPoint) != 0) { Debug.LogError("Server failed to bind"); } @@ -178,6 +180,8 @@ private IEnumerator ServerBindAndListen(SocketTask task) { Debug.LogError("Server failed to listen"); } + + } task.IsDone = true; @@ -233,12 +237,13 @@ private IEnumerator StartRelayServer(SocketTask task) var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData.Take(255).ToArray()); var key = RelayHMACKey.FromByteArray(allocation.Key); + var relayServerData = new RelayServerData(serverEndpoint, 0, allocationId, connectionData, connectionData, key); relayServerData.ComputeNewNonce(); m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); - yield return ServerBindAndListen(task); + yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); } private bool ProcessEvent() @@ -300,6 +305,7 @@ private void Update() m_Driver.ScheduleUpdate().Complete(); while(ProcessEvent() && m_Driver.IsCreated); } + } private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) @@ -420,7 +426,7 @@ public override SocketTasks StartServer() switch (m_ProtocolType) { case ProtocolType.UnityTransport: - StartCoroutine(ServerBindAndListen(task)); + StartCoroutine(ServerBindAndListen(task, NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort))); break; case ProtocolType.RelayUnityTransport: StartCoroutine(StartRelayServer(task)); diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index ff86cf0abb..09eca99a3e 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -10,7 +10,7 @@ ], "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.4", + "com.unity.transport": "0.8.0-preview.5", "com.unity.jobs": "0.10.0-preview.18", "com.unity.services.relay": "0.0.1-preview.2", "com.unity.services.authentication": "0.3.1-preview" From b3be34724c91589c91cd7f297c792220c865eb1b Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 5 May 2021 21:57:51 -0700 Subject: [PATCH 08/65] Chore: Cleanup Some cleanup --- .../Runtime/UTPTransport.cs | 2 ++ testproject/Assets/Scripts/UIController.cs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 92ada849bf..9a6ca38c8e 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -50,6 +50,8 @@ private enum State public string RelayJoinCode => m_RelayJoinCode; + public ProtocolType Protocol => m_ProtocolType; + private void InitDriver() { if (m_NetworkParameters.Count > 0) diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 0dab408dfc..aef25a07d7 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -2,11 +2,24 @@ using MLAPI; using Unity.Services.Core; using Unity.Services.Authentication; +using MLAPI.Transports; public class UIController : MonoBehaviour { public NetworkManager NetworkManager; public GameObject ButtonsRoot; + public GameObject AuthButton; + public GameObject JoinCode; + + public UTPTransport Transport; + + private void Awake() + { + if (Transport.Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { + HideButtons(); + JoinCode.SetActive(false); + } + } public void StartServer() { @@ -37,5 +50,11 @@ public async void OnSignIn() Debug.Log("OnSignIn"); await Authentication.SignInAnonymously(); Debug.Log($"Logging in with PlayerID {Authentication.PlayerId}"); + + if (Authentication.IsSignedIn) { + ButtonsRoot.SetActive(true); + JoinCode.SetActive(true); + AuthButton.SetActive(false); + } } } From 6c44ec168e0075a846617d619afe4d8181f3b649 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 5 May 2021 21:59:37 -0700 Subject: [PATCH 09/65] chore: file cleanup cleanup --- testproject/Packages/packages-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index fb003123e1..d29233978c 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -88,7 +88,7 @@ "source": "local", "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.4", + "com.unity.transport": "0.8.0-preview.5", "com.unity.jobs": "0.10.0-preview.18", "com.unity.services.relay": "0.0.1-preview.2", "com.unity.services.authentication": "0.3.1-preview" @@ -188,7 +188,7 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "0.8.0-preview.4", + "version": "0.8.0-preview.5", "depth": 1, "source": "registry", "dependencies": { From a58faef0bd07dd5bd1a1af86740e665380630df6 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 27 May 2021 23:59:16 -0700 Subject: [PATCH 10/65] fix: Make it so Relay is not a direct depenecy of MLAPI UTP Transport In order to use Relay for this transport you need to install the package into your project its no longer a dependcy --- .../Runtime/UTPTransport.cs | 23 +++++++++-- ...com.unity.multiplayer.transport.utp.asmdef | 8 +++- .../package.json | 4 +- testproject/Assets/Scenes/SampleScene.unity | 40 +++++++++++-------- testproject/Assets/Scripts.meta | 8 ++++ testproject/Assets/Scripts/UIController.cs | 7 ++++ testproject/Assets/Scripts/testproject.asmdef | 15 ++++++- 7 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 testproject/Assets/Scripts.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 9a6ca38c8e..326d0abbf5 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -4,16 +4,19 @@ using System.Threading.Tasks; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; +#if ENABLE_RELAY_SERVICE using Unity.Services.Relay; using Unity.Services.Relay.Allocations; +using Unity.Services.Relay.Models; +using Unity.Services.Core; +#endif + using MLAPI.Transports.Tasks; using UnityEngine; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; -using Unity.Services.Relay.Models; using System.Linq; -using Unity.Services.Core; namespace MLAPI.Transports { @@ -37,7 +40,7 @@ private enum State [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; - [SerializeField] private string m_RelayServer = "https://relay-allocations-test.cloud.unity3d.com"; + [SerializeField] private string m_RelayServer = "https://relay-allocations-stg.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; @@ -72,6 +75,10 @@ private IEnumerator ClientBindAndConnect(SocketTask task) if (m_ProtocolType == ProtocolType.RelayUnityTransport) { +#if !ENABLE_RELAY_SERVICE + Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); + yield return null; +#else var joinTask = RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(m_RelayJoinCode))); while(!joinTask.IsCompleted) @@ -113,6 +120,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) relayServerData.ComputeNewNonce(); m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); +#endif } else { @@ -189,8 +197,13 @@ private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoin task.IsDone = true; } + private IEnumerator StartRelayServer(SocketTask task) { +#if !ENABLE_RELAY_SERVICE + Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); + yield return null; +#else var allocationTask = RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(m_RelayMaxPlayers))); while(!allocationTask.IsCompleted) @@ -246,6 +259,7 @@ private IEnumerator StartRelayServer(SocketTask task) m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); +#endif } private bool ProcessEvent() @@ -367,11 +381,12 @@ public override void Init() m_NetworkParameters = new List(); m_MessageBuffer = new byte[m_MessageBufferSize]; - +#if ENABLE_RELAY_SERVICE if (m_ProtocolType == ProtocolType.RelayUnityTransport) { Unity.Services.Relay.Configuration.BasePath = m_RelayServer; UnityServices.Initialize(); } +#endif } public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 9af1d26958..696ebfb440 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -17,6 +17,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.services.relay", + "expression": "0.0.1-preview.3", + "define": "ENABLE_RELAY_SERVICE" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index 09eca99a3e..555885816a 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -11,9 +11,7 @@ "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", "com.unity.transport": "0.8.0-preview.5", - "com.unity.jobs": "0.10.0-preview.18", - "com.unity.services.relay": "0.0.1-preview.2", - "com.unity.services.authentication": "0.3.1-preview" + "com.unity.jobs": "0.10.0-preview.18" }, "type": "library", "hideInEditor": false diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 97db527944..995decbcaa 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 705507994} - m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641275, b: 0.5748172, a: 1} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -181,7 +181,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -440,7 +439,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -647,7 +645,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -744,7 +741,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -838,6 +834,7 @@ GameObject: - component: {fileID: 620561612} - component: {fileID: 620561611} - component: {fileID: 620561610} + - component: {fileID: 620561613} m_Layer: 0 m_Name: NetworkManager m_TagString: Untagged @@ -887,7 +884,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561610} + NetworkTransport: {fileID: 620561613} RegisteredScenes: - SampleScene AllowRuntimeSceneChanges: 0 @@ -934,6 +931,24 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &620561613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ProtocolType: 0 + m_MessageBufferSize: 0 + m_ServerAddress: 127.0.0.1 + m_ServerPort: 7777 + m_RelayMaxPlayers: 10 + m_RelayServer: https://relay-allocations-stg.cloud.unity3d.com --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -1708,7 +1723,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -1857,7 +1871,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2236,6 +2249,9 @@ MonoBehaviour: m_EditorClassIdentifier: NetworkManager: {fileID: 620561611} ButtonsRoot: {fileID: 0} + AuthButton: {fileID: 0} + JoinCode: {fileID: 0} + Transport: {fileID: 0} --- !u!1 &1345111612 GameObject: m_ObjectHideFlags: 0 @@ -2381,7 +2397,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2493,7 +2508,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2646,7 +2660,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2744,7 +2757,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2855,7 +2867,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2952,7 +2963,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -3186,7 +3196,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -3435,7 +3444,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 diff --git a/testproject/Assets/Scripts.meta b/testproject/Assets/Scripts.meta new file mode 100644 index 0000000000..791808f146 --- /dev/null +++ b/testproject/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3f222fc986b1e24580a88c62063c3bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index aef25a07d7..870352f5c5 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -1,7 +1,9 @@ using UnityEngine; using MLAPI; +#if ENABLE_RELAY_SERVICE using Unity.Services.Core; using Unity.Services.Authentication; +#endif using MLAPI.Transports; public class UIController : MonoBehaviour @@ -15,10 +17,12 @@ public class UIController : MonoBehaviour private void Awake() { +#if ENABLE_RELAY_SERVICE if (Transport.Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { HideButtons(); JoinCode.SetActive(false); } +#endif } public void StartServer() @@ -44,8 +48,10 @@ private void HideButtons() ButtonsRoot.SetActive(false); } + public async void OnSignIn() { +#if ENABLE_RELAY_SERVICE await UnityServices.Initialize(); Debug.Log("OnSignIn"); await Authentication.SignInAnonymously(); @@ -56,5 +62,6 @@ public async void OnSignIn() JoinCode.SetActive(true); AuthButton.SetActive(false); } +#endif } } diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 8ad2974762..7f51bf3cd5 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -1,7 +1,18 @@ { "name": "TestProject", + "rootNamespace": "", "references": [ "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Multiplayer.MLAPI.Editor" - ] + "Unity.Multiplayer.MLAPI.Editor", + "Unity.Multiplayer.Transport.UTP" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From b92259cf9498b5173d54068799e36e28add7f028 Mon Sep 17 00:00:00 2001 From: Cristian Mazo Date: Fri, 4 Jun 2021 14:46:31 -0500 Subject: [PATCH 11/65] Re-enable Relay Transport on Sample project --- .../Runtime/UTPTransport.cs | 7 +- .../Prefabs/ConnectionModeButtons.prefab | 245 ++++++++++++ testproject/Assets/Scenes/SampleScene.unity | 360 +++++++++++++++++- .../Assets/Scripts/ConnectionModeScript.cs | 46 ++- testproject/Assets/Scripts/testproject.asmdef | 12 +- testproject/Packages/manifest.json | 127 +++--- testproject/Packages/packages-lock.json | 18 +- 7 files changed, 717 insertions(+), 98 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 326d0abbf5..c73b897235 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -36,7 +36,7 @@ private enum State } [SerializeField] private ProtocolType m_ProtocolType; - [SerializeField] private int m_MessageBufferSize; + [SerializeField] private int m_MessageBufferSize = 1024; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; @@ -58,7 +58,7 @@ private enum State private void InitDriver() { if (m_NetworkParameters.Count > 0) - m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); + m_Driver = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), m_NetworkParameters.ToArray()); else m_Driver = NetworkDriver.Create(); } @@ -239,6 +239,7 @@ private IEnumerator StartRelayServer(SocketTask task) m_RelayJoinCode = joinCodeTask.Result.Result.Data.JoinCode; var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); + // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); #if RELAY_BIGENDIAN var allocationIdArray = allocation.AllocationId.ToByteArray(); Array.Reverse(allocationIdArray, 0, 4); @@ -307,6 +308,7 @@ private bool ProcessEvent() new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup ); + // Debug.Log($"Receiving: {String.Join(", ", m_MessageBuffer.Take(size).Select(x => string.Format("{0:x}", x)))}"); } return true; } @@ -402,6 +404,7 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne { var size = data.Count + 5; + // Debug.Log($"Sending: {String.Join(", ", data.Skip(data.Offset).Take(data.Count).Select(x => string.Format("{0:x}", x)))}"); if (m_Driver.BeginSend(ParseClientId(clientId), out var writer, size) == 0) { writer.WriteByte((byte)networkChannel); diff --git a/testproject/Assets/Prefabs/ConnectionModeButtons.prefab b/testproject/Assets/Prefabs/ConnectionModeButtons.prefab index cf0e0a55b2..e73e194034 100644 --- a/testproject/Assets/Prefabs/ConnectionModeButtons.prefab +++ b/testproject/Assets/Prefabs/ConnectionModeButtons.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &1249278213434350085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 598016439257704092} + m_Layer: 0 + m_Name: AuthenticationRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &598016439257704092 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1249278213434350085} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3244368006698824953} + m_Father: {fileID: 6633621479308595792} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2956145122089128470 GameObject: m_ObjectHideFlags: 0 @@ -636,6 +667,139 @@ MonoBehaviour: m_VerticalOverflow: 0 m_LineSpacing: 1 m_Text: Create Server +--- !u!1 &6099671099853797807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3244368006698824953} + - component: {fileID: 6393215408609301555} + - component: {fileID: 419726133693533646} + - component: {fileID: 5726292772173537982} + m_Layer: 5 + m_Name: Authenticate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3244368006698824953 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6099671099853797807} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6242334806395911574} + m_Father: {fileID: 598016439257704092} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6393215408609301555 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6099671099853797807} + m_CullTransparentMesh: 1 +--- !u!114 &419726133693533646 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6099671099853797807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5726292772173537982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6099671099853797807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 419726133693533646} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4850072633501053442} + m_TargetAssemblyTypeName: ConnectionModeScript, TestProject + m_MethodName: OnSignIn + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 --- !u!1 &6957137875088695540 GameObject: m_ObjectHideFlags: 0 @@ -698,6 +862,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1265025556613751300} + - {fileID: 598016439257704092} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -719,3 +884,83 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ConnectionModeButtons: {fileID: 6957137875088695540} + m_AuthenticationButtons: {fileID: 1249278213434350085} +--- !u!1 &8777614647619606221 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6242334806395911574} + - component: {fileID: 1960081656510161396} + - component: {fileID: 7791526084471880686} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6242334806395911574 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8777614647619606221} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3244368006698824953} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1960081656510161396 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8777614647619606221} + m_CullTransparentMesh: 1 +--- !u!114 &7791526084471880686 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8777614647619606221} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.5058824, b: 0.003921569, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Authenticate diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 995decbcaa..1b92260c90 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -263,6 +263,85 @@ BoxCollider: serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &284590168 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 284590169} + - component: {fileID: 284590171} + - component: {fileID: 284590170} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &284590169 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 284590168} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 509741757} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &284590170 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 284590168} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &284590171 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 284590168} + m_CullTransparentMesh: 1 --- !u!1 &354062834 GameObject: m_ObjectHideFlags: 0 @@ -683,6 +762,175 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 457860556} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &509741756 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 509741757} + - component: {fileID: 509741761} + - component: {fileID: 509741760} + - component: {fileID: 509741759} + - component: {fileID: 509741758} + m_Layer: 5 + m_Name: InputField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &509741757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 509741756} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 900776506} + - {fileID: 284590169} + m_Father: {fileID: 1333567166} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &509741758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 509741756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 903872102732f5c4cbdd3863de5dbc97, type: 3} + m_Name: + m_EditorClassIdentifier: + Transport: {fileID: 620561613} +--- !u!114 &509741759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 509741756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 509741760} + m_TextComponent: {fileID: 284590170} + m_Placeholder: {fileID: 900776507} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 509741758} + m_TargetAssemblyTypeName: RelayJoinCodeInput, TestProject + m_MethodName: SetJoinCode + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &509741760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 509741756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &509741761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 509741756} + m_CullTransparentMesh: 1 --- !u!1 &535968794 GameObject: m_ObjectHideFlags: 0 @@ -943,8 +1191,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3} m_Name: m_EditorClassIdentifier: - m_ProtocolType: 0 - m_MessageBufferSize: 0 + m_ProtocolType: 1 + m_MessageBufferSize: 1024 m_ServerAddress: 127.0.0.1 m_ServerPort: 7777 m_RelayMaxPlayers: 10 @@ -1066,6 +1314,11 @@ PrefabInstance: propertyPath: m_Name value: ExitButton objectReference: {fileID: 0} + - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3} propertyPath: m_SceneMenuToLoad @@ -1761,6 +2014,85 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 878759701} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &900776505 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 900776506} + - component: {fileID: 900776508} + - component: {fileID: 900776507} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &900776506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900776505} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 509741757} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &900776507 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900776505} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Relay Join Code +--- !u!222 &900776508 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900776505} + m_CullTransparentMesh: 1 --- !u!1 &963826002 GameObject: m_ObjectHideFlags: 0 @@ -2145,7 +2477,6 @@ GameObject: - component: {fileID: 1333567165} - component: {fileID: 1333567164} - component: {fileID: 1333567163} - - component: {fileID: 1333567167} m_Layer: 5 m_Name: Canvas m_TagString: Untagged @@ -2227,6 +2558,7 @@ RectTransform: m_Children: - {fileID: 627808639} - {fileID: 1536251758} + - {fileID: 509741757} m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2235,23 +2567,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &1333567167 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4390d966eb8724ba2907f775b34e94ea, type: 3} - m_Name: - m_EditorClassIdentifier: - NetworkManager: {fileID: 620561611} - ButtonsRoot: {fileID: 0} - AuthButton: {fileID: 0} - JoinCode: {fileID: 0} - Transport: {fileID: 0} --- !u!1 &1345111612 GameObject: m_ObjectHideFlags: 0 @@ -3274,6 +3589,11 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 1333567166} m_Modifications: + - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_JoinCodeInput + value: + objectReference: {fileID: 509741756} - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Pivot.x diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 165b6c2578..68f3f96ac4 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -2,6 +2,11 @@ using System.Collections; using UnityEngine; using MLAPI; +using MLAPI.Transports; +#if ENABLE_RELAY_SERVICE +using Unity.Services.Core; +using Unity.Services.Authentication; +#endif /// /// Used in tandem with the ConnectModeButtons prefab asset in test project @@ -11,6 +16,12 @@ public class ConnectionModeScript : MonoBehaviour [SerializeField] private GameObject m_ConnectionModeButtons; + [SerializeField] + private GameObject m_AuthenticationButtons; + + [SerializeField] + private GameObject m_JoinCodeInput; + private CommandLineProcessor m_CommandLineProcessor; internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) { @@ -51,9 +62,22 @@ private IEnumerator WaitForNetworkManager() private void Start() { //If we have a NetworkManager instance and we are not listening and m_ConnectionModeButtons is not null then show the connection mode buttons - if (m_ConnectionModeButtons) + if (m_ConnectionModeButtons && m_AuthenticationButtons) { - m_ConnectionModeButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening); +#if ENABLE_RELAY_SERVICE + if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + { + m_JoinCodeInput.SetActive(true); + m_ConnectionModeButtons.SetActive(false || Authentication.IsSignedIn); + m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !Authentication.IsSignedIn); + } + else +#endif + { + m_JoinCodeInput.SetActive(false); + m_AuthenticationButtons.SetActive(false); + m_ConnectionModeButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening); + } } } @@ -96,4 +120,22 @@ public void OnStartClient() m_ConnectionModeButtons.SetActive(false); } } + + /// + /// Handles autenticating UnityServices, needed for Relay + /// + public async void OnSignIn() + { +#if ENABLE_RELAY_SERVICE + await UnityServices.Initialize(); + await Authentication.SignInAnonymously(); + Debug.Log($"Logging in with PlayerID {Authentication.PlayerId}"); + + if (Authentication.IsSignedIn) + { + m_ConnectionModeButtons.SetActive(true); + m_AuthenticationButtons.SetActive(false); + } +#endif + } } diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 7f51bf3cd5..566e38eb65 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -4,7 +4,9 @@ "references": [ "Unity.Multiplayer.MLAPI.Runtime", "Unity.Multiplayer.MLAPI.Editor", - "Unity.Multiplayer.Transport.UTP" + "Unity.Multiplayer.Transport.UTP", + "Unity.Services.Authentication", + "Unity.Services.Core" ], "includePlatforms": [], "excludePlatforms": [], @@ -13,6 +15,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.services.relay", + "expression": "0.0.1-preview.3", + "define": "ENABLE_RELAY_SERVICE" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 4c9bb3347b..1e9146d248 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,64 +1,67 @@ { - "dependencies": { - "com.unity.collab-proxy": "1.3.9", - "com.unity.ide.rider": "3.0.5", - "com.unity.ide.visualstudio": "2.0.7", - "com.unity.ide.vscode": "1.2.3", - "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", - "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.test-framework": "1.1.24", - "com.unity.textmeshpro": "3.0.4", - "com.unity.timeline": "1.5.2", - "com.unity.ugui": "1.0.0", - "com.unity.modules.ai": "1.0.0", - "com.unity.modules.androidjni": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.cloth": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.screencapture": "1.0.0", - "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.terrainphysics": "1.0.0", - "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.umbra": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.unitywebrequesttexture": "1.0.0", - "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vehicles": "1.0.0", - "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.wind": "1.0.0", - "com.unity.modules.xr": "1.0.0" - }, - "testables": [ - "com.unity.multiplayer.mlapi", - "com.unity.multiplayer.transport.utp" - ], - "scopedRegistries": [ - { - "name": "Candidate", - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", - "scopes": [ - "com.unity.transport", - "com.unity.collections", - "com.unity.services.relay", - "com.unity.services.authentication", - "com.unity.services.core", - "com.unity.jobs" - ] - } - ] + "dependencies": { + "com.unity.collab-proxy": "1.3.9", + "com.unity.ide.rider": "3.0.5", + "com.unity.ide.visualstudio": "2.0.7", + "com.unity.ide.vscode": "1.2.3", + "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", + "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.package-validation-suite": "0.19.2-preview", + "com.unity.services.authentication": "0.3.1-preview", + "com.unity.services.core": "0.1.0-preview", + "com.unity.services.relay": "0.0.1-preview.3", + "com.unity.test-framework": "1.1.24", + "com.unity.textmeshpro": "3.0.4", + "com.unity.timeline": "1.5.2", + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + }, + "testables": [ + "com.unity.multiplayer.mlapi", + "com.unity.multiplayer.transport.utp" + ], + "scopedRegistries": [ + { + "name": "Candidate", + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", + "scopes": [ + "com.unity.transport", + "com.unity.collections", + "com.unity.services.relay", + "com.unity.services.authentication", + "com.unity.services.core", + "com.unity.jobs" + ] + } + ] } diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index d29233978c..4d6d3d74fa 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -89,9 +89,7 @@ "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", "com.unity.transport": "0.8.0-preview.5", - "com.unity.jobs": "0.10.0-preview.18", - "com.unity.services.relay": "0.0.1-preview.2", - "com.unity.services.authentication": "0.3.1-preview" + "com.unity.jobs": "0.10.0-preview.18" } }, "com.unity.nuget.mono-cecil": { @@ -103,7 +101,7 @@ }, "com.unity.nuget.newtonsoft-json": { "version": "2.0.0", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -119,7 +117,7 @@ }, "com.unity.services.authentication": { "version": "0.3.1-preview", - "depth": 1, + "depth": 0, "source": "registry", "dependencies": { "nuget.moq": "1.0.0", @@ -131,7 +129,7 @@ }, "com.unity.services.core": { "version": "0.2.0-preview", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "nuget.moq": "1.0.0", @@ -141,8 +139,8 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.relay": { - "version": "0.0.1-preview.2", - "depth": 1, + "version": "0.0.1-preview.3", + "depth": 0, "source": "registry", "dependencies": { "com.unity.services.core": "0.2.0-preview", @@ -209,14 +207,14 @@ }, "nuget.castle-core": { "version": "1.0.1", - "depth": 3, + "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "nuget.moq": { "version": "1.0.0", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "nuget.castle-core": "1.0.1" From ea48b1f2684140c5d4e5c2302971b3fb47bc8fc1 Mon Sep 17 00:00:00 2001 From: Fernando Galandrini Date: Thu, 17 Jun 2021 14:34:27 -0400 Subject: [PATCH 12/65] Update Relay SDK version (#909) * update to relay sdk v0.0.1-preview.5 * remove workarounds - use byte array representation of allocation id - connection data truncation is not longer needed - set default relay endpoint as production * updated auth to v0.5.0 - updated core and authentication versions - updated relay version (compatible with latest core) - updated authentication calls --- .../Runtime/UTPTransport.cs | 36 +++++-------------- .../Assets/Scripts/ConnectionModeScript.cs | 10 +++--- testproject/Assets/Scripts/UIController.cs | 6 ++-- testproject/Packages/manifest.json | 6 ++-- testproject/Packages/packages-lock.json | 30 ++++------------ .../ProjectSettings/ProjectSettings.asset | 2 +- 6 files changed, 27 insertions(+), 63 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index c73b897235..b01c4c702e 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -40,7 +40,7 @@ private enum State [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; - [SerializeField] private string m_RelayServer = "https://relay-allocations-stg.cloud.unity3d.com"; + [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; @@ -95,20 +95,10 @@ private IEnumerator ClientBindAndConnect(SocketTask task) var allocation = joinTask.Result.Result.Data.Allocation; serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); -#if RELAY_BIGENDIAN - // TODO: endianess of Relay server does not match - var allocationIdArray = allocation.AllocationId.ToByteArray(); - Array.Reverse(allocationIdArray, 0, 4); - Array.Reverse(allocationIdArray, 4, 2); - Array.Reverse(allocationIdArray, 6, 2); - var allocationId = RelayAllocationId.FromByteArray(allocationIdArray); -#else - var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationId.ToByteArray()); -#endif - - // TODO: workaround for receiving 271 bytes in connection data - var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData.Take(255).ToArray()); - var hostConnectionData = RelayConnectionData.FromByteArray(allocation.HostConnectionData.Take(255).ToArray()); + var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationIdBytes); + + var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData); + var hostConnectionData = RelayConnectionData.FromByteArray(allocation.HostConnectionData); var key = RelayHMACKey.FromByteArray(allocation.Key); Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); @@ -240,17 +230,9 @@ private IEnumerator StartRelayServer(SocketTask task) var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); -#if RELAY_BIGENDIAN - var allocationIdArray = allocation.AllocationId.ToByteArray(); - Array.Reverse(allocationIdArray, 0, 4); - Array.Reverse(allocationIdArray, 4, 2); - Array.Reverse(allocationIdArray, 6, 2); - var allocationId = RelayAllocationId.FromByteArray(allocationIdArray); -#else - var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationId.ToByteArray()); -#endif - // TODO: connectionData should be 255 bytes, but we are getting 16 extra bytes - var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData.Take(255).ToArray()); + var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationIdBytes); + + var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData); var key = RelayHMACKey.FromByteArray(allocation.Key); @@ -385,7 +367,7 @@ public override void Init() m_MessageBuffer = new byte[m_MessageBufferSize]; #if ENABLE_RELAY_SERVICE if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - Unity.Services.Relay.Configuration.BasePath = m_RelayServer; + Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayServer; UnityServices.Initialize(); } #endif diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 68f3f96ac4..47f0cfdd30 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -68,8 +68,8 @@ private void Start() if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { m_JoinCodeInput.SetActive(true); - m_ConnectionModeButtons.SetActive(false || Authentication.IsSignedIn); - m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !Authentication.IsSignedIn); + m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); + m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); } else #endif @@ -128,10 +128,10 @@ public async void OnSignIn() { #if ENABLE_RELAY_SERVICE await UnityServices.Initialize(); - await Authentication.SignInAnonymously(); - Debug.Log($"Logging in with PlayerID {Authentication.PlayerId}"); + await AuthenticationService.Instance.SignInAnonymouslyAsync(); + Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); - if (Authentication.IsSignedIn) + if (AuthenticationService.Instance.IsSignedIn) { m_ConnectionModeButtons.SetActive(true); m_AuthenticationButtons.SetActive(false); diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 870352f5c5..3a5969d3e1 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -54,10 +54,10 @@ public async void OnSignIn() #if ENABLE_RELAY_SERVICE await UnityServices.Initialize(); Debug.Log("OnSignIn"); - await Authentication.SignInAnonymously(); - Debug.Log($"Logging in with PlayerID {Authentication.PlayerId}"); + await AuthenticationService.Instance.SignInAnonymouslyAsync(); + Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); - if (Authentication.IsSignedIn) { + if (AuthenticationService.Instance.IsSignedIn) { ButtonsRoot.SetActive(true); JoinCode.SetActive(true); AuthButton.SetActive(false); diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 1e9146d248..35c3aace1e 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -7,9 +7,9 @@ "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.services.authentication": "0.3.1-preview", - "com.unity.services.core": "0.1.0-preview", - "com.unity.services.relay": "0.0.1-preview.3", + "com.unity.services.authentication": "0.5.0-preview", + "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.relay": "0.0.1-preview.5", "com.unity.test-framework": "1.1.24", "com.unity.textmeshpro": "3.0.4", "com.unity.timeline": "1.5.2", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 4d6d3d74fa..7368b2b6eb 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -116,34 +116,32 @@ "url": "https://packages.unity.com" }, "com.unity.services.authentication": { - "version": "0.3.1-preview", + "version": "0.5.0-preview", "depth": 0, "source": "registry", "dependencies": { - "nuget.moq": "1.0.0", "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.services.core": "0.2.0-preview", + "com.unity.services.core": "1.1.0-pre.2", "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.core": { - "version": "0.2.0-preview", - "depth": 1, + "version": "1.1.0-pre.2", + "depth": 0, "source": "registry", "dependencies": { - "nuget.moq": "1.0.0", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.nuget.newtonsoft-json": "2.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.relay": { - "version": "0.0.1-preview.3", + "version": "0.0.1-preview.5", "depth": 0, "source": "registry", "dependencies": { - "com.unity.services.core": "0.2.0-preview", + "com.unity.services.core": "1.1.0-pre.2", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", @@ -205,22 +203,6 @@ "com.unity.modules.imgui": "1.0.0" } }, - "nuget.castle-core": { - "version": "1.0.1", - "depth": 2, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "nuget.moq": { - "version": "1.0.0", - "depth": 1, - "source": "registry", - "dependencies": { - "nuget.castle-core": "1.0.1" - }, - "url": "https://packages.unity.com" - }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 541de0bf6e..8774ebb025 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -578,7 +578,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - 1: AUTHENTICATION_TESTING_STAGING_UAS;RELAY_BIGENDIAN + 1: AUTHENTICATION_TESTING_STAGING_UAS; additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} From f07a1646acfda4504351c0fcbdd80a36f246dde1 Mon Sep 17 00:00:00 2001 From: Iurii Zakipnyi Date: Tue, 22 Jun 2021 06:50:39 -0700 Subject: [PATCH 13/65] Faster pointer and ref based UTP API usage (#912) --- .../Runtime/UTPTransport.cs | 55 ++++++++++++++++--- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index b01c4c702e..8d3ca8da06 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -69,6 +69,40 @@ private void DisposeDriver() m_Driver.Dispose(); } + private static RelayAllocationId ConvertFromGUID(ref Guid allocationGuId) + { + unsafe + { + var allocationIdArray = allocationGuId.ToByteArray(); + fixed (byte* ptr = allocationIdArray) + { + return RelayAllocationId.FromBytePointer(ptr, allocationIdArray.Length); + } + } + } + + private static RelayHMACKey ConvertFromHMAC(byte[] hmac) + { + unsafe + { + fixed (byte* ptr = hmac) + { + return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); + } + } + } + + private static RelayConnectionData ConvertConnectionData(byte[] connectionData) + { + unsafe + { + fixed (byte* ptr = connectionData) + { + return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); + } + } + } + private IEnumerator ClientBindAndConnect(SocketTask task) { var serverEndpoint = default(NetworkEndPoint); @@ -95,18 +129,20 @@ private IEnumerator ClientBindAndConnect(SocketTask task) var allocation = joinTask.Result.Result.Data.Allocation; serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationIdBytes); - var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData); - var hostConnectionData = RelayConnectionData.FromByteArray(allocation.HostConnectionData); - var key = RelayHMACKey.FromByteArray(allocation.Key); + var guid = allocation.AllocationId; + var allocationId = ConvertFromGUID(ref guid); + + var connectionData = ConvertConnectionData(allocation.ConnectionData); + var hostConnectionData = ConvertConnectionData(allocation.HostConnectionData); + var key = ConvertFromHMAC(allocation.Key); Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); Debug.Log($"client: {allocation.AllocationId}"); - var relayServerData = new RelayServerData(serverEndpoint, 0, allocationId, connectionData, hostConnectionData, key); + var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); relayServerData.ComputeNewNonce(); m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); @@ -230,13 +266,14 @@ private IEnumerator StartRelayServer(SocketTask task) var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); - var allocationId = RelayAllocationId.FromByteArray(allocation.AllocationIdBytes); - var connectionData = RelayConnectionData.FromByteArray(allocation.ConnectionData); - var key = RelayHMACKey.FromByteArray(allocation.Key); + var guid = allocation.AllocationId; + var allocationId = ConvertFromGUID(ref guid); + var connectionData = ConvertConnectionData(allocation.ConnectionData); + var key = ConvertFromHMAC(allocation.Key); - var relayServerData = new RelayServerData(serverEndpoint, 0, allocationId, connectionData, connectionData, key); + var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref connectionData, ref key); relayServerData.ComputeNewNonce(); m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); From 7f07d714b4c0edf707bd49248306d1d0ed6c576d Mon Sep 17 00:00:00 2001 From: Fernando Galandrini Date: Tue, 22 Jun 2021 12:56:28 -0400 Subject: [PATCH 14/65] use allocation id bytes instead of guid C# Guid convertion to byte array is not compatbile with relay, intead we can use the byte array provided by the relay sdk --- .../Runtime/UTPTransport.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 8d3ca8da06..487ce8ea1c 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -69,14 +69,13 @@ private void DisposeDriver() m_Driver.Dispose(); } - private static RelayAllocationId ConvertFromGUID(ref Guid allocationGuId) + private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) { unsafe { - var allocationIdArray = allocationGuId.ToByteArray(); - fixed (byte* ptr = allocationIdArray) + fixed (byte* ptr = allocationIdBytes) { - return RelayAllocationId.FromBytePointer(ptr, allocationIdArray.Length); + return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); } } } @@ -130,8 +129,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - var guid = allocation.AllocationId; - var allocationId = ConvertFromGUID(ref guid); + var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); var connectionData = ConvertConnectionData(allocation.ConnectionData); var hostConnectionData = ConvertConnectionData(allocation.HostConnectionData); @@ -267,8 +265,7 @@ private IEnumerator StartRelayServer(SocketTask task) var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); - var guid = allocation.AllocationId; - var allocationId = ConvertFromGUID(ref guid); + var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); var connectionData = ConvertConnectionData(allocation.ConnectionData); var key = ConvertFromHMAC(allocation.Key); From 8d934cf155e442d15bfb625714c0b1d488fa2e36 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Mon, 19 Jul 2021 21:18:09 +0200 Subject: [PATCH 15/65] bug: Fixing Packages Version --- com.unity.multiplayer.transport.utp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.multiplayer.transport.utp/package.json index 555885816a..57afcc39ae 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.multiplayer.transport.utp/package.json @@ -10,7 +10,7 @@ ], "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.5", + "com.unity.transport": "0.9.0-preview.3", "com.unity.jobs": "0.10.0-preview.18" }, "type": "library", From 4d26070d1ea00873178b148d27524c404be2fdef Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 20 Jul 2021 18:47:21 +0200 Subject: [PATCH 16/65] bug: Adding support for frag pipeline --- .../Runtime/UTPTransport.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 487ce8ea1c..b81d847122 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -48,19 +48,24 @@ private enum State private byte[] m_MessageBuffer; private string m_RelayJoinCode; private ulong m_ServerClientId; - + public override ulong ServerClientId => m_ServerClientId; public string RelayJoinCode => m_RelayJoinCode; public ProtocolType Protocol => m_ProtocolType; + NetworkPipeline unreliableFragmentedPipeline; + private void InitDriver() { if (m_NetworkParameters.Count > 0) m_Driver = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), m_NetworkParameters.ToArray()); else m_Driver = NetworkDriver.Create(); + + unreliableFragmentedPipeline = m_Driver.CreatePipeline( + typeof(FragmentationPipelineStage)); } private void DisposeDriver() @@ -116,7 +121,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) while(!joinTask.IsCompleted) yield return null; - + if (joinTask.IsFaulted) { Debug.LogError("Join Relay request failed"); @@ -274,7 +279,7 @@ private IEnumerator StartRelayServer(SocketTask task) relayServerData.ComputeNewNonce(); m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); - + yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); #endif } @@ -421,7 +426,11 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne var size = data.Count + 5; // Debug.Log($"Sending: {String.Join(", ", data.Skip(data.Offset).Take(data.Count).Select(x => string.Format("{0:x}", x)))}"); - if (m_Driver.BeginSend(ParseClientId(clientId), out var writer, size) == 0) + var defaultPipeline = NetworkPipeline.Null; + if (data.Count >= NetworkParameterConstants.MTU) + defaultPipeline = unreliableFragmentedPipeline; + + if (m_Driver.BeginSend(defaultPipeline, ParseClientId(clientId), out var writer, size) == 0) { writer.WriteByte((byte)networkChannel); writer.WriteInt(data.Count); From 8914ab6e84fbb23042b1d3918122b2af6ce32b18 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 20 Jul 2021 20:16:21 +0200 Subject: [PATCH 17/65] Updating package files --- testproject/Packages/manifest.json | 8 ++++---- testproject/Packages/packages-lock.json | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 91a8d6b83d..b188cc61ff 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -2,17 +2,17 @@ "dependencies": { "com.unity.collab-proxy": "1.5.7", "com.unity.ide.rider": "3.0.5", - "com.unity.ide.visualstudio": "2.0.8", + "com.unity.ide.visualstudio": "2.0.9", "com.unity.ide.vscode": "1.2.3", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.test-framework": "1.1.27", - "com.unity.test-framework.performance": "2.3.1-preview", - "com.unity.textmeshpro": "3.0.6", "com.unity.services.authentication": "0.5.0-preview", "com.unity.services.core": "1.1.0-pre.2", "com.unity.services.relay": "0.0.1-preview.5", + "com.unity.test-framework": "1.1.27", + "com.unity.test-framework.performance": "2.3.1-preview", + "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.5.2", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 656a2d3ee6..b5cc63a745 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,11 +1,11 @@ { "dependencies": { "com.unity.burst": { - "version": "1.5.2", + "version": "1.5.3", "depth": 3, "source": "registry", "dependencies": { - "com.unity.mathematics": "1.1.0" + "com.unity.mathematics": "1.2.1" }, "url": "https://packages.unity.com" }, @@ -19,11 +19,12 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "1.0.0-pre.1", + "version": "1.0.0-pre.3", "depth": 2, "source": "registry", "dependencies": { - "com.unity.burst": "1.5.2" + "com.unity.burst": "1.5.3", + "com.unity.test-framework": "1.1.22" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, @@ -42,7 +43,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.8", + "version": "2.0.9", "depth": 0, "source": "registry", "dependencies": { @@ -68,7 +69,7 @@ "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.mathematics": { - "version": "1.1.0", + "version": "1.2.1", "depth": 2, "source": "registry", "dependencies": {}, @@ -90,7 +91,7 @@ "source": "local", "dependencies": { "com.unity.multiplayer.mlapi": "0.1.0", - "com.unity.transport": "0.8.0-preview.5", + "com.unity.transport": "0.9.0-preview.3", "com.unity.jobs": "0.10.0-preview.18" } }, @@ -196,11 +197,11 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "0.8.0-preview.5", + "version": "0.9.0-preview.3", "depth": 1, "source": "registry", "dependencies": { - "com.unity.collections": "1.0.0-pre.1", + "com.unity.collections": "1.0.0-pre.3", "com.unity.burst": "1.5.1", "com.unity.mathematics": "1.2.1" }, From 4cd203c6d7e9c25f9a53fdb942c0f71a6b2b412e Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 21 Jul 2021 12:09:29 +0200 Subject: [PATCH 18/65] Exposing the Fragmentation Capacity which was too small for boss room --- .../Runtime/UTPTransport.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index b81d847122..dec230a11a 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -17,6 +17,7 @@ using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; using System.Linq; +using Unity.Networking.Transport.Utilities; namespace MLAPI.Transports { @@ -41,6 +42,7 @@ private enum State [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; + [SerializeField] private int m_MaxFragmentationCapacity = 6 * 1024; private State m_State = State.Disconnected; private NetworkDriver m_Driver; @@ -60,7 +62,7 @@ private enum State private void InitDriver() { if (m_NetworkParameters.Count > 0) - m_Driver = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), m_NetworkParameters.ToArray()); + m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); else m_Driver = NetworkDriver.Create(); @@ -403,6 +405,10 @@ public override void Init() Debug.Assert(m_MessageBufferSize > 5, "Message buffer size must be greater than 5"); m_NetworkParameters = new List(); + + + m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = m_MaxFragmentationCapacity}); + m_MessageBuffer = new byte[m_MessageBufferSize]; #if ENABLE_RELAY_SERVICE if (m_ProtocolType == ProtocolType.RelayUnityTransport) { From 5c3088cf044ede40bb03416e320ebcfaa5597b52 Mon Sep 17 00:00:00 2001 From: Simon Lemay Date: Wed, 21 Jul 2021 13:00:45 -0400 Subject: [PATCH 19/65] Generate Connect events from accepted connections (#969) MLAPI appears to expect Connect events on servers when new clients connect (at least this is what's implemented in SIPTransport). UTP doesn't generate Connect events server-side, so we must generate them ourselves when accepting connections. --- .../Runtime/UTPTransport.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index dec230a11a..ab53839f2e 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -286,6 +286,23 @@ private IEnumerator StartRelayServer(SocketTask task) #endif } + private bool AcceptConnection() + { + var connection = m_Driver.Accept(); + + if (connection != default(NetworkConnection)) + { + InvokeOnTransportEvent(NetworkEvent.Connect, + ParseClientId(connection), + NetworkChannel.Internal, + default(ArraySegment), + Time.realtimeSinceStartup); + return true; + } + + return false; + } + private bool ProcessEvent() { var eventType = m_Driver.PopEvent(out var networkConnection, out var reader); @@ -344,6 +361,7 @@ private void Update() if (m_Driver.IsCreated) { m_Driver.ScheduleUpdate().Complete(); + while(AcceptConnection() && m_Driver.IsCreated); while(ProcessEvent() && m_Driver.IsCreated); } From 5d309e6baf446cea74420c24661006a158f0f154 Mon Sep 17 00:00:00 2001 From: Simon Lemay Date: Fri, 23 Jul 2021 15:02:37 -0400 Subject: [PATCH 20/65] UTP: Add some tests for the transport wrapper (#976) * Add some basic UTPTranport tests * Implement OnDestroy in UTPTransport The implementation is the same as Shutdown, meaning it only disposes of the driver (if not already disposed of). The driver (!) for this change is to avoid leaking resources when tests fail. * Add connection tests for UTPTransport * Add basic data transmission tests for UTPTransport --- .../Runtime/UTPTransport.cs | 29 +- .../Tests/Editor/BasicUTPTest.cs | 27 -- .../Tests/Editor/UTPTransportTests.cs | 97 ++++++ ...Test.cs.meta => UTPTransportTests.cs.meta} | 2 +- .../Tests/Runtime/ConnectionTests.cs | 292 ++++++++++++++++++ .../Tests/Runtime/ConnectionTests.cs.meta | 11 + .../Tests/Runtime/Helpers.meta | 8 + .../Runtime/Helpers/RuntimeTestsHelpers.cs | 85 +++++ .../Helpers/RuntimeTestsHelpers.cs.meta | 11 + .../Tests/Runtime/TransportTests.cs | 216 +++++++++++++ .../Tests/Runtime/TransportTests.cs.meta | 11 + ...tiplayer.transport.utp.runtimetests.asmdef | 2 +- 12 files changed, 750 insertions(+), 41 deletions(-) delete mode 100644 com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs rename com.unity.multiplayer.transport.utp/Tests/Editor/{BasicUTPTest.cs.meta => UTPTransportTests.cs.meta} (83%) create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index ab53839f2e..c14fbaf1af 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -367,6 +367,11 @@ private void Update() } + private void OnDestroy() + { + DisposeDriver(); + } + private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) { return *(ulong*)&utpConnectionId; @@ -397,9 +402,7 @@ public override void DisconnectLocalClient() public override void DisconnectRemoteClient(ulong clientId) { - Debug.Assert(m_State == State.Connected, "DisconnectRemoteClient should be called on a listening server"); - - Debug.Log("Disconnecting"); + Debug.Assert(m_State == State.Listening, "DisconnectRemoteClient should be called on a listening server"); if (m_State == State.Listening) { @@ -474,24 +477,22 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne Debug.LogError("Error sending the message"); } - public override void Shutdown() - { - DisposeDriver(); - } - public override SocketTasks StartClient() { - var task = SocketTask.Working; + if (m_Driver.IsCreated) + return SocketTask.Fault.AsTasks(); + var task = SocketTask.Working; StartCoroutine(ClientBindAndConnect(task)); - return task.AsTasks(); } public override SocketTasks StartServer() { - var task = SocketTask.Working; + if (m_Driver.IsCreated) + return SocketTask.Fault.AsTasks(); + var task = SocketTask.Working; switch (m_ProtocolType) { case ProtocolType.UnityTransport: @@ -501,8 +502,12 @@ public override SocketTasks StartServer() StartCoroutine(StartRelayServer(task)); break; } - return task.AsTasks(); } + + public override void Shutdown() + { + DisposeDriver(); + } } } diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs b/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs deleted file mode 100644 index 40fabf1933..0000000000 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; -using Unity.Networking.Transport; -using MLAPI.Transports; - -namespace MLAPI.UTP.RuntimeTests -{ - public class BasicUTPTest : MonoBehaviour - { - [Test] - public void BasicUTPInitializationTest() - { - var o = new GameObject(); - var utpTransport = (UTPTransport)o.AddComponent(typeof(UTPTransport)); - utpTransport.Init(); - - Assert.True(utpTransport.ServerClientId == 0); - - utpTransport.Shutdown(); - } - } -} - - diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs new file mode 100644 index 0000000000..dbfabf0dfa --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs @@ -0,0 +1,97 @@ +using NUnit.Framework; + +using MLAPI.Transports; +using MLAPI.Transports.Tasks; +using Unity.Networking.Transport; +using UnityEngine; +using UnityEngine.TestTools; + +namespace MLAPI.UTP.EditorTests +{ + public class UTPTransportTests + { + // Check that starting a server doesn't immediately result in faulted tasks. + [Test] + public void BasicInitServer() + { + UTPTransport transport = new GameObject().AddComponent(); + transport.Init(); + + var tasks = transport.StartServer(); + Assert.False(tasks.IsDone && !tasks.Success); + + transport.Shutdown(); + } + + // Check that starting a client doesn't immediately result in faulted tasks. + [Test] + public void BasicInitClient() + { + UTPTransport transport = new GameObject().AddComponent(); + transport.Init(); + + var tasks = transport.StartClient(); + Assert.False(tasks.IsDone && !tasks.Success); + + transport.Shutdown(); + } + + // Check that we can't restart a server. + [Test] + public void NoRestartServer() + { + UTPTransport transport = new GameObject().AddComponent(); + transport.Init(); + + transport.StartServer(); + var tasks = transport.StartServer(); + Assert.True(tasks.IsDone && !tasks.AnySuccess); + + transport.Shutdown(); + } + + // Check that we can't restart a client. + [Test] + public void NoRestartClient() + { + UTPTransport transport = new GameObject().AddComponent(); + transport.Init(); + + transport.StartClient(); + var tasks = transport.StartClient(); + Assert.True(tasks.IsDone && !tasks.AnySuccess); + + transport.Shutdown(); + } + + // Check that we can't start both a server and client on the same transport. + [Test] + public void NotBothServerAndClient() + { + UTPTransport transport; + SocketTasks tasks; + + // Start server then client. + transport = new GameObject().AddComponent(); + transport.Init(); + + transport.StartServer(); + tasks = transport.StartClient(); + Assert.True(tasks.IsDone && !tasks.AnySuccess); + + transport.Shutdown(); + + // Start client then server. + transport = new GameObject().AddComponent(); + transport.Init(); + + transport.StartClient(); + tasks = transport.StartServer(); + Assert.True(tasks.IsDone && !tasks.AnySuccess); + + transport.Shutdown(); + } + } +} + + diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs.meta similarity index 83% rename from com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs.meta rename to com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs.meta index b984108d7f..0f68020ec5 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/BasicUTPTest.cs.meta +++ b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4d51a9ee9a7131d47acc9ecb8c99dd65 +guid: 1559305d14837ed449c15c194aff6e6b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs new file mode 100644 index 0000000000..b88f5d92ce --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs @@ -0,0 +1,292 @@ +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using MLAPI.Transports; +using UnityEngine; +using UnityEngine.TestTools; + +namespace MLAPI.UTP.RuntimeTests +{ + using static RuntimeTestsHelpers; + + public class ConnectionTests + { + // For tests using multiple clients. + private const int NumClients = 5; + + // Check connection with a single client. + [UnityTest] + public IEnumerator ConnectSingleClient() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + // Check we've received Connect event on client too. + Assert.AreEqual(1, clientEvents.Count); + Assert.AreEqual(NetworkEvent.Connect, clientEvents[0].Type); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check connection with multiple clients. + [UnityTest] + public IEnumerator ConnectMultipleClients() + { + UTPTransport server; + var clients = new UTPTransport[NumClients]; + + List serverEvents; + var clientsEvents = new List[NumClients]; + + InitializeTransport(out server, out serverEvents); + server.StartServer(); + + for (int i = 0; i < NumClients; i++) + { + InitializeTransport(out clients[i], out clientsEvents[i]); + clients[i].StartClient(); + } + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + // Check that every client also received a Connect event. + Assert.True(clientsEvents.All(evs => evs.Count == 1)); + Assert.True(clientsEvents.All(evs => evs[0].Type == NetworkEvent.Connect)); + + server.Shutdown(); + for (int i = 0; i < NumClients; i++) + clients[i].Shutdown(); + + yield return null; + } + + // Check server disconnection with a single client. + [UnityTest] + public IEnumerator ServerDisconnectSingleClient() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + server.DisconnectRemoteClient(serverEvents[0].ClientID); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientEvents); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check server disconnection with multiple clients. + [UnityTest] + public IEnumerator ServerDisconnectMultipleClients() + { + UTPTransport server; + var clients = new UTPTransport[NumClients]; + + List serverEvents; + var clientsEvents = new List[NumClients]; + + InitializeTransport(out server, out serverEvents); + server.StartServer(); + + for (int i = 0; i < NumClients; i++) + { + InitializeTransport(out clients[i], out clientsEvents[i]); + clients[i].StartClient(); + } + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + // Disconnect a single client. + server.DisconnectRemoteClient(serverEvents[0].ClientID); + + // Need to manually wait since we don't know which client will get the Disconnect. + yield return new WaitForSeconds(MaxNetworkEventWaitTime); + + // Check that we received a Disconnect event on only one client. + Assert.AreEqual(1, clientsEvents.Count(evs => evs.Count == 2 && evs[1].Type == NetworkEvent.Disconnect)); + + // Disconnect all the other clients. + for (int i = 1; i < NumClients; i++) + server.DisconnectRemoteClient(serverEvents[i].ClientID); + + // Need to manually wait since we don't know which client will got the Disconnect. + yield return new WaitForSeconds(MaxNetworkEventWaitTime); + + // Check that all clients got a Disconnect event. + Assert.True(clientsEvents.All(evs => evs.Count == 2)); + Assert.True(clientsEvents.All(evs => evs[1].Type == NetworkEvent.Disconnect)); + + server.Shutdown(); + for (int i = 0; i < NumClients; i++) + clients[i].Shutdown(); + + yield return null; + } + + // Check client disconnection from a single client. + [UnityTest] + public IEnumerator ClientDisconnectSingleClient() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + client.DisconnectLocalClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check client disconnection with multiple clients. + [UnityTest] + public IEnumerator ClientDisconnectMultipleClients() + { + UTPTransport server; + var clients = new UTPTransport[NumClients]; + + List serverEvents; + var clientsEvents = new List[NumClients]; + + InitializeTransport(out server, out serverEvents); + server.StartServer(); + + for (int i = 0; i < NumClients; i++) + { + InitializeTransport(out clients[i], out clientsEvents[i]); + clients[i].StartClient(); + } + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + // Disconnect a single client. + clients[0].DisconnectLocalClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + + // Disconnect all the other clients. + for (int i = 1; i < NumClients; i++) + clients[i].DisconnectLocalClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + + // Check that we got the correct number of Disconnect events on the server. + Assert.AreEqual(NumClients * 2, serverEvents.Count); + Assert.AreEqual(NumClients, serverEvents.Count(e => e.Type == NetworkEvent.Disconnect)); + + server.Shutdown(); + for (int i = 0; i < NumClients; i++) + clients[i].Shutdown(); + + yield return null; + } + + // Check that server re-disconnects are no-ops. + [UnityTest] + public IEnumerator RepeatedServerDisconnectsNoop() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + server.DisconnectRemoteClient(serverEvents[0].ClientID); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientEvents); + + var previousServerEventsCount = serverEvents.Count; + var previousClientEventsCount = clientEvents.Count; + + server.DisconnectRemoteClient(serverEvents[0].ClientID); + + // Need to wait manually since no event should be generated. + yield return new WaitForSeconds(MaxNetworkEventWaitTime); + + // Check we haven't received anything else on the client or server. + Assert.AreEqual(serverEvents.Count, previousServerEventsCount); + Assert.AreEqual(clientEvents.Count, previousClientEventsCount); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check that client re-disconnects are no-ops. + [UnityTest] + public IEnumerator RepeatedClientDisconnectsNoop() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + client.DisconnectLocalClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + + var previousServerEventsCount = serverEvents.Count; + var previousClientEventsCount = clientEvents.Count; + + client.DisconnectLocalClient(); + + // Need to wait manually since no event should be generated. + yield return new WaitForSeconds(MaxNetworkEventWaitTime); + + // Check we haven't received anything else on the client or server. + Assert.AreEqual(serverEvents.Count, previousServerEventsCount); + Assert.AreEqual(clientEvents.Count, previousClientEventsCount); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + } +} diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta new file mode 100644 index 0000000000..18635a6b14 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e1692ce08a2f72e459680dc1524327a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta new file mode 100644 index 0000000000..27015e3540 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc69b0a277c4d024eb9f7813ad4db7d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs new file mode 100644 index 0000000000..298f812fe8 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -0,0 +1,85 @@ +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using MLAPI.Transports; +using UnityEngine; +using UnityEngine.TestTools; + +namespace MLAPI.UTP.RuntimeTests +{ + public static class RuntimeTestsHelpers + { + // 50ms should be plenty enough for any network interaction to occur (even roundtrips). + public const float MaxNetworkEventWaitTime = 0.05f; + + // Wait for an event to appear in the given event list (must be the very next event). + public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events) + { + int initialCount = events.Count; + float startTime = Time.realtimeSinceStartup; + + while (Time.realtimeSinceStartup - startTime < MaxNetworkEventWaitTime) + { + if (events.Count > initialCount) + { + Assert.AreEqual(type, events[initialCount].Type); + yield break; + } + + yield return null; + } + + Assert.Fail("Timed out while waiting for network event."); + } + + // Common code to initialize a UTPTransport that logs its events. + public static void InitializeTransport(out UTPTransport transport, out List events) + { + var logger = new TransportEventLogger(); + events = logger.Events; + + transport = new GameObject().AddComponent(); + transport.OnTransportEvent += logger.HandleEvent; + transport.Init(); + } + + // Information about an event generated by a transport (basically just the parameters that + // are normally passed along to a TransportEventDelegate). + public struct TransportEvent + { + public NetworkEvent Type; + public ulong ClientID; + public NetworkChannel Channel; + public ArraySegment Data; + public float ReceiveTime; + } + + // Utility class that logs events generated by a UTPTransport. Set it up by adding the + // HandleEvent method as an OnTransportEvent delegate of the transport. The list of events + // (in order in which they were generated) can be accessed through the Events property. + public class TransportEventLogger + { + private readonly List m_Events = new List(); + public List Events => m_Events; + + public void HandleEvent(NetworkEvent type, ulong clientID, NetworkChannel channel, ArraySegment data, float receiveTime) + { + // Copy the data since the backing array will be reused for future messages. + if (data != default(ArraySegment)) + data = new ArraySegment(data.ToArray()); + + m_Events.Add(new TransportEvent + { + Type = type, + ClientID = clientID, + Channel = channel, + Data = data, + ReceiveTime = receiveTime + }); + } + } + } +} diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta new file mode 100644 index 0000000000..9943be2562 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9e62c313ec32744c810875f6738b767 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs new file mode 100644 index 0000000000..4990e46c2b --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs @@ -0,0 +1,216 @@ +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using MLAPI.Transports; +using UnityEngine; +using UnityEngine.TestTools; + +namespace MLAPI.UTP.RuntimeTests +{ + using static RuntimeTestsHelpers; + + public class TransportTests + { + // Check if can make a simple data exchange. + [UnityTest] + public IEnumerator PingPong() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); + client.Send(client.ServerClientId, ping, NetworkChannel.Internal); + + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + + var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); + server.Send(serverEvents[0].ClientID, pong, NetworkChannel.Internal); + + yield return WaitForNetworkEvent(NetworkEvent.Data, clientEvents); + + Assert.That(clientEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check if can make a simple data exchange (both ways at a time). + [UnityTest] + public IEnumerator PingPongSimultaneous() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); + server.Send(serverEvents[0].ClientID, ping, NetworkChannel.Internal); + client.Send(client.ServerClientId, ping, NetworkChannel.Internal); + + // Once one event is in the other should be too. + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + Assert.That(clientEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + + var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); + server.Send(serverEvents[0].ClientID, pong, NetworkChannel.Internal); + client.Send(client.ServerClientId, pong, NetworkChannel.Internal); + + // Once one event is in the other should be too. + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.That(serverEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + Assert.That(clientEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check making multiple sends to a client in a single frame. + [UnityTest] + public IEnumerator MultipleSendsSingleFrame() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + var data1 = new ArraySegment(new byte [] { 11 }); + client.Send(client.ServerClientId, data1, NetworkChannel.Internal); + + var data2 = new ArraySegment(new byte [] { 22 }); + client.Send(client.ServerClientId, data2, NetworkChannel.Internal); + + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.AreEqual(3, serverEvents.Count); + Assert.AreEqual(NetworkEvent.Data, serverEvents[2].Type); + + Assert.AreEqual(11, serverEvents[1].Data.First()); + Assert.AreEqual(22, serverEvents[2].Data.First()); + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check sending data to multiple clients. + [UnityTest] + public IEnumerator SendMultipleClients() + { + UTPTransport server, client1, client2; + List serverEvents, client1Events, client2Events; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client1, out client1Events); + InitializeTransport(out client2, out client2Events); + + server.StartServer(); + client1.StartClient(); + client2.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + // Ensure we got both Connect events. + Assert.AreEqual(2, serverEvents.Count); + + var data1 = new ArraySegment(new byte [] { 11 }); + server.Send(serverEvents[0].ClientID, data1, NetworkChannel.Internal); + + var data2 = new ArraySegment(new byte [] { 22 }); + server.Send(serverEvents[1].ClientID, data2, NetworkChannel.Internal); + + // Once one has received its data, the other should have too. + yield return WaitForNetworkEvent(NetworkEvent.Data, client1Events); + + // Do make sure the other client got its Data event. + Assert.AreEqual(2, client2Events.Count); + Assert.AreEqual(NetworkEvent.Data, client2Events[1].Type); + + byte c1Data = client1Events[1].Data.First(); + byte c2Data = client2Events[1].Data.First(); + Assert.True((c1Data == 11 && c2Data == 22) || (c1Data == 22 && c2Data == 11)); + + server.Shutdown(); + client1.Shutdown(); + client2.Shutdown(); + + yield return null; + } + + // Check receiving data from multiple clients. + [UnityTest] + public IEnumerator ReceiveMultipleClients() + { + UTPTransport server, client1, client2; + List serverEvents, client1Events, client2Events; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client1, out client1Events); + InitializeTransport(out client2, out client2Events); + + server.StartServer(); + client1.StartClient(); + client2.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, client1Events); + + // Ensure we got the Connect event on the other client too. + Assert.AreEqual(1, client2Events.Count); + + var data1 = new ArraySegment(new byte [] { 11 }); + client1.Send(client1.ServerClientId, data1, NetworkChannel.Internal); + + var data2 = new ArraySegment(new byte [] { 22 }); + client2.Send(client2.ServerClientId, data2, NetworkChannel.Internal); + + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + // Make sure we got both data messages. + Assert.AreEqual(4, serverEvents.Count); + Assert.AreEqual(NetworkEvent.Data, serverEvents[3].Type); + + byte sData1 = serverEvents[2].Data.First(); + byte sData2 = serverEvents[3].Data.First(); + Assert.True((sData1 == 11 && sData2 == 22) || (sData1 == 22 && sData2 == 11)); + + server.Shutdown(); + client1.Shutdown(); + client2.Shutdown(); + + yield return null; + } + } +} diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta new file mode 100644 index 0000000000..6d81e3bad8 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c4fedf1be1a7d84ba34595aae75f8da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef b/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef index 16811cc2b1..0683d67241 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef @@ -5,7 +5,7 @@ "Unity.Multiplayer.MLAPI.Runtime", "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "Unity MLAPI Transport", + "Unity.Multiplayer.Transport.UTP", "Unity.Networking.Transport" ], "includePlatforms": [], From 6322bbb3ad300109789915218fa1d85f69241252 Mon Sep 17 00:00:00 2001 From: Simon Lemay Date: Fri, 30 Jul 2021 12:44:46 -0400 Subject: [PATCH 21/65] UTP: Add proper support for channels (#986) * Correctly handle empty messages in Send The UTPTransport.Send method would throw a NullReferenceException exception when passed default(ArraySegment) as the message data. Now it simply sends an empty message to its remote host (not a terribly useful feature, but better than an exception). * Make it possible to receive messages >1024 bytes The fragmentation pipeline was set up to handle messages up to 6KB in length, but the receive buffer was only 1KB long. Messages longer than that were just ignored (although an error message was logged). * Add proper support for channels in UTPTransport The transport now selects an appropriate pipeline according to the delivery level of the channel, rather than send everything on the default unreliable pipeline. --- .../Runtime/UTPTransport.cs | 69 ++++-- .../Tests/Runtime/ChannelsTests.cs | 222 ++++++++++++++++++ .../Tests/Runtime/ChannelsTests.cs.meta | 11 + .../Tests/Runtime/ConnectionTests.cs | 2 +- .../Tests/Runtime/Helpers/DriverClient.cs | 92 ++++++++ .../Runtime/Helpers/DriverClient.cs.meta | 11 + 6 files changed, 391 insertions(+), 16 deletions(-) create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs create mode 100644 com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index c14fbaf1af..37358f16a1 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -36,13 +36,14 @@ private enum State Connected, } + public const int MaximumMessageLength = 6 * 1024; + [SerializeField] private ProtocolType m_ProtocolType; - [SerializeField] private int m_MessageBufferSize = 1024; + [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; [SerializeField] private int m_RelayMaxPlayers = 10; [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; - [SerializeField] private int m_MaxFragmentationCapacity = 6 * 1024; private State m_State = State.Disconnected; private NetworkDriver m_Driver; @@ -51,14 +52,16 @@ private enum State private string m_RelayJoinCode; private ulong m_ServerClientId; + private NetworkPipeline m_UnreliableSequencedPipeline; + private NetworkPipeline m_ReliableSequencedPipeline; + private NetworkPipeline m_ReliableSequencedFragmentedPipeline; + public override ulong ServerClientId => m_ServerClientId; public string RelayJoinCode => m_RelayJoinCode; public ProtocolType Protocol => m_ProtocolType; - NetworkPipeline unreliableFragmentedPipeline; - private void InitDriver() { if (m_NetworkParameters.Count > 0) @@ -66,8 +69,11 @@ private void InitDriver() else m_Driver = NetworkDriver.Create(); - unreliableFragmentedPipeline = m_Driver.CreatePipeline( - typeof(FragmentationPipelineStage)); + m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); + m_ReliableSequencedFragmentedPipeline = m_Driver.CreatePipeline( + typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) + ); } private void DisposeDriver() @@ -109,6 +115,35 @@ private static RelayConnectionData ConvertConnectionData(byte[] connectionData) } } + private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) + { + TransportChannel transportChannel = Array.Find(MLAPI_CHANNELS, tc => tc.Channel == channel); + + switch (transportChannel.Delivery) + { + case NetworkDelivery.Unreliable: + return NetworkPipeline.Null; + + case NetworkDelivery.UnreliableSequenced: + return m_UnreliableSequencedPipeline; + + case NetworkDelivery.Reliable: + case NetworkDelivery.ReliableSequenced: + return m_ReliableSequencedPipeline; + + case NetworkDelivery.ReliableFragmentedSequenced: + // No need to send on the fragmented pipeline if data is smaller than MTU. + if (size < NetworkParameterConstants.MTU) + return m_ReliableSequencedPipeline; + + return m_ReliableSequencedFragmentedPipeline; + + default: + Debug.LogError($"Unknown NetworkDelivery value: {transportChannel.Delivery}"); + return NetworkPipeline.Null; + } + } + private IEnumerator ClientBindAndConnect(SocketTask task) { var serverEndpoint = default(NetworkEndPoint); @@ -428,7 +463,11 @@ public override void Init() m_NetworkParameters = new List(); - m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = m_MaxFragmentationCapacity}); + // If we want to be able to actually handle messages MaximumMessageLength bytes in + // size, we need to allow a bit more than that in FragmentationUtility since this needs + // to account for headers and such. 128 bytes is plenty enough for such overhead. + var maxFragmentationCapacity = MaximumMessageLength + 128; + m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); m_MessageBuffer = new byte[m_MessageBufferSize]; #if ENABLE_RELAY_SERVICE @@ -452,21 +491,21 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne { var size = data.Count + 5; - // Debug.Log($"Sending: {String.Join(", ", data.Skip(data.Offset).Take(data.Count).Select(x => string.Format("{0:x}", x)))}"); - var defaultPipeline = NetworkPipeline.Null; - if (data.Count >= NetworkParameterConstants.MTU) - defaultPipeline = unreliableFragmentedPipeline; + var pipeline = SelectSendPipeline(networkChannel, size); - if (m_Driver.BeginSend(defaultPipeline, ParseClientId(clientId), out var writer, size) == 0) + if (m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, size) == 0) { writer.WriteByte((byte)networkChannel); writer.WriteInt(data.Count); - unsafe + if (data.Array != null) { - fixed(byte* dataPtr = &data.Array[data.Offset]) + unsafe { - writer.WriteBytes(dataPtr, data.Count); + fixed(byte* dataPtr = &data.Array[data.Offset]) + { + writer.WriteBytes(dataPtr, data.Count); + } } } diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs new file mode 100644 index 0000000000..8d29ca3c9f --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs @@ -0,0 +1,222 @@ +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using MLAPI.Transports; +using Unity.Networking.Transport; +using UnityEngine; +using UnityEngine.TestTools; + +using NetworkEvent = MLAPI.Transports.NetworkEvent; +using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; + +namespace MLAPI.UTP.RuntimeTests +{ + using static RuntimeTestsHelpers; + + public class ChannelsTests + { + // Check that we receive the correct channel (one message after the other). + [UnityTest] + public IEnumerator ReceiveCorrectChannelSequenced() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + int eventIndex = 1; + foreach (var transportChannel in server.MLAPI_CHANNELS) + { + server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); + + yield return WaitForNetworkEvent(NetworkEvent.Data, clientEvents); + + Assert.AreEqual(transportChannel.Channel, clientEvents[eventIndex].Channel); + + eventIndex++; + } + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check that we receive the correct channel (all messages received at once). + [UnityTest] + public IEnumerator ReceiveCorrectChannelSameFrame() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + foreach (var transportChannel in server.MLAPI_CHANNELS) + client.Send(client.ServerClientId, default(ArraySegment), transportChannel.Channel); + + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.AreEqual(server.MLAPI_CHANNELS.Length + 1, serverEvents.Count); + + int eventIndex = 1; + foreach (var transportChannel in server.MLAPI_CHANNELS) + { + Assert.AreEqual(transportChannel.Channel, serverEvents[eventIndex].Channel); + eventIndex++; + } + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + + // Check pipeline mapping for every default channel (except fragmented). + [UnityTest] + public IEnumerator ChannelPipelineMapping() + { + UTPTransport server; + List serverEvents; + DriverClient client = new GameObject().AddComponent(); + + InitializeTransport(out server, out serverEvents); + + server.StartServer(); + client.Connect(); + + yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); + + foreach (var transportChannel in server.MLAPI_CHANNELS) + { + // Skip over fragmented channels (covered by different test). + if (transportChannel.Delivery == NetworkDelivery.ReliableFragmentedSequenced) + continue; + + server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); + + yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); + + // Check that data's pipeline is what's expected for the delivery. + switch (transportChannel.Delivery) + { + case NetworkDelivery.Unreliable: + Assert.AreEqual(NetworkPipeline.Null, client.LastEventPipeline); + break; + + case NetworkDelivery.UnreliableSequenced: + Assert.AreEqual(client.UnreliableSequencedPipeline, client.LastEventPipeline); + break; + + case NetworkDelivery.Reliable: + case NetworkDelivery.ReliableSequenced: + Assert.AreEqual(client.ReliableSequencedPipeline, client.LastEventPipeline); + break; + } + } + + server.Shutdown(); + + yield return null; + } + + // Check pipeline mapping for every default channel that has fragmentation. + [UnityTest] + public IEnumerator ChannelPipelineMappingFragmented() + { + UTPTransport server; + List serverEvents; + DriverClient client = new GameObject().AddComponent(); + + InitializeTransport(out server, out serverEvents); + + server.StartServer(); + client.Connect(); + + yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); + + foreach (var transportChannel in server.MLAPI_CHANNELS) + { + // Skip over non-fragmented channels (covered by different test). + if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) + continue; + + // Check that data smaller than MTU doesn't trigger fragmented pipeline. + + server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); + + yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); + + Assert.AreEqual(client.ReliableSequencedPipeline, client.LastEventPipeline); + + // Check that data larger than MTU does trigger fragmented pipeline. + + var data = new ArraySegment(new byte[UTPTransport.MaximumMessageLength]); + server.Send(serverEvents[0].ClientID, data, transportChannel.Channel); + + yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); + + Assert.AreEqual(client.ReliableSequencedFragmentedPipeline, client.LastEventPipeline); + } + + server.Shutdown(); + + yield return null; + } + + // Check fragmentation on channels where it is expected. + [UnityTest] + public IEnumerator FragmentedDelivery() + { + UTPTransport server, client; + List serverEvents, clientEvents; + + InitializeTransport(out server, out serverEvents); + InitializeTransport(out client, out clientEvents); + + server.StartServer(); + client.StartClient(); + + yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + + int eventIndex = 1; + foreach (var transportChannel in server.MLAPI_CHANNELS) + { + // Only want to test fragmentation-enabled channels. + if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) + continue; + + var data = new byte[UTPTransport.MaximumMessageLength]; + for (int i = 0; i < data.Length; i++) + data[i] = (byte) i; + + client.Send(client.ServerClientId, new ArraySegment(data), transportChannel.Channel); + + yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + + Assert.True(serverEvents[eventIndex].Data.SequenceEqual(data)); + + eventIndex++; + } + + server.Shutdown(); + client.Shutdown(); + + yield return null; + } + } +} diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta new file mode 100644 index 0000000000..fbba9ef7f2 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa2a36c2e74a6504fb086b2b7d25161c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs index b88f5d92ce..3e96e76de7 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs @@ -133,7 +133,7 @@ public IEnumerator ServerDisconnectMultipleClients() for (int i = 1; i < NumClients; i++) server.DisconnectRemoteClient(serverEvents[i].ClientID); - // Need to manually wait since we don't know which client will got the Disconnect. + // Need to manually wait since we don't know which client got the Disconnect. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check that all clients got a Disconnect event. diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs new file mode 100644 index 0000000000..8b2d3cc113 --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs @@ -0,0 +1,92 @@ +using NUnit.Framework; +using System.Collections; + +using MLAPI.Transports; +using Unity.Networking.Transport; +using Unity.Networking.Transport.Utilities; +using UnityEngine; + +using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; + +namespace MLAPI.UTP.RuntimeTests +{ + using static RuntimeTestsHelpers; + + // Thin wrapper around a UTP NetworkDriver that can act as a client to a UTPTransport server. + // In particular that means the pipelines are set up the same way as in UTPTransport. + // + // The only reason it's defined as a MonoBehaviour is that OnDestroy is the only reliable way + // to get the driver's Dispose method called from a UnityTest. Making it disposable would be + // the preferred solution, but that doesn't always mesh well with coroutines. + public class DriverClient : MonoBehaviour + { + private NetworkDriver m_Driver; + public NetworkDriver Driver => m_Driver; + + private NetworkConnection m_Connection; + + private NetworkPipeline m_UnreliableSequencedPipeline; + private NetworkPipeline m_ReliableSequencedPipeline; + private NetworkPipeline m_ReliableSequencedFragmentedPipeline; + + public NetworkPipeline UnreliableSequencedPipeline => m_UnreliableSequencedPipeline; + public NetworkPipeline ReliableSequencedPipeline => m_ReliableSequencedPipeline; + public NetworkPipeline ReliableSequencedFragmentedPipeline => m_ReliableSequencedFragmentedPipeline; + + private NetworkPipeline m_LastEventPipeline; + public NetworkPipeline LastEventPipeline => m_LastEventPipeline; + + private void Awake() + { + var maxCap = UTPTransport.MaximumMessageLength + 128; + var fragParams = new FragmentationUtility.Parameters(){ PayloadCapacity = maxCap }; + + m_Driver = NetworkDriver.Create(fragParams); + + m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); + m_ReliableSequencedFragmentedPipeline = m_Driver.CreatePipeline( + typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) + ); + } + + private void Update() + { + m_Driver.ScheduleUpdate().Complete(); + } + + private void OnDestroy() + { + if (m_Driver.IsCreated) + m_Driver.Dispose(); + } + + public void Connect() + { + var endpoint = NetworkEndPoint.LoopbackIpv4; + endpoint.Port = 7777; + + m_Connection = m_Driver.Connect(endpoint); + } + + // Wait for the given event to be generated by the client's driver. + public IEnumerator WaitForNetworkEvent(UTPNetworkEvent.Type type) + { + float startTime = Time.realtimeSinceStartup; + + while (Time.realtimeSinceStartup - startTime < MaxNetworkEventWaitTime) + { + UTPNetworkEvent.Type eventType = m_Driver.PopEvent(out _, out _, out m_LastEventPipeline); + if (eventType != UTPNetworkEvent.Type.Empty) + { + Assert.AreEqual(type, eventType); + yield break; + } + + yield return null; + } + + Assert.Fail("Timed out while waiting for network event."); + } + } +} diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta new file mode 100644 index 0000000000..806020f6cf --- /dev/null +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab8e989afa5cf444bac47c920b5d4748 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ccbf652dc747726eb5f72096d23a6f415b399a16 Mon Sep 17 00:00:00 2001 From: thoward-unity <87874023+thoward-unity@users.noreply.github.com> Date: Mon, 9 Aug 2021 14:25:12 -0400 Subject: [PATCH 22/65] Feature/initial relay utp remove relay sdk calls (#1032) * DST-528: Extracted Relay SDK calls out of UTP adapter for MLAPI; it now accepts a variable passed in via a setter method. Also updated the sample test project included to illustrate these changes. * DST-528: Made some changes that address feedback comments; mainly restructured the manner that code external to UTPTransport passes in the requisite relay server data so that external code doesn't need to know about the internal data structures that UTPTransport uses. * DST-528: Removing minor changes that were erroneously left in when taking other approaches. --- .../Runtime/UTPTransport.cs | 224 +++++++----------- ...com.unity.multiplayer.transport.utp.asmdef | 12 +- testproject/Assets/Scenes/SampleScene.unity | 63 ++++- .../Assets/Scripts/CommandLineHandler.cs | 6 +- .../Assets/Scripts/ConnectionModeScript.cs | 152 ++++++++++-- .../Assets/Scripts/RelayJoinCodeInput.cs | 8 +- testproject/Assets/Scripts/RelayUtility.cs | 62 +++++ .../Assets/Scripts/RelayUtility.cs.meta | 11 + testproject/Assets/Scripts/UIController.cs | 2 +- testproject/Assets/Scripts/testproject.asmdef | 6 +- testproject/Packages/manifest.json | 20 +- testproject/Packages/packages-lock.json | 41 ++-- .../ProjectSettings/ProjectSettings.asset | 16 +- .../ProjectSettings/ProjectVersion.txt | 4 +- 14 files changed, 410 insertions(+), 217 deletions(-) create mode 100644 testproject/Assets/Scripts/RelayUtility.cs create mode 100644 testproject/Assets/Scripts/RelayUtility.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 37358f16a1..84ae1799f0 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -4,12 +4,6 @@ using System.Threading.Tasks; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; -#if ENABLE_RELAY_SERVICE -using Unity.Services.Relay; -using Unity.Services.Relay.Allocations; -using Unity.Services.Relay.Models; -using Unity.Services.Core; -#endif using MLAPI.Transports.Tasks; using UnityEngine; @@ -42,14 +36,11 @@ private enum State [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; - [SerializeField] private int m_RelayMaxPlayers = 10; - [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; private List m_NetworkParameters; private byte[] m_MessageBuffer; - private string m_RelayJoinCode; private ulong m_ServerClientId; private NetworkPipeline m_UnreliableSequencedPipeline; @@ -58,16 +49,23 @@ private enum State public override ulong ServerClientId => m_ServerClientId; - public string RelayJoinCode => m_RelayJoinCode; - public ProtocolType Protocol => m_ProtocolType; + private RelayServerData m_RelayServerData; + + private static readonly RelayServerData k_DefaultRelayServerData = default(RelayServerData); + private static RelayServerData DefaultRelayServerData => k_DefaultRelayServerData; + private void InitDriver() { if (m_NetworkParameters.Count > 0) + { m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); + } else + { m_Driver = NetworkDriver.Create(); + } m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); @@ -79,39 +77,8 @@ private void InitDriver() private void DisposeDriver() { if (m_Driver.IsCreated) - m_Driver.Dispose(); - } - - private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) - { - unsafe - { - fixed (byte* ptr = allocationIdBytes) - { - return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); - } - } - } - - private static RelayHMACKey ConvertFromHMAC(byte[] hmac) - { - unsafe - { - fixed (byte* ptr = hmac) - { - return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); - } - } - } - - private static RelayConnectionData ConvertConnectionData(byte[] connectionData) - { - unsafe { - fixed (byte* ptr = connectionData) - { - return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); - } + m_Driver.Dispose(); } } @@ -134,7 +101,9 @@ private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) case NetworkDelivery.ReliableFragmentedSequenced: // No need to send on the fragmented pipeline if data is smaller than MTU. if (size < NetworkParameterConstants.MTU) + { return m_ReliableSequencedPipeline; + } return m_ReliableSequencedFragmentedPipeline; @@ -150,43 +119,15 @@ private IEnumerator ClientBindAndConnect(SocketTask task) if (m_ProtocolType == ProtocolType.RelayUnityTransport) { -#if !ENABLE_RELAY_SERVICE - Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); - yield return null; -#else - var joinTask = RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(m_RelayJoinCode))); - - while(!joinTask.IsCompleted) - yield return null; - - if (joinTask.IsFaulted) + //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use + //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. + if(m_RelayServerData.Equals(DefaultRelayServerData)) { - Debug.LogError("Join Relay request failed"); - task.IsDone = true; - task.Success = false; + Debug.LogError("You must set the RelayServerData property to something different from the default value before calling StartRelayServer."); yield break; } - var allocation = joinTask.Result.Result.Data.Allocation; - - serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - - var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); - - var connectionData = ConvertConnectionData(allocation.ConnectionData); - var hostConnectionData = ConvertConnectionData(allocation.HostConnectionData); - var key = ConvertFromHMAC(allocation.Key); - - Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); - Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); - - Debug.Log($"client: {allocation.AllocationId}"); - - var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); - relayServerData.ComputeNewNonce(); - - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); -#endif + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = m_RelayServerData }); } else { @@ -223,8 +164,6 @@ private IEnumerator ClientBindAndConnect(SocketTask task) { Debug.LogError("Client failed to connect to server"); } - - } task.IsDone = true; @@ -256,69 +195,80 @@ private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoin { Debug.LogError("Server failed to listen"); } - - } task.IsDone = true; } - - private IEnumerator StartRelayServer(SocketTask task) + private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) { -#if !ENABLE_RELAY_SERVICE - Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); - yield return null; -#else - var allocationTask = RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(m_RelayMaxPlayers))); - - while(!allocationTask.IsCompleted) + unsafe { - yield return null; + fixed (byte* ptr = allocationIdBytes) + { + return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); + } } + } - if (allocationTask.IsFaulted) + private static RelayHMACKey ConvertFromHMAC(byte[] hmac) + { + unsafe { - Debug.LogError("Create allocation request failed"); - task.IsDone = true; - task.Success = false; - yield break; + fixed (byte* ptr = hmac) + { + return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); + } } + } - var allocation = allocationTask.Result.Result.Data.Allocation; - - var joinCodeTask = RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocation.AllocationId))); + private static RelayConnectionData ConvertConnectionData(byte[] connectionData) + { + unsafe + { + fixed (byte* ptr = connectionData) + { + return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); + } + } + } - while(!joinCodeTask.IsCompleted) + public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) + { + RelayConnectionData hostConnectionData; + + var serverEndpoint = NetworkEndPoint.Parse(ipv4address, port); + var allocationId = ConvertFromAllocationIdBytes(allocationIdBytes); + var key = ConvertFromHMAC(keyBytes); + var connectionData = ConvertConnectionData(connectionDataBytes); + + if (hostConnectionDataBytes != null) + { + hostConnectionData = ConvertConnectionData(hostConnectionDataBytes); + } + else { - yield return null; + hostConnectionData = connectionData; } + m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); + m_RelayServerData.ComputeNewNonce(); + } - if (joinCodeTask.IsFaulted) + private IEnumerator StartRelayServer(SocketTask task) + { + //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use + //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. + if (m_RelayServerData.Equals(DefaultRelayServerData)) { - Debug.LogError("Create join code request failed"); - task.IsDone = true; - task.Success = false; + Debug.LogError("You must set the RelayServerData property to something different from the default value before calling StartRelayServer."); yield break; } + else + { + m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); - m_RelayJoinCode = joinCodeTask.Result.Result.Data.JoinCode; - - var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); - - var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); - var connectionData = ConvertConnectionData(allocation.ConnectionData); - var key = ConvertFromHMAC(allocation.Key); - - - var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref connectionData, ref key); - relayServerData.ComputeNewNonce(); - - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); - - yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); -#endif + yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); + } } private bool AcceptConnection() @@ -396,8 +346,15 @@ private void Update() if (m_Driver.IsCreated) { m_Driver.ScheduleUpdate().Complete(); - while(AcceptConnection() && m_Driver.IsCreated); - while(ProcessEvent() && m_Driver.IsCreated); + while(AcceptConnection() && m_Driver.IsCreated) + { + ; + } + + while (ProcessEvent() && m_Driver.IsCreated) + { + ; + } } } @@ -417,14 +374,6 @@ private static unsafe NetworkConnection ParseClientId(ulong mlapiConnectionId) return *(NetworkConnection*)&mlapiConnectionId; } - public void SetRelayJoinCode(string value) - { - if (m_State == State.Disconnected) - { - m_RelayJoinCode = value; - } - } - public override void DisconnectLocalClient() { Debug.Assert(m_State == State.Connected, "DisconnectLocalClient should be called on a connected client"); @@ -462,7 +411,6 @@ public override void Init() m_NetworkParameters = new List(); - // If we want to be able to actually handle messages MaximumMessageLength bytes in // size, we need to allow a bit more than that in FragmentationUtility since this needs // to account for headers and such. 128 bytes is plenty enough for such overhead. @@ -470,12 +418,6 @@ public override void Init() m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); m_MessageBuffer = new byte[m_MessageBufferSize]; -#if ENABLE_RELAY_SERVICE - if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayServer; - UnityServices.Initialize(); - } -#endif } public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) @@ -510,7 +452,9 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } if (m_Driver.EndSend(writer) == size) + { return; + } } Debug.LogError("Error sending the message"); @@ -519,7 +463,9 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne public override SocketTasks StartClient() { if (m_Driver.IsCreated) + { return SocketTask.Fault.AsTasks(); + } var task = SocketTask.Working; StartCoroutine(ClientBindAndConnect(task)); @@ -529,7 +475,9 @@ public override SocketTasks StartClient() public override SocketTasks StartServer() { if (m_Driver.IsCreated) + { return SocketTask.Fault.AsTasks(); + } var task = SocketTask.Working; switch (m_ProtocolType) diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 696ebfb440..622b00484c 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -6,9 +6,7 @@ "Unity.Jobs", "Unity.Burst", "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Networking.Transport", - "Unity.Services.Relay", - "Unity.Services.Core" + "Unity.Networking.Transport" ], "includePlatforms": [], "excludePlatforms": [], @@ -17,12 +15,6 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [ - { - "name": "com.unity.services.relay", - "expression": "0.0.1-preview.3", - "define": "ENABLE_RELAY_SERVICE" - } - ], + "versionDefines": [], "noEngineReferences": false } \ No newline at end of file diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index d62a9ab0e6..392afb240b 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -219,6 +219,18 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 19899154} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &102484700 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, + type: 3} + m_PrefabInstance: {fileID: 1928839749} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 50623966c8d88ab40982cc2b0e4c2d2e, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &225870858 GameObject: m_ObjectHideFlags: 0 @@ -586,6 +598,7 @@ MonoBehaviour: GlobalObjectIdHash: 3604669530 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &402668304 MonoBehaviour: m_ObjectHideFlags: 0 @@ -815,7 +828,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 903872102732f5c4cbdd3863de5dbc97, type: 3} m_Name: m_EditorClassIdentifier: - Transport: {fileID: 620561613} + ConnectionScript: {fileID: 102484700} --- !u!114 &509741759 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1097,7 +1110,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 620561609} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} m_Name: @@ -1140,7 +1153,7 @@ MonoBehaviour: type: 3} NetworkPrefabs: - Override: 0 - Prefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, + Prefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 @@ -1195,8 +1208,6 @@ MonoBehaviour: m_MessageBufferSize: 1024 m_ServerAddress: 127.0.0.1 m_ServerPort: 7777 - m_RelayMaxPlayers: 10 - m_RelayServer: https://relay-allocations-stg.cloud.unity3d.com --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -2179,6 +2190,7 @@ MonoBehaviour: GlobalObjectIdHash: 3972363333 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!65 &963826007 BoxCollider: m_ObjectHideFlags: 0 @@ -2270,7 +2282,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 05037a80244af4174806bc7f242e4432, type: 3} m_Name: m_EditorClassIdentifier: - UnityChanPrefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, + UnityChanPrefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, type: 3} --- !u!4 &1202924674 Transform: @@ -2672,6 +2684,7 @@ MonoBehaviour: GlobalObjectIdHash: 1445980162 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1397037320 Rigidbody: m_ObjectHideFlags: 0 @@ -2935,6 +2948,7 @@ MonoBehaviour: GlobalObjectIdHash: 1148320762 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1402467447 Rigidbody: m_ObjectHideFlags: 0 @@ -3345,6 +3359,7 @@ MonoBehaviour: GlobalObjectIdHash: 2710131580 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &1475593096 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3589,11 +3604,46 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 1333567166} m_Modifications: + - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartServerButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} + - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartClientButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} + - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartHostButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_JoinCodeInput value: objectReference: {fileID: 509741756} + - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_RelayAllocationBasePath + value: https://relay-allocations-stg.services.api.unity.com + objectReference: {fileID: 0} - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Pivot.x @@ -3802,4 +3852,3 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} - \ No newline at end of file diff --git a/testproject/Assets/Scripts/CommandLineHandler.cs b/testproject/Assets/Scripts/CommandLineHandler.cs index 6687a82f46..16f71d1678 100644 --- a/testproject/Assets/Scripts/CommandLineHandler.cs +++ b/testproject/Assets/Scripts/CommandLineHandler.cs @@ -163,7 +163,7 @@ private void StartServer() m_CommandLineArguments.Remove("-m"); if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartServer(); + m_ConnectionModeScript.OnStartServerButton(); } else { @@ -175,7 +175,7 @@ private void StartHost() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartHost(); + m_ConnectionModeScript.OnStartHostButton(); } else { @@ -187,7 +187,7 @@ private void StartClient() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartClient(); + m_ConnectionModeScript.OnStartClientButton(); } else { diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 47f0cfdd30..185f1d9042 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -3,6 +3,7 @@ using UnityEngine; using MLAPI; using MLAPI.Transports; + #if ENABLE_RELAY_SERVICE using Unity.Services.Core; using Unity.Services.Authentication; @@ -22,7 +23,19 @@ public class ConnectionModeScript : MonoBehaviour [SerializeField] private GameObject m_JoinCodeInput; + [SerializeField] + private int m_MaxConnections = 10; + private CommandLineProcessor m_CommandLineProcessor; + +#if ENABLE_RELAY_SERVICE + [SerializeField] + private string m_RelayAllocationBasePath = "https://relay-allocations-stg.services.api.unity.com"; + + [HideInInspector] + public string RelayJoinCode { get; set; } +#endif + internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) { m_CommandLineProcessor = commandLineProcessor; @@ -38,7 +51,6 @@ internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventHost; public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventClient; - private IEnumerator WaitForNetworkManager() { while(true) @@ -68,8 +80,10 @@ private void Start() if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { m_JoinCodeInput.SetActive(true); - m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); - m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); + //If Start() is called on the first frame update, it's not likely that the AuthenticationService is going to be instantiated yet + //Moved old logic for this out to OnServicesInitialized + m_ConnectionModeButtons.SetActive(false); + m_AuthenticationButtons.SetActive(true); } else #endif @@ -81,54 +95,158 @@ private void Start() } } + private void OnServicesInitialized() + { +#if ENABLE_RELAY_SERVICE + if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + { + m_JoinCodeInput.SetActive(true); + m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); + m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); + } +#endif + } + /// /// Handles starting MLAPI in server mode /// - public void OnStartServer() + public void OnStartServerButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartServer(); - OnNotifyConnectionEventServer?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayServer(StartServer)); +#else + StartServer(); +#endif + } + } + + private void StartServer() + { + NetworkManager.Singleton.StartServer(); + OnNotifyConnectionEventServer?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } +#if ENABLE_RELAY_SERVICE + /// + /// Coroutine that handles starting MLAPI in server mode if Relay is enabled + /// + private IEnumerator StartRelayServer(Action postAllocationAction) + { + m_ConnectionModeButtons.SetActive(false); + + var serverRelayUtilityTask = RelayUtility.AllocateRelayServerAndGetJoinCode(m_MaxConnections); + while (!serverRelayUtilityTask.IsCompleted) + { + yield return null; + } + if (serverRelayUtilityTask.IsFaulted) + { + Debug.LogError("Exception thrown when attempting to start Relay Server. Server not started. Exception: " + serverRelayUtilityTask.Exception.Message); + yield break; } + + var (ipv4address, port, allocationIdBytes, connectionData, key, joinCode) = serverRelayUtilityTask.Result; + + RelayJoinCode = joinCode; + + //When starting a relay server, both instances of connection data are identical. + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); + + postAllocationAction(); } +#endif /// /// Handles starting MLAPI in host mode /// - public void OnStartHost() + public void OnStartHostButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartHost(); - OnNotifyConnectionEventHost?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayServer(StartHost)); +#else + StartHost(); +#endif } } + private void StartHost() + { + NetworkManager.Singleton.StartHost(); + OnNotifyConnectionEventHost?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } + /// /// Handles starting MLAPI in client mode /// - public void OnStartClient() + public void OnStartClientButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartClient(); - OnNotifyConnectionEventClient?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayClient()); +#else + StartClient(); +#endif } } + private void StartClient() + { + NetworkManager.Singleton.StartClient(); + OnNotifyConnectionEventClient?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } + +#if ENABLE_RELAY_SERVICE + /// + /// Coroutine that kicks off Relay SDK calls to join a Relay Server instance with a join code + /// + /// + private IEnumerator StartRelayClient() + { + m_ConnectionModeButtons.SetActive(false); + + //assumes that RelayJoinCodeInput populated RelayJoinCode prior to this + var clientRelayUtilityTask = RelayUtility.JoinRelayServerFromJoinCode(RelayJoinCode); + + while (!clientRelayUtilityTask.IsCompleted) + { + yield return null; + } + + if (clientRelayUtilityTask.IsFaulted) + { + Debug.LogError("Exception thrown when attempting to connect to Relay Server. Exception: " + clientRelayUtilityTask.Exception.Message); + yield break; + } + + var (ipv4address, port, allocationIdBytes, connectionData, hostConnectionData, key) = clientRelayUtilityTask.Result; + + //When connecting as a client to a relay server, connectionData and hostConnectionData are different. + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData, hostConnectionData); + + NetworkManager.Singleton.StartClient(); + OnNotifyConnectionEventClient?.Invoke(); + } +#endif /// - /// Handles autenticating UnityServices, needed for Relay + /// Handles authenticating UnityServices, needed for Relay /// public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - await UnityServices.Initialize(); + Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayAllocationBasePath; + + await UnityServices.InitializeAsync(); + OnServicesInitialized(); await AuthenticationService.Instance.SignInAnonymouslyAsync(); + Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); if (AuthenticationService.Instance.IsSignedIn) diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs index 34b3a31e85..ea4aa8815d 100644 --- a/testproject/Assets/Scripts/RelayJoinCodeInput.cs +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -4,7 +4,7 @@ public class RelayJoinCodeInput : MonoBehaviour { - public UTPTransport Transport; + public ConnectionModeScript ConnectionScript; private InputField m_TextInput; private void Start() @@ -15,8 +15,8 @@ private void Start() private void Update() { if (m_TextInput.IsInteractable()) { - if (!string.IsNullOrEmpty(Transport.RelayJoinCode)) { - m_TextInput.text = Transport.RelayJoinCode; + if (!string.IsNullOrEmpty(ConnectionScript.RelayJoinCode)) { + m_TextInput.text = ConnectionScript.RelayJoinCode; m_TextInput.readOnly = true; } } @@ -24,6 +24,6 @@ private void Update() public void SetJoinCode() { - Transport.SetRelayJoinCode(m_TextInput.text); + ConnectionScript.RelayJoinCode = m_TextInput.text; } } diff --git a/testproject/Assets/Scripts/RelayUtility.cs b/testproject/Assets/Scripts/RelayUtility.cs new file mode 100644 index 0000000000..9bf63bce77 --- /dev/null +++ b/testproject/Assets/Scripts/RelayUtility.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using UnityEngine; +using Unity.Services.Relay; +using Unity.Services.Relay.Allocations; +using Unity.Services.Relay.Models; + +public class RelayUtility +{ + async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) + { + Response allocationResponse; + Response createJoinCodeResponse; + try + { + allocationResponse = await RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(maxConnections, region))); + } + catch + { + Debug.LogError("Relay create allocation request failed"); + throw; + } + + var allocation = allocationResponse.Result.Data.Allocation; + + Debug.Log($"server: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"server: {allocation.AllocationId}"); + + try + { + createJoinCodeResponse = await RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocationResponse.Result.Data.Allocation.AllocationId))); + } + catch + { + Debug.LogError("Relay create join code request failed"); + throw; + } + + return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCodeResponse.Result.Data.JoinCode); + } + + async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) + { + Response joinResponse; + try + { + joinResponse = await RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(joinCode))); + } + catch + { + Debug.LogError("Relay create join code request failed"); + throw; + } + + var allocation = joinResponse.Result.Data.Allocation; + + Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); + Debug.Log($"client: {allocation.AllocationId}"); + + return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.HostConnectionData, allocation.Key); + } +} diff --git a/testproject/Assets/Scripts/RelayUtility.cs.meta b/testproject/Assets/Scripts/RelayUtility.cs.meta new file mode 100644 index 0000000000..b7879fb3a2 --- /dev/null +++ b/testproject/Assets/Scripts/RelayUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 821a03e0e4496574c8ca6a558047e944 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 3a5969d3e1..29752e65b8 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -52,7 +52,7 @@ private void HideButtons() public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - await UnityServices.Initialize(); + await UnityServices.InitializeAsync(); Debug.Log("OnSignIn"); await AuthenticationService.Instance.SignInAnonymouslyAsync(); Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index d4191ebbdd..d963bcca5c 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -7,7 +7,9 @@ "Unity.Multiplayer.MLAPI.Prototyping", "Unity.Multiplayer.Transport.UTP", "Unity.Services.Authentication", - "Unity.Services.Core" + "Unity.Services.Core", + "Unity.Networking.Transport", + "Unity.Services.Relay" ], "includePlatforms": [], "excludePlatforms": [], @@ -24,4 +26,4 @@ } ], "noEngineReferences": false -} +} \ No newline at end of file diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index b188cc61ff..0b493d2cbf 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,19 +1,21 @@ { "dependencies": { - "com.unity.collab-proxy": "1.5.7", - "com.unity.ide.rider": "3.0.5", - "com.unity.ide.visualstudio": "2.0.9", + "com.unity.collab-proxy": "1.7.1", + "com.unity.ide.rider": "3.0.7", + "com.unity.ide.visualstudio": "2.0.11", "com.unity.ide.vscode": "1.2.3", + "com.unity.mathematics": "1.2.1", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.services.authentication": "0.5.0-preview", - "com.unity.services.core": "1.1.0-pre.2", - "com.unity.services.relay": "0.0.1-preview.5", + "com.unity.package-validation-suite": "0.21.0-preview", + "com.unity.services.authentication": "1.0.0-pre.4", + "com.unity.services.core": "1.1.0-pre.8", + "com.unity.services.relay": "1.0.0-preview.1", "com.unity.test-framework": "1.1.27", - "com.unity.test-framework.performance": "2.3.1-preview", + "com.unity.test-framework.performance": "2.8.0-preview", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.5.2", + "com.unity.timeline": "1.5.6", + "com.unity.transport": "1.0.0-pre.1", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index b5cc63a745..f2acdb609d 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -2,7 +2,7 @@ "dependencies": { "com.unity.burst": { "version": "1.5.3", - "depth": 3, + "depth": 2, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1" @@ -10,7 +10,7 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.5.7", + "version": "1.7.1", "depth": 0, "source": "registry", "dependencies": { @@ -20,7 +20,7 @@ }, "com.unity.collections": { "version": "1.0.0-pre.3", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.burst": "1.5.3", @@ -36,14 +36,16 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.5", + "version": "3.0.7", "depth": 0, "source": "registry", - "dependencies": {}, + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.9", + "version": "2.0.11", "depth": 0, "source": "registry", "dependencies": { @@ -70,7 +72,7 @@ }, "com.unity.mathematics": { "version": "1.2.1", - "depth": 2, + "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -110,7 +112,7 @@ "url": "https://packages.unity.com" }, "com.unity.package-validation-suite": { - "version": "0.19.2-preview", + "version": "0.21.0-preview", "depth": 0, "source": "registry", "dependencies": { @@ -119,32 +121,31 @@ "url": "https://packages.unity.com" }, "com.unity.services.authentication": { - "version": "0.5.0-preview", + "version": "1.0.0-pre.4", "depth": 0, "source": "registry", "dependencies": { "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.core": "1.1.0-pre.8", "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.core": { - "version": "1.1.0-pre.2", + "version": "1.1.0-pre.8", "depth": 0, "source": "registry", "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.nuget.newtonsoft-json": "2.0.0" + "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.relay": { - "version": "0.0.1-preview.5", + "version": "1.0.0-preview.1", "depth": 0, "source": "registry", "dependencies": { - "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.core": "1.1.0-pre.4", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", @@ -166,12 +167,12 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "2.3.1-preview", + "version": "2.8.0-preview", "depth": 0, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.0", - "com.unity.nuget.newtonsoft-json": "2.0.0-preview" + "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -185,7 +186,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.5.2", + "version": "1.5.6", "depth": 0, "source": "registry", "dependencies": { @@ -197,8 +198,8 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "0.9.0-preview.3", - "depth": 1, + "version": "1.0.0-pre.1", + "depth": 0, "source": "registry", "dependencies": { "com.unity.collections": "1.0.0-pre.3", diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 96699ff538..8dd731d6ee 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -555,6 +555,7 @@ PlayerSettings: ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] @@ -580,7 +581,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - 1: AUTHENTICATION_TESTING_STAGING_UAS; + 1: AUTHENTICATION_TESTING_STAGING_UAS additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -656,7 +657,14 @@ PlayerSettings: XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: + Analytics: 0 + Build: 0 + Collab: 0 + Game Performance: 0 + Purchasing: 0 + UDP: 0 UNet: 1 + Unity Ads: 0 luminIcon: m_Name: m_ModelFolderPath: @@ -670,11 +678,11 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: 29e7e6bb-3cf4-46ea-bdc9-b9581a9d0b47 + cloudProjectId: 41b4b759-38bb-46fb-9eb2-b233a90bade7 framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: testproject - organizationId: mlapi-test + projectName: relay-stg + organizationId: relay-stg cloudEnabled: 0 legacyClampBlendShapeWeights: 0 virtualTexturingSupportEnabled: 0 diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 79c71bce82..5ac0724b15 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.3.12f1 -m_EditorVersionWithRevision: 2020.3.12f1 (b3b2c6512326) +m_EditorVersion: 2020.3.15f2 +m_EditorVersionWithRevision: 2020.3.15f2 (6cf78cb77498) From cd545291db9e6fed5c08474cdc704397e2e271ca Mon Sep 17 00:00:00 2001 From: thoward-unity <87874023+thoward-unity@users.noreply.github.com> Date: Mon, 9 Aug 2021 14:26:53 -0400 Subject: [PATCH 23/65] Revert "Feature/initial relay utp remove relay sdk calls (#1032)" (#1033) This reverts commit ccbf652dc747726eb5f72096d23a6f415b399a16. --- .../Runtime/UTPTransport.cs | 224 +++++++++++------- ...com.unity.multiplayer.transport.utp.asmdef | 12 +- testproject/Assets/Scenes/SampleScene.unity | 63 +---- .../Assets/Scripts/CommandLineHandler.cs | 6 +- .../Assets/Scripts/ConnectionModeScript.cs | 152 ++---------- .../Assets/Scripts/RelayJoinCodeInput.cs | 8 +- testproject/Assets/Scripts/RelayUtility.cs | 62 ----- .../Assets/Scripts/RelayUtility.cs.meta | 11 - testproject/Assets/Scripts/UIController.cs | 2 +- testproject/Assets/Scripts/testproject.asmdef | 6 +- testproject/Packages/manifest.json | 20 +- testproject/Packages/packages-lock.json | 41 ++-- .../ProjectSettings/ProjectSettings.asset | 16 +- .../ProjectSettings/ProjectVersion.txt | 4 +- 14 files changed, 217 insertions(+), 410 deletions(-) delete mode 100644 testproject/Assets/Scripts/RelayUtility.cs delete mode 100644 testproject/Assets/Scripts/RelayUtility.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 84ae1799f0..37358f16a1 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -4,6 +4,12 @@ using System.Threading.Tasks; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; +#if ENABLE_RELAY_SERVICE +using Unity.Services.Relay; +using Unity.Services.Relay.Allocations; +using Unity.Services.Relay.Models; +using Unity.Services.Core; +#endif using MLAPI.Transports.Tasks; using UnityEngine; @@ -36,11 +42,14 @@ private enum State [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; + [SerializeField] private int m_RelayMaxPlayers = 10; + [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; private List m_NetworkParameters; private byte[] m_MessageBuffer; + private string m_RelayJoinCode; private ulong m_ServerClientId; private NetworkPipeline m_UnreliableSequencedPipeline; @@ -49,23 +58,16 @@ private enum State public override ulong ServerClientId => m_ServerClientId; - public ProtocolType Protocol => m_ProtocolType; - - private RelayServerData m_RelayServerData; + public string RelayJoinCode => m_RelayJoinCode; - private static readonly RelayServerData k_DefaultRelayServerData = default(RelayServerData); - private static RelayServerData DefaultRelayServerData => k_DefaultRelayServerData; + public ProtocolType Protocol => m_ProtocolType; private void InitDriver() { if (m_NetworkParameters.Count > 0) - { m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); - } else - { m_Driver = NetworkDriver.Create(); - } m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); @@ -77,8 +79,39 @@ private void InitDriver() private void DisposeDriver() { if (m_Driver.IsCreated) - { m_Driver.Dispose(); + } + + private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) + { + unsafe + { + fixed (byte* ptr = allocationIdBytes) + { + return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); + } + } + } + + private static RelayHMACKey ConvertFromHMAC(byte[] hmac) + { + unsafe + { + fixed (byte* ptr = hmac) + { + return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); + } + } + } + + private static RelayConnectionData ConvertConnectionData(byte[] connectionData) + { + unsafe + { + fixed (byte* ptr = connectionData) + { + return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); + } } } @@ -101,9 +134,7 @@ private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) case NetworkDelivery.ReliableFragmentedSequenced: // No need to send on the fragmented pipeline if data is smaller than MTU. if (size < NetworkParameterConstants.MTU) - { return m_ReliableSequencedPipeline; - } return m_ReliableSequencedFragmentedPipeline; @@ -119,15 +150,43 @@ private IEnumerator ClientBindAndConnect(SocketTask task) if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use - //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. - if(m_RelayServerData.Equals(DefaultRelayServerData)) +#if !ENABLE_RELAY_SERVICE + Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); + yield return null; +#else + var joinTask = RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(m_RelayJoinCode))); + + while(!joinTask.IsCompleted) + yield return null; + + if (joinTask.IsFaulted) { - Debug.LogError("You must set the RelayServerData property to something different from the default value before calling StartRelayServer."); + Debug.LogError("Join Relay request failed"); + task.IsDone = true; + task.Success = false; yield break; } - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = m_RelayServerData }); + var allocation = joinTask.Result.Result.Data.Allocation; + + serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); + + var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); + + var connectionData = ConvertConnectionData(allocation.ConnectionData); + var hostConnectionData = ConvertConnectionData(allocation.HostConnectionData); + var key = ConvertFromHMAC(allocation.Key); + + Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); + + Debug.Log($"client: {allocation.AllocationId}"); + + var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); + relayServerData.ComputeNewNonce(); + + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); +#endif } else { @@ -164,6 +223,8 @@ private IEnumerator ClientBindAndConnect(SocketTask task) { Debug.LogError("Client failed to connect to server"); } + + } task.IsDone = true; @@ -195,80 +256,69 @@ private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoin { Debug.LogError("Server failed to listen"); } + + } task.IsDone = true; } - private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) - { - unsafe - { - fixed (byte* ptr = allocationIdBytes) - { - return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); - } - } - } - private static RelayHMACKey ConvertFromHMAC(byte[] hmac) + private IEnumerator StartRelayServer(SocketTask task) { - unsafe - { - fixed (byte* ptr = hmac) - { - return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); - } - } - } +#if !ENABLE_RELAY_SERVICE + Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); + yield return null; +#else + var allocationTask = RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(m_RelayMaxPlayers))); - private static RelayConnectionData ConvertConnectionData(byte[] connectionData) - { - unsafe + while(!allocationTask.IsCompleted) { - fixed (byte* ptr = connectionData) - { - return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); - } + yield return null; } - } - public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) - { - RelayConnectionData hostConnectionData; - - var serverEndpoint = NetworkEndPoint.Parse(ipv4address, port); - var allocationId = ConvertFromAllocationIdBytes(allocationIdBytes); - var key = ConvertFromHMAC(keyBytes); - var connectionData = ConvertConnectionData(connectionDataBytes); - - if (hostConnectionDataBytes != null) + if (allocationTask.IsFaulted) { - hostConnectionData = ConvertConnectionData(hostConnectionDataBytes); + Debug.LogError("Create allocation request failed"); + task.IsDone = true; + task.Success = false; + yield break; } - else + + var allocation = allocationTask.Result.Result.Data.Allocation; + + var joinCodeTask = RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocation.AllocationId))); + + while(!joinCodeTask.IsCompleted) { - hostConnectionData = connectionData; + yield return null; } - m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); - m_RelayServerData.ComputeNewNonce(); - } - private IEnumerator StartRelayServer(SocketTask task) - { - //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use - //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. - if (m_RelayServerData.Equals(DefaultRelayServerData)) + if (joinCodeTask.IsFaulted) { - Debug.LogError("You must set the RelayServerData property to something different from the default value before calling StartRelayServer."); + Debug.LogError("Create join code request failed"); + task.IsDone = true; + task.Success = false; yield break; } - else - { - m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); - yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); - } + m_RelayJoinCode = joinCodeTask.Result.Result.Data.JoinCode; + + var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); + // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); + + var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); + var connectionData = ConvertConnectionData(allocation.ConnectionData); + var key = ConvertFromHMAC(allocation.Key); + + + var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref connectionData, ref key); + relayServerData.ComputeNewNonce(); + + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); + + yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); +#endif } private bool AcceptConnection() @@ -346,15 +396,8 @@ private void Update() if (m_Driver.IsCreated) { m_Driver.ScheduleUpdate().Complete(); - while(AcceptConnection() && m_Driver.IsCreated) - { - ; - } - - while (ProcessEvent() && m_Driver.IsCreated) - { - ; - } + while(AcceptConnection() && m_Driver.IsCreated); + while(ProcessEvent() && m_Driver.IsCreated); } } @@ -374,6 +417,14 @@ private static unsafe NetworkConnection ParseClientId(ulong mlapiConnectionId) return *(NetworkConnection*)&mlapiConnectionId; } + public void SetRelayJoinCode(string value) + { + if (m_State == State.Disconnected) + { + m_RelayJoinCode = value; + } + } + public override void DisconnectLocalClient() { Debug.Assert(m_State == State.Connected, "DisconnectLocalClient should be called on a connected client"); @@ -411,6 +462,7 @@ public override void Init() m_NetworkParameters = new List(); + // If we want to be able to actually handle messages MaximumMessageLength bytes in // size, we need to allow a bit more than that in FragmentationUtility since this needs // to account for headers and such. 128 bytes is plenty enough for such overhead. @@ -418,6 +470,12 @@ public override void Init() m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); m_MessageBuffer = new byte[m_MessageBufferSize]; +#if ENABLE_RELAY_SERVICE + if (m_ProtocolType == ProtocolType.RelayUnityTransport) { + Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayServer; + UnityServices.Initialize(); + } +#endif } public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) @@ -452,9 +510,7 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } if (m_Driver.EndSend(writer) == size) - { return; - } } Debug.LogError("Error sending the message"); @@ -463,9 +519,7 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne public override SocketTasks StartClient() { if (m_Driver.IsCreated) - { return SocketTask.Fault.AsTasks(); - } var task = SocketTask.Working; StartCoroutine(ClientBindAndConnect(task)); @@ -475,9 +529,7 @@ public override SocketTasks StartClient() public override SocketTasks StartServer() { if (m_Driver.IsCreated) - { return SocketTask.Fault.AsTasks(); - } var task = SocketTask.Working; switch (m_ProtocolType) diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 622b00484c..696ebfb440 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -6,7 +6,9 @@ "Unity.Jobs", "Unity.Burst", "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Networking.Transport" + "Unity.Networking.Transport", + "Unity.Services.Relay", + "Unity.Services.Core" ], "includePlatforms": [], "excludePlatforms": [], @@ -15,6 +17,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.services.relay", + "expression": "0.0.1-preview.3", + "define": "ENABLE_RELAY_SERVICE" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 392afb240b..d62a9ab0e6 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -219,18 +219,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 19899154} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!114 &102484700 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, - type: 3} - m_PrefabInstance: {fileID: 1928839749} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 50623966c8d88ab40982cc2b0e4c2d2e, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &225870858 GameObject: m_ObjectHideFlags: 0 @@ -598,7 +586,6 @@ MonoBehaviour: GlobalObjectIdHash: 3604669530 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 --- !u!114 &402668304 MonoBehaviour: m_ObjectHideFlags: 0 @@ -828,7 +815,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 903872102732f5c4cbdd3863de5dbc97, type: 3} m_Name: m_EditorClassIdentifier: - ConnectionScript: {fileID: 102484700} + Transport: {fileID: 620561613} --- !u!114 &509741759 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1110,7 +1097,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 620561609} - m_Enabled: 0 + m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} m_Name: @@ -1153,7 +1140,7 @@ MonoBehaviour: type: 3} NetworkPrefabs: - Override: 0 - Prefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, + Prefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 @@ -1208,6 +1195,8 @@ MonoBehaviour: m_MessageBufferSize: 1024 m_ServerAddress: 127.0.0.1 m_ServerPort: 7777 + m_RelayMaxPlayers: 10 + m_RelayServer: https://relay-allocations-stg.cloud.unity3d.com --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -2190,7 +2179,6 @@ MonoBehaviour: GlobalObjectIdHash: 3972363333 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 --- !u!65 &963826007 BoxCollider: m_ObjectHideFlags: 0 @@ -2282,7 +2270,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 05037a80244af4174806bc7f242e4432, type: 3} m_Name: m_EditorClassIdentifier: - UnityChanPrefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, + UnityChanPrefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, type: 3} --- !u!4 &1202924674 Transform: @@ -2684,7 +2672,6 @@ MonoBehaviour: GlobalObjectIdHash: 1445980162 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 --- !u!54 &1397037320 Rigidbody: m_ObjectHideFlags: 0 @@ -2948,7 +2935,6 @@ MonoBehaviour: GlobalObjectIdHash: 1148320762 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 --- !u!54 &1402467447 Rigidbody: m_ObjectHideFlags: 0 @@ -3359,7 +3345,6 @@ MonoBehaviour: GlobalObjectIdHash: 2710131580 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 --- !u!114 &1475593096 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3604,46 +3589,11 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 1333567166} m_Modifications: - - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: OnStartServerButton - objectReference: {fileID: 0} - - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName - value: ConnectionModeScript, TestProject - objectReference: {fileID: 0} - - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: OnStartClientButton - objectReference: {fileID: 0} - - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName - value: ConnectionModeScript, TestProject - objectReference: {fileID: 0} - - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: OnStartHostButton - objectReference: {fileID: 0} - - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName - value: ConnectionModeScript, TestProject - objectReference: {fileID: 0} - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_JoinCodeInput value: objectReference: {fileID: 509741756} - - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_RelayAllocationBasePath - value: https://relay-allocations-stg.services.api.unity.com - objectReference: {fileID: 0} - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Pivot.x @@ -3852,3 +3802,4 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} + \ No newline at end of file diff --git a/testproject/Assets/Scripts/CommandLineHandler.cs b/testproject/Assets/Scripts/CommandLineHandler.cs index 16f71d1678..6687a82f46 100644 --- a/testproject/Assets/Scripts/CommandLineHandler.cs +++ b/testproject/Assets/Scripts/CommandLineHandler.cs @@ -163,7 +163,7 @@ private void StartServer() m_CommandLineArguments.Remove("-m"); if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartServerButton(); + m_ConnectionModeScript.OnStartServer(); } else { @@ -175,7 +175,7 @@ private void StartHost() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartHostButton(); + m_ConnectionModeScript.OnStartHost(); } else { @@ -187,7 +187,7 @@ private void StartClient() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartClientButton(); + m_ConnectionModeScript.OnStartClient(); } else { diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 185f1d9042..47f0cfdd30 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -3,7 +3,6 @@ using UnityEngine; using MLAPI; using MLAPI.Transports; - #if ENABLE_RELAY_SERVICE using Unity.Services.Core; using Unity.Services.Authentication; @@ -23,19 +22,7 @@ public class ConnectionModeScript : MonoBehaviour [SerializeField] private GameObject m_JoinCodeInput; - [SerializeField] - private int m_MaxConnections = 10; - private CommandLineProcessor m_CommandLineProcessor; - -#if ENABLE_RELAY_SERVICE - [SerializeField] - private string m_RelayAllocationBasePath = "https://relay-allocations-stg.services.api.unity.com"; - - [HideInInspector] - public string RelayJoinCode { get; set; } -#endif - internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) { m_CommandLineProcessor = commandLineProcessor; @@ -51,6 +38,7 @@ internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventHost; public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventClient; + private IEnumerator WaitForNetworkManager() { while(true) @@ -80,10 +68,8 @@ private void Start() if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { m_JoinCodeInput.SetActive(true); - //If Start() is called on the first frame update, it's not likely that the AuthenticationService is going to be instantiated yet - //Moved old logic for this out to OnServicesInitialized - m_ConnectionModeButtons.SetActive(false); - m_AuthenticationButtons.SetActive(true); + m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); + m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); } else #endif @@ -95,158 +81,54 @@ private void Start() } } - private void OnServicesInitialized() - { -#if ENABLE_RELAY_SERVICE - if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) - { - m_JoinCodeInput.SetActive(true); - m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); - m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); - } -#endif - } - /// /// Handles starting MLAPI in server mode /// - public void OnStartServerButton() + public void OnStartServer() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { -#if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayServer(StartServer)); -#else - StartServer(); -#endif - } - } - - private void StartServer() - { - NetworkManager.Singleton.StartServer(); - OnNotifyConnectionEventServer?.Invoke(); - m_ConnectionModeButtons.SetActive(false); - } + NetworkManager.Singleton.StartServer(); + OnNotifyConnectionEventServer?.Invoke(); + m_ConnectionModeButtons.SetActive(false); -#if ENABLE_RELAY_SERVICE - /// - /// Coroutine that handles starting MLAPI in server mode if Relay is enabled - /// - private IEnumerator StartRelayServer(Action postAllocationAction) - { - m_ConnectionModeButtons.SetActive(false); - - var serverRelayUtilityTask = RelayUtility.AllocateRelayServerAndGetJoinCode(m_MaxConnections); - while (!serverRelayUtilityTask.IsCompleted) - { - yield return null; - } - if (serverRelayUtilityTask.IsFaulted) - { - Debug.LogError("Exception thrown when attempting to start Relay Server. Server not started. Exception: " + serverRelayUtilityTask.Exception.Message); - yield break; } - - var (ipv4address, port, allocationIdBytes, connectionData, key, joinCode) = serverRelayUtilityTask.Result; - - RelayJoinCode = joinCode; - - //When starting a relay server, both instances of connection data are identical. - NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); - - postAllocationAction(); } -#endif /// /// Handles starting MLAPI in host mode /// - public void OnStartHostButton() + public void OnStartHost() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { -#if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayServer(StartHost)); -#else - StartHost(); -#endif + NetworkManager.Singleton.StartHost(); + OnNotifyConnectionEventHost?.Invoke(); + m_ConnectionModeButtons.SetActive(false); } } - private void StartHost() - { - NetworkManager.Singleton.StartHost(); - OnNotifyConnectionEventHost?.Invoke(); - m_ConnectionModeButtons.SetActive(false); - } - /// /// Handles starting MLAPI in client mode /// - public void OnStartClientButton() + public void OnStartClient() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { -#if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayClient()); -#else - StartClient(); -#endif + NetworkManager.Singleton.StartClient(); + OnNotifyConnectionEventClient?.Invoke(); + m_ConnectionModeButtons.SetActive(false); } } - private void StartClient() - { - NetworkManager.Singleton.StartClient(); - OnNotifyConnectionEventClient?.Invoke(); - m_ConnectionModeButtons.SetActive(false); - } - -#if ENABLE_RELAY_SERVICE - /// - /// Coroutine that kicks off Relay SDK calls to join a Relay Server instance with a join code - /// - /// - private IEnumerator StartRelayClient() - { - m_ConnectionModeButtons.SetActive(false); - - //assumes that RelayJoinCodeInput populated RelayJoinCode prior to this - var clientRelayUtilityTask = RelayUtility.JoinRelayServerFromJoinCode(RelayJoinCode); - - while (!clientRelayUtilityTask.IsCompleted) - { - yield return null; - } - - if (clientRelayUtilityTask.IsFaulted) - { - Debug.LogError("Exception thrown when attempting to connect to Relay Server. Exception: " + clientRelayUtilityTask.Exception.Message); - yield break; - } - - var (ipv4address, port, allocationIdBytes, connectionData, hostConnectionData, key) = clientRelayUtilityTask.Result; - - //When connecting as a client to a relay server, connectionData and hostConnectionData are different. - NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData, hostConnectionData); - - NetworkManager.Singleton.StartClient(); - OnNotifyConnectionEventClient?.Invoke(); - } -#endif /// - /// Handles authenticating UnityServices, needed for Relay + /// Handles autenticating UnityServices, needed for Relay /// public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayAllocationBasePath; - - await UnityServices.InitializeAsync(); - OnServicesInitialized(); + await UnityServices.Initialize(); await AuthenticationService.Instance.SignInAnonymouslyAsync(); - Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); if (AuthenticationService.Instance.IsSignedIn) diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs index ea4aa8815d..34b3a31e85 100644 --- a/testproject/Assets/Scripts/RelayJoinCodeInput.cs +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -4,7 +4,7 @@ public class RelayJoinCodeInput : MonoBehaviour { - public ConnectionModeScript ConnectionScript; + public UTPTransport Transport; private InputField m_TextInput; private void Start() @@ -15,8 +15,8 @@ private void Start() private void Update() { if (m_TextInput.IsInteractable()) { - if (!string.IsNullOrEmpty(ConnectionScript.RelayJoinCode)) { - m_TextInput.text = ConnectionScript.RelayJoinCode; + if (!string.IsNullOrEmpty(Transport.RelayJoinCode)) { + m_TextInput.text = Transport.RelayJoinCode; m_TextInput.readOnly = true; } } @@ -24,6 +24,6 @@ private void Update() public void SetJoinCode() { - ConnectionScript.RelayJoinCode = m_TextInput.text; + Transport.SetRelayJoinCode(m_TextInput.text); } } diff --git a/testproject/Assets/Scripts/RelayUtility.cs b/testproject/Assets/Scripts/RelayUtility.cs deleted file mode 100644 index 9bf63bce77..0000000000 --- a/testproject/Assets/Scripts/RelayUtility.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Threading.Tasks; -using UnityEngine; -using Unity.Services.Relay; -using Unity.Services.Relay.Allocations; -using Unity.Services.Relay.Models; - -public class RelayUtility -{ - async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) - { - Response allocationResponse; - Response createJoinCodeResponse; - try - { - allocationResponse = await RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(maxConnections, region))); - } - catch - { - Debug.LogError("Relay create allocation request failed"); - throw; - } - - var allocation = allocationResponse.Result.Data.Allocation; - - Debug.Log($"server: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); - Debug.Log($"server: {allocation.AllocationId}"); - - try - { - createJoinCodeResponse = await RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocationResponse.Result.Data.Allocation.AllocationId))); - } - catch - { - Debug.LogError("Relay create join code request failed"); - throw; - } - - return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCodeResponse.Result.Data.JoinCode); - } - - async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) - { - Response joinResponse; - try - { - joinResponse = await RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(joinCode))); - } - catch - { - Debug.LogError("Relay create join code request failed"); - throw; - } - - var allocation = joinResponse.Result.Data.Allocation; - - Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); - Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); - Debug.Log($"client: {allocation.AllocationId}"); - - return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.HostConnectionData, allocation.Key); - } -} diff --git a/testproject/Assets/Scripts/RelayUtility.cs.meta b/testproject/Assets/Scripts/RelayUtility.cs.meta deleted file mode 100644 index b7879fb3a2..0000000000 --- a/testproject/Assets/Scripts/RelayUtility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 821a03e0e4496574c8ca6a558047e944 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 29752e65b8..3a5969d3e1 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -52,7 +52,7 @@ private void HideButtons() public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - await UnityServices.InitializeAsync(); + await UnityServices.Initialize(); Debug.Log("OnSignIn"); await AuthenticationService.Instance.SignInAnonymouslyAsync(); Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index d963bcca5c..d4191ebbdd 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -7,9 +7,7 @@ "Unity.Multiplayer.MLAPI.Prototyping", "Unity.Multiplayer.Transport.UTP", "Unity.Services.Authentication", - "Unity.Services.Core", - "Unity.Networking.Transport", - "Unity.Services.Relay" + "Unity.Services.Core" ], "includePlatforms": [], "excludePlatforms": [], @@ -26,4 +24,4 @@ } ], "noEngineReferences": false -} \ No newline at end of file +} diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 0b493d2cbf..b188cc61ff 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,21 +1,19 @@ { "dependencies": { - "com.unity.collab-proxy": "1.7.1", - "com.unity.ide.rider": "3.0.7", - "com.unity.ide.visualstudio": "2.0.11", + "com.unity.collab-proxy": "1.5.7", + "com.unity.ide.rider": "3.0.5", + "com.unity.ide.visualstudio": "2.0.9", "com.unity.ide.vscode": "1.2.3", - "com.unity.mathematics": "1.2.1", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.unity.package-validation-suite": "0.21.0-preview", - "com.unity.services.authentication": "1.0.0-pre.4", - "com.unity.services.core": "1.1.0-pre.8", - "com.unity.services.relay": "1.0.0-preview.1", + "com.unity.package-validation-suite": "0.19.2-preview", + "com.unity.services.authentication": "0.5.0-preview", + "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.relay": "0.0.1-preview.5", "com.unity.test-framework": "1.1.27", - "com.unity.test-framework.performance": "2.8.0-preview", + "com.unity.test-framework.performance": "2.3.1-preview", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.5.6", - "com.unity.transport": "1.0.0-pre.1", + "com.unity.timeline": "1.5.2", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index f2acdb609d..b5cc63a745 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -2,7 +2,7 @@ "dependencies": { "com.unity.burst": { "version": "1.5.3", - "depth": 2, + "depth": 3, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1" @@ -10,7 +10,7 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.7.1", + "version": "1.5.7", "depth": 0, "source": "registry", "dependencies": { @@ -20,7 +20,7 @@ }, "com.unity.collections": { "version": "1.0.0-pre.3", - "depth": 1, + "depth": 2, "source": "registry", "dependencies": { "com.unity.burst": "1.5.3", @@ -36,16 +36,14 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.7", + "version": "3.0.5", "depth": 0, "source": "registry", - "dependencies": { - "com.unity.ext.nunit": "1.0.6" - }, + "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.11", + "version": "2.0.9", "depth": 0, "source": "registry", "dependencies": { @@ -72,7 +70,7 @@ }, "com.unity.mathematics": { "version": "1.2.1", - "depth": 0, + "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -112,7 +110,7 @@ "url": "https://packages.unity.com" }, "com.unity.package-validation-suite": { - "version": "0.21.0-preview", + "version": "0.19.2-preview", "depth": 0, "source": "registry", "dependencies": { @@ -121,31 +119,32 @@ "url": "https://packages.unity.com" }, "com.unity.services.authentication": { - "version": "1.0.0-pre.4", + "version": "0.5.0-preview", "depth": 0, "source": "registry", "dependencies": { "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.services.core": "1.1.0-pre.8", + "com.unity.services.core": "1.1.0-pre.2", "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.core": { - "version": "1.1.0-pre.8", + "version": "1.1.0-pre.2", "depth": 0, "source": "registry", "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.nuget.newtonsoft-json": "2.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.relay": { - "version": "1.0.0-preview.1", + "version": "0.0.1-preview.5", "depth": 0, "source": "registry", "dependencies": { - "com.unity.services.core": "1.1.0-pre.4", + "com.unity.services.core": "1.1.0-pre.2", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", @@ -167,12 +166,12 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "2.8.0-preview", + "version": "2.3.1-preview", "depth": 0, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.nuget.newtonsoft-json": "2.0.0-preview" }, "url": "https://packages.unity.com" }, @@ -186,7 +185,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.5.6", + "version": "1.5.2", "depth": 0, "source": "registry", "dependencies": { @@ -198,8 +197,8 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "1.0.0-pre.1", - "depth": 0, + "version": "0.9.0-preview.3", + "depth": 1, "source": "registry", "dependencies": { "com.unity.collections": "1.0.0-pre.3", diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 8dd731d6ee..96699ff538 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -555,7 +555,6 @@ PlayerSettings: ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 ps4CompatibilityPS5: 0 - ps4AllowPS5Detection: 0 ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] @@ -581,7 +580,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - 1: AUTHENTICATION_TESTING_STAGING_UAS + 1: AUTHENTICATION_TESTING_STAGING_UAS; additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -657,14 +656,7 @@ PlayerSettings: XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: - Analytics: 0 - Build: 0 - Collab: 0 - Game Performance: 0 - Purchasing: 0 - UDP: 0 UNet: 1 - Unity Ads: 0 luminIcon: m_Name: m_ModelFolderPath: @@ -678,11 +670,11 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: 41b4b759-38bb-46fb-9eb2-b233a90bade7 + cloudProjectId: 29e7e6bb-3cf4-46ea-bdc9-b9581a9d0b47 framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: relay-stg - organizationId: relay-stg + projectName: testproject + organizationId: mlapi-test cloudEnabled: 0 legacyClampBlendShapeWeights: 0 virtualTexturingSupportEnabled: 0 diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 5ac0724b15..79c71bce82 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.3.15f2 -m_EditorVersionWithRevision: 2020.3.15f2 (6cf78cb77498) +m_EditorVersion: 2020.3.12f1 +m_EditorVersionWithRevision: 2020.3.12f1 (b3b2c6512326) From b8be4a4bdf042da2ce1b9de9e82fe2137577cc28 Mon Sep 17 00:00:00 2001 From: thoward-unity <87874023+thoward-unity@users.noreply.github.com> Date: Tue, 10 Aug 2021 13:54:13 -0400 Subject: [PATCH 24/65] Feature/initial relay utp remove relay sdk calls (#1034) * DST-528: Extracted Relay SDK calls out of UTP adapter for MLAPI; it now accepts a variable passed in via a setter method. Also updated the sample test project included to illustrate these changes. * DST-528: Made some changes that address feedback comments; mainly restructured the manner that code external to UTPTransport passes in the requisite relay server data so that external code doesn't need to know about the internal data structures that UTPTransport uses. * DST-528: Removing minor changes that were erroneously left in when taking other approaches. * DST-528: Addressing minor code review changes. * Revert "Revert "Feature/initial relay utp remove relay sdk calls (#1032)" (#1033)" This reverts commit cd545291db9e6fed5c08474cdc704397e2e271ca. --- .../Runtime/UTPTransport.cs | 217 +++++++----------- ...com.unity.multiplayer.transport.utp.asmdef | 12 +- testproject/Assets/Scenes/SampleScene.unity | 63 ++++- .../Assets/Scripts/CommandLineHandler.cs | 6 +- .../Assets/Scripts/ConnectionModeScript.cs | 152 ++++++++++-- .../Assets/Scripts/RelayJoinCodeInput.cs | 8 +- testproject/Assets/Scripts/RelayUtility.cs | 62 +++++ .../Assets/Scripts/RelayUtility.cs.meta | 11 + testproject/Assets/Scripts/UIController.cs | 2 +- testproject/Assets/Scripts/testproject.asmdef | 3 +- testproject/Packages/manifest.json | 20 +- testproject/Packages/packages-lock.json | 41 ++-- .../ProjectSettings/ProjectSettings.asset | 16 +- .../ProjectSettings/ProjectVersion.txt | 4 +- 14 files changed, 405 insertions(+), 212 deletions(-) create mode 100644 testproject/Assets/Scripts/RelayUtility.cs create mode 100644 testproject/Assets/Scripts/RelayUtility.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 37358f16a1..56c0f8c3e1 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -4,12 +4,6 @@ using System.Threading.Tasks; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; -#if ENABLE_RELAY_SERVICE -using Unity.Services.Relay; -using Unity.Services.Relay.Allocations; -using Unity.Services.Relay.Models; -using Unity.Services.Core; -#endif using MLAPI.Transports.Tasks; using UnityEngine; @@ -42,14 +36,11 @@ private enum State [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; - [SerializeField] private int m_RelayMaxPlayers = 10; - [SerializeField] private string m_RelayServer = "https://relay-allocations.cloud.unity3d.com"; private State m_State = State.Disconnected; private NetworkDriver m_Driver; private List m_NetworkParameters; private byte[] m_MessageBuffer; - private string m_RelayJoinCode; private ulong m_ServerClientId; private NetworkPipeline m_UnreliableSequencedPipeline; @@ -58,16 +49,20 @@ private enum State public override ulong ServerClientId => m_ServerClientId; - public string RelayJoinCode => m_RelayJoinCode; - public ProtocolType Protocol => m_ProtocolType; + private RelayServerData m_RelayServerData; + private void InitDriver() { if (m_NetworkParameters.Count > 0) + { m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); + } else + { m_Driver = NetworkDriver.Create(); + } m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); @@ -79,39 +74,8 @@ private void InitDriver() private void DisposeDriver() { if (m_Driver.IsCreated) - m_Driver.Dispose(); - } - - private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) - { - unsafe { - fixed (byte* ptr = allocationIdBytes) - { - return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); - } - } - } - - private static RelayHMACKey ConvertFromHMAC(byte[] hmac) - { - unsafe - { - fixed (byte* ptr = hmac) - { - return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); - } - } - } - - private static RelayConnectionData ConvertConnectionData(byte[] connectionData) - { - unsafe - { - fixed (byte* ptr = connectionData) - { - return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); - } + m_Driver.Dispose(); } } @@ -134,7 +98,9 @@ private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) case NetworkDelivery.ReliableFragmentedSequenced: // No need to send on the fragmented pipeline if data is smaller than MTU. if (size < NetworkParameterConstants.MTU) + { return m_ReliableSequencedPipeline; + } return m_ReliableSequencedFragmentedPipeline; @@ -150,43 +116,17 @@ private IEnumerator ClientBindAndConnect(SocketTask task) if (m_ProtocolType == ProtocolType.RelayUnityTransport) { -#if !ENABLE_RELAY_SERVICE - Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); - yield return null; -#else - var joinTask = RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(m_RelayJoinCode))); - - while(!joinTask.IsCompleted) - yield return null; - - if (joinTask.IsFaulted) + //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use + //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. + if(m_RelayServerData.Equals(default(RelayServerData))) { - Debug.LogError("Join Relay request failed"); + Debug.LogError("You must call SetRelayServerData() at least once before calling StartRelayServer."); task.IsDone = true; task.Success = false; yield break; } - var allocation = joinTask.Result.Result.Data.Allocation; - - serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - - var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); - - var connectionData = ConvertConnectionData(allocation.ConnectionData); - var hostConnectionData = ConvertConnectionData(allocation.HostConnectionData); - var key = ConvertFromHMAC(allocation.Key); - - Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); - Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); - - Debug.Log($"client: {allocation.AllocationId}"); - - var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); - relayServerData.ComputeNewNonce(); - - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); -#endif + m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = m_RelayServerData }); } else { @@ -223,8 +163,6 @@ private IEnumerator ClientBindAndConnect(SocketTask task) { Debug.LogError("Client failed to connect to server"); } - - } task.IsDone = true; @@ -256,69 +194,82 @@ private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoin { Debug.LogError("Server failed to listen"); } - - } task.IsDone = true; } - - private IEnumerator StartRelayServer(SocketTask task) + private static RelayAllocationId ConvertFromAllocationIdBytes(byte[] allocationIdBytes) { -#if !ENABLE_RELAY_SERVICE - Debug.LogError("You must have Relay SDK installed via the UDash in order to use the relay transport"); - yield return null; -#else - var allocationTask = RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(m_RelayMaxPlayers))); - - while(!allocationTask.IsCompleted) + unsafe { - yield return null; + fixed (byte* ptr = allocationIdBytes) + { + return RelayAllocationId.FromBytePointer(ptr, allocationIdBytes.Length); + } } + } - if (allocationTask.IsFaulted) + private static RelayHMACKey ConvertFromHMAC(byte[] hmac) + { + unsafe { - Debug.LogError("Create allocation request failed"); - task.IsDone = true; - task.Success = false; - yield break; + fixed (byte* ptr = hmac) + { + return RelayHMACKey.FromBytePointer(ptr, RelayHMACKey.k_Length); + } } + } - var allocation = allocationTask.Result.Result.Data.Allocation; - - var joinCodeTask = RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocation.AllocationId))); + private static RelayConnectionData ConvertConnectionData(byte[] connectionData) + { + unsafe + { + fixed (byte* ptr = connectionData) + { + return RelayConnectionData.FromBytePointer(ptr, RelayConnectionData.k_Length); + } + } + } - while(!joinCodeTask.IsCompleted) + public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) + { + RelayConnectionData hostConnectionData; + + var serverEndpoint = NetworkEndPoint.Parse(ipv4address, port); + var allocationId = ConvertFromAllocationIdBytes(allocationIdBytes); + var key = ConvertFromHMAC(keyBytes); + var connectionData = ConvertConnectionData(connectionDataBytes); + + if (hostConnectionDataBytes != null) + { + hostConnectionData = ConvertConnectionData(hostConnectionDataBytes); + } + else { - yield return null; + hostConnectionData = connectionData; } + m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); + m_RelayServerData.ComputeNewNonce(); + } - if (joinCodeTask.IsFaulted) + private IEnumerator StartRelayServer(SocketTask task) + { + //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use + //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. + if (m_RelayServerData.Equals(default(RelayServerData))) { - Debug.LogError("Create join code request failed"); + Debug.LogError("You must call SetRelayServerData() at least once before calling StartRelayServer."); task.IsDone = true; task.Success = false; yield break; } + else + { + m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); - m_RelayJoinCode = joinCodeTask.Result.Result.Data.JoinCode; - - var serverEndpoint = NetworkEndPoint.Parse(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port); - // Debug.Log($"Relay Server endpoint: {allocation.RelayServer.IpV4}:{(ushort)allocation.RelayServer.Port}"); - - var allocationId = ConvertFromAllocationIdBytes(allocation.AllocationIdBytes); - var connectionData = ConvertConnectionData(allocation.ConnectionData); - var key = ConvertFromHMAC(allocation.Key); - - - var relayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref connectionData, ref key); - relayServerData.ComputeNewNonce(); - - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = relayServerData }); - - yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); -#endif + yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); + } } private bool AcceptConnection() @@ -396,8 +347,15 @@ private void Update() if (m_Driver.IsCreated) { m_Driver.ScheduleUpdate().Complete(); - while(AcceptConnection() && m_Driver.IsCreated); - while(ProcessEvent() && m_Driver.IsCreated); + while(AcceptConnection() && m_Driver.IsCreated) + { + ; + } + + while (ProcessEvent() && m_Driver.IsCreated) + { + ; + } } } @@ -417,14 +375,6 @@ private static unsafe NetworkConnection ParseClientId(ulong mlapiConnectionId) return *(NetworkConnection*)&mlapiConnectionId; } - public void SetRelayJoinCode(string value) - { - if (m_State == State.Disconnected) - { - m_RelayJoinCode = value; - } - } - public override void DisconnectLocalClient() { Debug.Assert(m_State == State.Connected, "DisconnectLocalClient should be called on a connected client"); @@ -462,7 +412,6 @@ public override void Init() m_NetworkParameters = new List(); - // If we want to be able to actually handle messages MaximumMessageLength bytes in // size, we need to allow a bit more than that in FragmentationUtility since this needs // to account for headers and such. 128 bytes is plenty enough for such overhead. @@ -470,12 +419,6 @@ public override void Init() m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); m_MessageBuffer = new byte[m_MessageBufferSize]; -#if ENABLE_RELAY_SERVICE - if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayServer; - UnityServices.Initialize(); - } -#endif } public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) @@ -510,7 +453,9 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } if (m_Driver.EndSend(writer) == size) + { return; + } } Debug.LogError("Error sending the message"); @@ -519,7 +464,9 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne public override SocketTasks StartClient() { if (m_Driver.IsCreated) + { return SocketTask.Fault.AsTasks(); + } var task = SocketTask.Working; StartCoroutine(ClientBindAndConnect(task)); @@ -529,7 +476,9 @@ public override SocketTasks StartClient() public override SocketTasks StartServer() { if (m_Driver.IsCreated) + { return SocketTask.Fault.AsTasks(); + } var task = SocketTask.Working; switch (m_ProtocolType) diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef index 696ebfb440..622b00484c 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef @@ -6,9 +6,7 @@ "Unity.Jobs", "Unity.Burst", "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Networking.Transport", - "Unity.Services.Relay", - "Unity.Services.Core" + "Unity.Networking.Transport" ], "includePlatforms": [], "excludePlatforms": [], @@ -17,12 +15,6 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [ - { - "name": "com.unity.services.relay", - "expression": "0.0.1-preview.3", - "define": "ENABLE_RELAY_SERVICE" - } - ], + "versionDefines": [], "noEngineReferences": false } \ No newline at end of file diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index d62a9ab0e6..392afb240b 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -219,6 +219,18 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 19899154} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &102484700 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, + type: 3} + m_PrefabInstance: {fileID: 1928839749} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 50623966c8d88ab40982cc2b0e4c2d2e, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &225870858 GameObject: m_ObjectHideFlags: 0 @@ -586,6 +598,7 @@ MonoBehaviour: GlobalObjectIdHash: 3604669530 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &402668304 MonoBehaviour: m_ObjectHideFlags: 0 @@ -815,7 +828,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 903872102732f5c4cbdd3863de5dbc97, type: 3} m_Name: m_EditorClassIdentifier: - Transport: {fileID: 620561613} + ConnectionScript: {fileID: 102484700} --- !u!114 &509741759 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1097,7 +1110,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 620561609} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} m_Name: @@ -1140,7 +1153,7 @@ MonoBehaviour: type: 3} NetworkPrefabs: - Override: 0 - Prefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, + Prefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, type: 3} SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 @@ -1195,8 +1208,6 @@ MonoBehaviour: m_MessageBufferSize: 1024 m_ServerAddress: 127.0.0.1 m_ServerPort: 7777 - m_RelayMaxPlayers: 10 - m_RelayServer: https://relay-allocations-stg.cloud.unity3d.com --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -2179,6 +2190,7 @@ MonoBehaviour: GlobalObjectIdHash: 3972363333 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!65 &963826007 BoxCollider: m_ObjectHideFlags: 0 @@ -2270,7 +2282,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 05037a80244af4174806bc7f242e4432, type: 3} m_Name: m_EditorClassIdentifier: - UnityChanPrefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, + UnityChanPrefab: {fileID: 8133991607019124060, guid: 421bcf732fe69486d8abecfa5eee63bb, type: 3} --- !u!4 &1202924674 Transform: @@ -2672,6 +2684,7 @@ MonoBehaviour: GlobalObjectIdHash: 1445980162 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1397037320 Rigidbody: m_ObjectHideFlags: 0 @@ -2935,6 +2948,7 @@ MonoBehaviour: GlobalObjectIdHash: 1148320762 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1402467447 Rigidbody: m_ObjectHideFlags: 0 @@ -3345,6 +3359,7 @@ MonoBehaviour: GlobalObjectIdHash: 2710131580 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &1475593096 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3589,11 +3604,46 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 1333567166} m_Modifications: + - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartServerButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122089128464, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} + - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartClientButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122546206394, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} + - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnStartHostButton + objectReference: {fileID: 0} + - target: {fileID: 2956145122624039697, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: ConnectionModeScript, TestProject + objectReference: {fileID: 0} - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_JoinCodeInput value: objectReference: {fileID: 509741756} + - target: {fileID: 4850072633501053442, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_RelayAllocationBasePath + value: https://relay-allocations-stg.services.api.unity.com + objectReference: {fileID: 0} - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Pivot.x @@ -3802,4 +3852,3 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} - \ No newline at end of file diff --git a/testproject/Assets/Scripts/CommandLineHandler.cs b/testproject/Assets/Scripts/CommandLineHandler.cs index 6687a82f46..16f71d1678 100644 --- a/testproject/Assets/Scripts/CommandLineHandler.cs +++ b/testproject/Assets/Scripts/CommandLineHandler.cs @@ -163,7 +163,7 @@ private void StartServer() m_CommandLineArguments.Remove("-m"); if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartServer(); + m_ConnectionModeScript.OnStartServerButton(); } else { @@ -175,7 +175,7 @@ private void StartHost() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartHost(); + m_ConnectionModeScript.OnStartHostButton(); } else { @@ -187,7 +187,7 @@ private void StartClient() { if (m_ConnectionModeScript) { - m_ConnectionModeScript.OnStartClient(); + m_ConnectionModeScript.OnStartClientButton(); } else { diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 47f0cfdd30..185f1d9042 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -3,6 +3,7 @@ using UnityEngine; using MLAPI; using MLAPI.Transports; + #if ENABLE_RELAY_SERVICE using Unity.Services.Core; using Unity.Services.Authentication; @@ -22,7 +23,19 @@ public class ConnectionModeScript : MonoBehaviour [SerializeField] private GameObject m_JoinCodeInput; + [SerializeField] + private int m_MaxConnections = 10; + private CommandLineProcessor m_CommandLineProcessor; + +#if ENABLE_RELAY_SERVICE + [SerializeField] + private string m_RelayAllocationBasePath = "https://relay-allocations-stg.services.api.unity.com"; + + [HideInInspector] + public string RelayJoinCode { get; set; } +#endif + internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) { m_CommandLineProcessor = commandLineProcessor; @@ -38,7 +51,6 @@ internal void SetCommandLineHandler(CommandLineProcessor commandLineProcessor) public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventHost; public event OnNotifyConnectionEventDelegateHandler OnNotifyConnectionEventClient; - private IEnumerator WaitForNetworkManager() { while(true) @@ -68,8 +80,10 @@ private void Start() if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { m_JoinCodeInput.SetActive(true); - m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); - m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); + //If Start() is called on the first frame update, it's not likely that the AuthenticationService is going to be instantiated yet + //Moved old logic for this out to OnServicesInitialized + m_ConnectionModeButtons.SetActive(false); + m_AuthenticationButtons.SetActive(true); } else #endif @@ -81,54 +95,158 @@ private void Start() } } + private void OnServicesInitialized() + { +#if ENABLE_RELAY_SERVICE + if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + { + m_JoinCodeInput.SetActive(true); + m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); + m_AuthenticationButtons.SetActive(NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && !AuthenticationService.Instance.IsSignedIn); + } +#endif + } + /// /// Handles starting MLAPI in server mode /// - public void OnStartServer() + public void OnStartServerButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartServer(); - OnNotifyConnectionEventServer?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayServer(StartServer)); +#else + StartServer(); +#endif + } + } + + private void StartServer() + { + NetworkManager.Singleton.StartServer(); + OnNotifyConnectionEventServer?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } +#if ENABLE_RELAY_SERVICE + /// + /// Coroutine that handles starting MLAPI in server mode if Relay is enabled + /// + private IEnumerator StartRelayServer(Action postAllocationAction) + { + m_ConnectionModeButtons.SetActive(false); + + var serverRelayUtilityTask = RelayUtility.AllocateRelayServerAndGetJoinCode(m_MaxConnections); + while (!serverRelayUtilityTask.IsCompleted) + { + yield return null; + } + if (serverRelayUtilityTask.IsFaulted) + { + Debug.LogError("Exception thrown when attempting to start Relay Server. Server not started. Exception: " + serverRelayUtilityTask.Exception.Message); + yield break; } + + var (ipv4address, port, allocationIdBytes, connectionData, key, joinCode) = serverRelayUtilityTask.Result; + + RelayJoinCode = joinCode; + + //When starting a relay server, both instances of connection data are identical. + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); + + postAllocationAction(); } +#endif /// /// Handles starting MLAPI in host mode /// - public void OnStartHost() + public void OnStartHostButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartHost(); - OnNotifyConnectionEventHost?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayServer(StartHost)); +#else + StartHost(); +#endif } } + private void StartHost() + { + NetworkManager.Singleton.StartHost(); + OnNotifyConnectionEventHost?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } + /// /// Handles starting MLAPI in client mode /// - public void OnStartClient() + public void OnStartClientButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { - NetworkManager.Singleton.StartClient(); - OnNotifyConnectionEventClient?.Invoke(); - m_ConnectionModeButtons.SetActive(false); +#if ENABLE_RELAY_SERVICE + StartCoroutine(StartRelayClient()); +#else + StartClient(); +#endif } } + private void StartClient() + { + NetworkManager.Singleton.StartClient(); + OnNotifyConnectionEventClient?.Invoke(); + m_ConnectionModeButtons.SetActive(false); + } + +#if ENABLE_RELAY_SERVICE + /// + /// Coroutine that kicks off Relay SDK calls to join a Relay Server instance with a join code + /// + /// + private IEnumerator StartRelayClient() + { + m_ConnectionModeButtons.SetActive(false); + + //assumes that RelayJoinCodeInput populated RelayJoinCode prior to this + var clientRelayUtilityTask = RelayUtility.JoinRelayServerFromJoinCode(RelayJoinCode); + + while (!clientRelayUtilityTask.IsCompleted) + { + yield return null; + } + + if (clientRelayUtilityTask.IsFaulted) + { + Debug.LogError("Exception thrown when attempting to connect to Relay Server. Exception: " + clientRelayUtilityTask.Exception.Message); + yield break; + } + + var (ipv4address, port, allocationIdBytes, connectionData, hostConnectionData, key) = clientRelayUtilityTask.Result; + + //When connecting as a client to a relay server, connectionData and hostConnectionData are different. + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData, hostConnectionData); + + NetworkManager.Singleton.StartClient(); + OnNotifyConnectionEventClient?.Invoke(); + } +#endif /// - /// Handles autenticating UnityServices, needed for Relay + /// Handles authenticating UnityServices, needed for Relay /// public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - await UnityServices.Initialize(); + Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayAllocationBasePath; + + await UnityServices.InitializeAsync(); + OnServicesInitialized(); await AuthenticationService.Instance.SignInAnonymouslyAsync(); + Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); if (AuthenticationService.Instance.IsSignedIn) diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs index 34b3a31e85..ea4aa8815d 100644 --- a/testproject/Assets/Scripts/RelayJoinCodeInput.cs +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -4,7 +4,7 @@ public class RelayJoinCodeInput : MonoBehaviour { - public UTPTransport Transport; + public ConnectionModeScript ConnectionScript; private InputField m_TextInput; private void Start() @@ -15,8 +15,8 @@ private void Start() private void Update() { if (m_TextInput.IsInteractable()) { - if (!string.IsNullOrEmpty(Transport.RelayJoinCode)) { - m_TextInput.text = Transport.RelayJoinCode; + if (!string.IsNullOrEmpty(ConnectionScript.RelayJoinCode)) { + m_TextInput.text = ConnectionScript.RelayJoinCode; m_TextInput.readOnly = true; } } @@ -24,6 +24,6 @@ private void Update() public void SetJoinCode() { - Transport.SetRelayJoinCode(m_TextInput.text); + ConnectionScript.RelayJoinCode = m_TextInput.text; } } diff --git a/testproject/Assets/Scripts/RelayUtility.cs b/testproject/Assets/Scripts/RelayUtility.cs new file mode 100644 index 0000000000..9bf63bce77 --- /dev/null +++ b/testproject/Assets/Scripts/RelayUtility.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using UnityEngine; +using Unity.Services.Relay; +using Unity.Services.Relay.Allocations; +using Unity.Services.Relay.Models; + +public class RelayUtility +{ + async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) + { + Response allocationResponse; + Response createJoinCodeResponse; + try + { + allocationResponse = await RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(maxConnections, region))); + } + catch + { + Debug.LogError("Relay create allocation request failed"); + throw; + } + + var allocation = allocationResponse.Result.Data.Allocation; + + Debug.Log($"server: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"server: {allocation.AllocationId}"); + + try + { + createJoinCodeResponse = await RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocationResponse.Result.Data.Allocation.AllocationId))); + } + catch + { + Debug.LogError("Relay create join code request failed"); + throw; + } + + return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCodeResponse.Result.Data.JoinCode); + } + + async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) + { + Response joinResponse; + try + { + joinResponse = await RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(joinCode))); + } + catch + { + Debug.LogError("Relay create join code request failed"); + throw; + } + + var allocation = joinResponse.Result.Data.Allocation; + + Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); + Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); + Debug.Log($"client: {allocation.AllocationId}"); + + return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.HostConnectionData, allocation.Key); + } +} diff --git a/testproject/Assets/Scripts/RelayUtility.cs.meta b/testproject/Assets/Scripts/RelayUtility.cs.meta new file mode 100644 index 0000000000..b7879fb3a2 --- /dev/null +++ b/testproject/Assets/Scripts/RelayUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 821a03e0e4496574c8ca6a558047e944 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 3a5969d3e1..29752e65b8 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -52,7 +52,7 @@ private void HideButtons() public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - await UnityServices.Initialize(); + await UnityServices.InitializeAsync(); Debug.Log("OnSignIn"); await AuthenticationService.Instance.SignInAnonymouslyAsync(); Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index d4191ebbdd..20d772ff3d 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -7,7 +7,8 @@ "Unity.Multiplayer.MLAPI.Prototyping", "Unity.Multiplayer.Transport.UTP", "Unity.Services.Authentication", - "Unity.Services.Core" + "Unity.Services.Core", + "Unity.Services.Relay" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index b188cc61ff..0b493d2cbf 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,19 +1,21 @@ { "dependencies": { - "com.unity.collab-proxy": "1.5.7", - "com.unity.ide.rider": "3.0.5", - "com.unity.ide.visualstudio": "2.0.9", + "com.unity.collab-proxy": "1.7.1", + "com.unity.ide.rider": "3.0.7", + "com.unity.ide.visualstudio": "2.0.11", "com.unity.ide.vscode": "1.2.3", + "com.unity.mathematics": "1.2.1", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.unity.package-validation-suite": "0.19.2-preview", - "com.unity.services.authentication": "0.5.0-preview", - "com.unity.services.core": "1.1.0-pre.2", - "com.unity.services.relay": "0.0.1-preview.5", + "com.unity.package-validation-suite": "0.21.0-preview", + "com.unity.services.authentication": "1.0.0-pre.4", + "com.unity.services.core": "1.1.0-pre.8", + "com.unity.services.relay": "1.0.0-preview.1", "com.unity.test-framework": "1.1.27", - "com.unity.test-framework.performance": "2.3.1-preview", + "com.unity.test-framework.performance": "2.8.0-preview", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.5.2", + "com.unity.timeline": "1.5.6", + "com.unity.transport": "1.0.0-pre.1", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index b5cc63a745..f2acdb609d 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -2,7 +2,7 @@ "dependencies": { "com.unity.burst": { "version": "1.5.3", - "depth": 3, + "depth": 2, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1" @@ -10,7 +10,7 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.5.7", + "version": "1.7.1", "depth": 0, "source": "registry", "dependencies": { @@ -20,7 +20,7 @@ }, "com.unity.collections": { "version": "1.0.0-pre.3", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.burst": "1.5.3", @@ -36,14 +36,16 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.5", + "version": "3.0.7", "depth": 0, "source": "registry", - "dependencies": {}, + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.9", + "version": "2.0.11", "depth": 0, "source": "registry", "dependencies": { @@ -70,7 +72,7 @@ }, "com.unity.mathematics": { "version": "1.2.1", - "depth": 2, + "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -110,7 +112,7 @@ "url": "https://packages.unity.com" }, "com.unity.package-validation-suite": { - "version": "0.19.2-preview", + "version": "0.21.0-preview", "depth": 0, "source": "registry", "dependencies": { @@ -119,32 +121,31 @@ "url": "https://packages.unity.com" }, "com.unity.services.authentication": { - "version": "0.5.0-preview", + "version": "1.0.0-pre.4", "depth": 0, "source": "registry", "dependencies": { "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.core": "1.1.0-pre.8", "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.core": { - "version": "1.1.0-pre.2", + "version": "1.1.0-pre.8", "depth": 0, "source": "registry", "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.nuget.newtonsoft-json": "2.0.0" + "com.unity.modules.unitywebrequest": "1.0.0" }, "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.services.relay": { - "version": "0.0.1-preview.5", + "version": "1.0.0-preview.1", "depth": 0, "source": "registry", "dependencies": { - "com.unity.services.core": "1.1.0-pre.2", + "com.unity.services.core": "1.1.0-pre.4", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", @@ -166,12 +167,12 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "2.3.1-preview", + "version": "2.8.0-preview", "depth": 0, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.0", - "com.unity.nuget.newtonsoft-json": "2.0.0-preview" + "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -185,7 +186,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.5.2", + "version": "1.5.6", "depth": 0, "source": "registry", "dependencies": { @@ -197,8 +198,8 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "0.9.0-preview.3", - "depth": 1, + "version": "1.0.0-pre.1", + "depth": 0, "source": "registry", "dependencies": { "com.unity.collections": "1.0.0-pre.3", diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 96699ff538..8dd731d6ee 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -555,6 +555,7 @@ PlayerSettings: ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] @@ -580,7 +581,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - 1: AUTHENTICATION_TESTING_STAGING_UAS; + 1: AUTHENTICATION_TESTING_STAGING_UAS additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -656,7 +657,14 @@ PlayerSettings: XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: + Analytics: 0 + Build: 0 + Collab: 0 + Game Performance: 0 + Purchasing: 0 + UDP: 0 UNet: 1 + Unity Ads: 0 luminIcon: m_Name: m_ModelFolderPath: @@ -670,11 +678,11 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: 29e7e6bb-3cf4-46ea-bdc9-b9581a9d0b47 + cloudProjectId: 41b4b759-38bb-46fb-9eb2-b233a90bade7 framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: testproject - organizationId: mlapi-test + projectName: relay-stg + organizationId: relay-stg cloudEnabled: 0 legacyClampBlendShapeWeights: 0 virtualTexturingSupportEnabled: 0 diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 79c71bce82..5ac0724b15 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.3.12f1 -m_EditorVersionWithRevision: 2020.3.12f1 (b3b2c6512326) +m_EditorVersion: 2020.3.15f2 +m_EditorVersionWithRevision: 2020.3.15f2 (6cf78cb77498) From 5a489a8c0d62c3a28e31e44dc322e4717a6a1a41 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 18 Aug 2021 14:22:13 +0200 Subject: [PATCH 25/65] Adding some more options exposed and also logging the result of a failed begin/end send --- .../Runtime/UTPTransport.cs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 56c0f8c3e1..6ce04d277d 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -34,6 +34,9 @@ private enum State [SerializeField] private ProtocolType m_ProtocolType; [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; + [SerializeField] private int m_ReciveQueueSize = 128; + [SerializeField] private int m_SendQueueSize = 128; + [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; @@ -240,7 +243,7 @@ public void SetRelayServerData(string ipv4address, ushort port, byte[] allocatio var allocationId = ConvertFromAllocationIdBytes(allocationIdBytes); var key = ConvertFromHMAC(keyBytes); var connectionData = ConvertConnectionData(connectionDataBytes); - + if (hostConnectionDataBytes != null) { hostConnectionData = ConvertConnectionData(hostConnectionDataBytes); @@ -417,6 +420,12 @@ public override void Init() // to account for headers and such. 128 bytes is plenty enough for such overhead. var maxFragmentationCapacity = MaximumMessageLength + 128; m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); + m_NetworkParameters.Add(new BaselibNetworkParameter() + { + maximumPayloadSize = (uint)m_MessageBufferSize, + receiveQueueCapacity = m_ReciveQueueSize, + sendQueueCapacity = m_SendQueueSize + }); m_MessageBuffer = new byte[m_MessageBufferSize]; } @@ -435,8 +444,8 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne var size = data.Count + 5; var pipeline = SelectSendPipeline(networkChannel, size); - - if (m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, size) == 0) + var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, size); + if (result == 0) { writer.WriteByte((byte)networkChannel); writer.WriteInt(data.Count); @@ -451,14 +460,14 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } } } - - if (m_Driver.EndSend(writer) == size) + result = m_Driver.EndSend(writer); + if (result == size) { return; } } - Debug.LogError("Error sending the message"); + Debug.LogError($"Error sending the message {result}"); } public override SocketTasks StartClient() From 35c6588ce961f044063253744e034661b51b0f72 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 18 Aug 2021 14:45:16 +0200 Subject: [PATCH 26/65] fix: Fixing broken tests and compile issues --- .../Runtime/UTPTransport.cs | 7 +- .../Tests/Runtime/ChannelsTests.cs | 22 ++--- .../Tests/Runtime/ConnectionTests.cs | 5 +- .../Tests/Runtime/Helpers/DriverClient.cs | 3 +- .../Runtime/Helpers/RuntimeTestsHelpers.cs | 4 +- .../Tests/Runtime/TransportTests.cs | 3 +- ...tiplayer.transport.utp.runtimetests.asmdef | 21 +++- testproject/Packages/packages-lock.json | 97 +++++++++++++------ 8 files changed, 107 insertions(+), 55 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 6ce04d277d..9748ecb0a9 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -5,15 +5,16 @@ using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; -using MLAPI.Transports.Tasks; +using Unity.Netcode; using UnityEngine; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; using System.Linq; using Unity.Networking.Transport.Utilities; +using NetworkEvent = Unity.Netcode.NetworkEvent; -namespace MLAPI.Transports +namespace Unity.Netcode { public class UTPTransport : NetworkTransport { @@ -84,7 +85,7 @@ private void DisposeDriver() private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) { - TransportChannel transportChannel = Array.Find(MLAPI_CHANNELS, tc => tc.Channel == channel); + TransportChannel transportChannel = Array.Find(NETCODE_CHANNELS, tc => tc.Channel == channel); switch (transportChannel.Delivery) { diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs index 8d29ca3c9f..e3ad1d244c 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs @@ -3,16 +3,16 @@ using System.Collections; using System.Collections.Generic; using System.Linq; - -using MLAPI.Transports; +using MLAPI.UTP.RuntimeTests; +using Unity.Netcode; using Unity.Networking.Transport; using UnityEngine; using UnityEngine.TestTools; -using NetworkEvent = MLAPI.Transports.NetworkEvent; +using NetworkEvent = Unity.Netcode.NetworkEvent; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; -namespace MLAPI.UTP.RuntimeTests +namespace Unity.Netcode.UTP.RuntimeTests { using static RuntimeTestsHelpers; @@ -34,7 +34,7 @@ public IEnumerator ReceiveCorrectChannelSequenced() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); int eventIndex = 1; - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) { server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); @@ -66,15 +66,15 @@ public IEnumerator ReceiveCorrectChannelSameFrame() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) client.Send(client.ServerClientId, default(ArraySegment), transportChannel.Channel); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); - Assert.AreEqual(server.MLAPI_CHANNELS.Length + 1, serverEvents.Count); + Assert.AreEqual(server.NETCODE_CHANNELS.Length + 1, serverEvents.Count); int eventIndex = 1; - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) { Assert.AreEqual(transportChannel.Channel, serverEvents[eventIndex].Channel); eventIndex++; @@ -101,7 +101,7 @@ public IEnumerator ChannelPipelineMapping() yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) { // Skip over fragmented channels (covered by different test). if (transportChannel.Delivery == NetworkDelivery.ReliableFragmentedSequenced) @@ -149,7 +149,7 @@ public IEnumerator ChannelPipelineMappingFragmented() yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) { // Skip over non-fragmented channels (covered by different test). if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) @@ -194,7 +194,7 @@ public IEnumerator FragmentedDelivery() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); int eventIndex = 1; - foreach (var transportChannel in server.MLAPI_CHANNELS) + foreach (var transportChannel in server.NETCODE_CHANNELS) { // Only want to test fragmentation-enabled channels. if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs index 3e96e76de7..8d3b83b27a 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs @@ -4,11 +4,12 @@ using System.Collections.Generic; using System.Linq; -using MLAPI.Transports; +using Unity.Netcode; +using Unity.Netcode.UTP.RuntimeTests; using UnityEngine; using UnityEngine.TestTools; -namespace MLAPI.UTP.RuntimeTests +namespace Unity.Netcode.RuntimeTests { using static RuntimeTestsHelpers; diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs index 8b2d3cc113..b231840d09 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs @@ -1,7 +1,8 @@ using NUnit.Framework; using System.Collections; -using MLAPI.Transports; +using Unity.Netcode; +using Unity.Netcode.UTP.RuntimeTests; using Unity.Networking.Transport; using Unity.Networking.Transport.Utilities; using UnityEngine; diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 298f812fe8..4eaec2c8bb 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -4,11 +4,11 @@ using System.Collections.Generic; using System.Linq; -using MLAPI.Transports; +using Unity.Netcode; using UnityEngine; using UnityEngine.TestTools; -namespace MLAPI.UTP.RuntimeTests +namespace Unity.Netcode.UTP.RuntimeTests { public static class RuntimeTestsHelpers { diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs index 4990e46c2b..6466c70696 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs @@ -5,7 +5,8 @@ using System.Linq; using System.Text; -using MLAPI.Transports; +using Unity.Netcode; +using Unity.Netcode.UTP.RuntimeTests; using UnityEngine; using UnityEngine.TestTools; diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef b/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef index 0e3eb628b7..8d7f6e12ac 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef @@ -3,12 +3,23 @@ "rootNamespace": "Unity.Netcode.UTP.RuntimeTests", "references": [ "Unity.Netcode.Runtime", - "Unity.Networking.Transport" + "Unity.Networking.Transport", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "Unity.Multiplayer.Transport.UTP" ], - "optionalUnityReferences": [ - "TestAssemblies" + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" ], + "autoReferenced": false, "defineConstraints": [ + "UNITY_INCLUDE_TESTS", "UNITY_INCLUDE_TESTS" - ] -} + ], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 0c6b93e43a..33fe9d45df 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,16 +1,16 @@ { "dependencies": { "com.unity.burst": { - "version": "1.3.2", - "depth": 3, + "version": "1.5.3", + "depth": 2, "source": "registry", "dependencies": { - "com.unity.mathematics": "1.1.0" + "com.unity.mathematics": "1.2.1" }, "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.5.7", + "version": "1.7.1", "depth": 0, "source": "registry", "dependencies": { @@ -19,14 +19,14 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "0.12.0-preview.13", - "depth": 2, + "version": "1.0.0-pre.3", + "depth": 1, "source": "registry", "dependencies": { - "com.unity.test-framework.performance": "2.3.1-preview", - "com.unity.burst": "1.3.2" + "com.unity.burst": "1.5.3", + "com.unity.test-framework": "1.1.22" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ext.nunit": { "version": "1.0.6", @@ -36,14 +36,16 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "3.0.5", + "version": "3.0.7", "depth": 0, "source": "registry", - "dependencies": {}, + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.8", + "version": "2.0.11", "depth": 0, "source": "registry", "dependencies": { @@ -59,18 +61,18 @@ "url": "https://packages.unity.com" }, "com.unity.jobs": { - "version": "0.2.10-preview.13", + "version": "0.10.0-preview.18", "depth": 1, "source": "registry", "dependencies": { - "com.unity.collections": "0.9.0-preview.6", - "com.unity.mathematics": "1.1.0" + "com.unity.collections": "0.17.0-preview.18", + "com.unity.mathematics": "1.2.1" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.mathematics": { - "version": "1.1.0", - "depth": 2, + "version": "1.2.1", + "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -81,8 +83,8 @@ "source": "local", "dependencies": { "com.unity.netcode.gameobjects": "0.0.1-preview.1", - "com.unity.transport": "0.4.1-preview.1", - "com.unity.jobs": "0.2.10-preview.13" + "com.unity.transport": "0.9.0-preview.3", + "com.unity.jobs": "0.10.0-preview.18" } }, "com.unity.netcode.gameobjects": { @@ -110,7 +112,7 @@ "url": "https://packages.unity.com" }, "com.unity.package-validation-suite": { - "version": "0.19.2-preview", + "version": "0.21.0-preview", "depth": 0, "source": "registry", "dependencies": { @@ -118,6 +120,41 @@ }, "url": "https://packages.unity.com" }, + "com.unity.services.authentication": { + "version": "1.0.0-pre.4", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "2.0.0", + "com.unity.services.core": "1.1.0-pre.8", + "com.unity.modules.unitywebrequest": "1.0.0" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.services.core": { + "version": "1.1.0-pre.8", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, + "com.unity.services.relay": { + "version": "1.0.0-preview.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.services.core": "1.1.0-pre.4", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.nuget.newtonsoft-json": "2.0.0" + }, + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + }, "com.unity.test-framework": { "version": "1.1.27", "depth": 0, @@ -130,12 +167,12 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework.performance": { - "version": "2.3.1-preview", + "version": "2.8.0-preview", "depth": 0, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.0", - "com.unity.nuget.newtonsoft-json": "2.0.0-preview" + "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -149,7 +186,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.5.2", + "version": "1.5.6", "depth": 0, "source": "registry", "dependencies": { @@ -161,15 +198,15 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "0.4.1-preview.1", - "depth": 1, + "version": "1.0.0-pre.1", + "depth": 0, "source": "registry", "dependencies": { - "com.unity.burst": "1.3.0", - "com.unity.collections": "0.12.0-preview.13", - "com.unity.mathematics": "1.1.0" + "com.unity.collections": "1.0.0-pre.3", + "com.unity.burst": "1.5.1", + "com.unity.mathematics": "1.2.1" }, - "url": "https://packages.unity.com" + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" }, "com.unity.ugui": { "version": "1.0.0", From f8c9fe817a77d11b352c6828bee0c1655cd6867e Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 18 Aug 2021 15:06:24 +0200 Subject: [PATCH 27/65] Fix: Removing any other refs to MLAPI --- com.unity.multiplayer.transport.utp/CHANGELOG.md | 2 +- .../Runtime/UTPTransport.cs | 6 +++--- .../Tests/Editor/UTPTransportTests.cs | 7 +------ .../Tests/Runtime/ChannelsTests.cs | 4 ---- .../Tests/Runtime/Helpers/DriverClient.cs | 5 +---- .../Tests/Runtime/TransportTests.cs | 6 +----- testproject/Assets/Scripts/RelayJoinCodeInput.cs | 1 - 7 files changed, 7 insertions(+), 24 deletions(-) diff --git a/com.unity.multiplayer.transport.utp/CHANGELOG.md b/com.unity.multiplayer.transport.utp/CHANGELOG.md index 02f0a7a072..17d0449a3c 100644 --- a/com.unity.multiplayer.transport.utp/CHANGELOG.md +++ b/com.unity.multiplayer.transport.utp/CHANGELOG.md @@ -2,4 +2,4 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ## [0.0.1-preview.1] - 2020-12-20 -This is the first release of Unity MLAPI Package +This is the first release of Unity Transport for Netcode for Gameobjects diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs index 9748ecb0a9..ed17751ef5 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs +++ b/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs @@ -374,9 +374,9 @@ private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) return *(ulong*)&utpConnectionId; } - private static unsafe NetworkConnection ParseClientId(ulong mlapiConnectionId) + private static unsafe NetworkConnection ParseClientId(ulong netcodeConnectionId) { - return *(NetworkConnection*)&mlapiConnectionId; + return *(NetworkConnection*)&netcodeConnectionId; } public override void DisconnectLocalClient() @@ -411,7 +411,7 @@ public override ulong GetCurrentRtt(ulong clientId) public override void Init() { - Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), "MLAPI connection id size does not match UTP connection id size"); + Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), "Netcode connection id size does not match UTP connection id size"); Debug.Assert(m_MessageBufferSize > 5, "Message buffer size must be greater than 5"); m_NetworkParameters = new List(); diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs index dbfabf0dfa..f2f639ed4e 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs @@ -1,12 +1,7 @@ using NUnit.Framework; - -using MLAPI.Transports; -using MLAPI.Transports.Tasks; -using Unity.Networking.Transport; using UnityEngine; -using UnityEngine.TestTools; -namespace MLAPI.UTP.EditorTests +namespace Unity.Netcode.UTP.EditorTests { public class UTPTransportTests { diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs index e3ad1d244c..47219ba3f1 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs @@ -3,13 +3,9 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using MLAPI.UTP.RuntimeTests; -using Unity.Netcode; using Unity.Networking.Transport; using UnityEngine; using UnityEngine.TestTools; - -using NetworkEvent = Unity.Netcode.NetworkEvent; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; namespace Unity.Netcode.UTP.RuntimeTests diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs index b231840d09..3860fb6a70 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs @@ -1,15 +1,12 @@ using NUnit.Framework; using System.Collections; - -using Unity.Netcode; -using Unity.Netcode.UTP.RuntimeTests; using Unity.Networking.Transport; using Unity.Networking.Transport.Utilities; using UnityEngine; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; -namespace MLAPI.UTP.RuntimeTests +namespace Unity.Netcode.UTP.RuntimeTests { using static RuntimeTestsHelpers; diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs index 6466c70696..cca48f090c 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs @@ -4,13 +4,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; - -using Unity.Netcode; -using Unity.Netcode.UTP.RuntimeTests; -using UnityEngine; using UnityEngine.TestTools; -namespace MLAPI.UTP.RuntimeTests +namespace Unity.Netcode.UTP.RuntimeTests { using static RuntimeTestsHelpers; diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs index ea4aa8815d..70895562cf 100644 --- a/testproject/Assets/Scripts/RelayJoinCodeInput.cs +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -1,5 +1,4 @@ using UnityEngine; -using MLAPI.Transports; using UnityEngine.UI; public class RelayJoinCodeInput : MonoBehaviour From 731b6143198bd2e45d22c0d50c4de17836e0e087 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 18 Aug 2021 18:23:09 +0200 Subject: [PATCH 28/65] feat: rename utp package to align with netcode branding rename. --- .github/CODEOWNERS | 2 +- .yamato/project.metafile | 4 ++-- README.md | 6 +++--- .../CHANGELOG.md | 0 .../CHANGELOG.md.meta | 0 .../Documentation~/Manual.md | 0 .../LICENSE.md | 0 .../LICENSE.md.meta | 0 .../README.md | 0 .../README.md.meta | 0 .../Runtime.meta | 0 .../Runtime/UTPTransport.cs | 0 .../Runtime/UTPTransport.cs.meta | 0 .../Runtime/com.unity.netcode.adapter.utp.asmdef | 5 +++-- .../Runtime/com.unity.netcode.adapter.utp.asmdef.meta | 2 +- .../Tests.meta | 0 .../Tests/Editor.meta | 0 .../Tests/Editor/UTPTransportTests.cs | 0 .../Tests/Editor/UTPTransportTests.cs.meta | 0 .../Editor/com.unity.netcode.adapter.utp.editortests.asmdef | 4 ++-- .../com.unity.netcode.adapter.utp.editortests.asmdef.meta | 2 +- .../Tests/Runtime.meta | 0 .../Tests/Runtime/ChannelsTests.cs | 0 .../Tests/Runtime/ChannelsTests.cs.meta | 0 .../Tests/Runtime/ConnectionTests.cs | 0 .../Tests/Runtime/ConnectionTests.cs.meta | 0 .../Tests/Runtime/DummyTestScript.cs | 0 .../Tests/Runtime/DummyTestScript.cs.meta | 0 .../Tests/Runtime/Helpers.meta | 0 .../Tests/Runtime/Helpers/DriverClient.cs | 0 .../Tests/Runtime/Helpers/DriverClient.cs.meta | 0 .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 0 .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta | 0 .../Tests/Runtime/TransportTests.cs | 0 .../Tests/Runtime/TransportTests.cs.meta | 0 .../com.unity.netcode.adapter.utp.runtimetests.asmdef | 4 ++-- .../com.unity.netcode.adapter.utp.runtimetests.asmdef.meta | 2 +- .../package.json | 2 +- .../package.json.meta | 0 com.unity.netcode.gameobjects/README.md | 6 +++--- testproject-tools-integration/Packages/manifest.json | 2 +- testproject/Assets/Scripts/ConnectionModeScript.cs | 3 ++- testproject/Assets/Scripts/testproject.asmdef | 2 +- testproject/Packages/manifest.json | 4 ++-- testproject/Packages/packages-lock.json | 4 ++-- 45 files changed, 28 insertions(+), 26 deletions(-) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/CHANGELOG.md (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/CHANGELOG.md.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Documentation~/Manual.md (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/LICENSE.md (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/LICENSE.md.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/README.md (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/README.md.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Runtime.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Runtime/UTPTransport.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Runtime/UTPTransport.cs.meta (100%) rename com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef => com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef (86%) rename com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef.meta => com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef.meta (76%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Editor.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Editor/UTPTransportTests.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Editor/UTPTransportTests.cs.meta (100%) rename com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef => com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef (72%) rename com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef.meta => com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef.meta (76%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/ChannelsTests.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/ChannelsTests.cs.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/ConnectionTests.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/ConnectionTests.cs.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/DummyTestScript.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/DummyTestScript.cs.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/Helpers.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/Helpers/DriverClient.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/Helpers/DriverClient.cs.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/TransportTests.cs (100%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/Tests/Runtime/TransportTests.cs.meta (100%) rename com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef => com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef (85%) rename com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef.meta => com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef.meta (76%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/package.json (90%) rename {com.unity.multiplayer.transport.utp => com.unity.netcode.adapter.utp}/package.json.meta (100%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c084534fbd..383865721f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,5 +4,5 @@ Profiling/ @Unity-Technologies/multiplayer-tools /com.unity.netcode.gameobjects/Runtime/Transports/ @Unity-Technologies/server-team /com.unity.netcode.gameobjects/Runtime/SceneManagement/ @NoelStephensUnity -/com.unity.multiplayer.transport.utp/ @Unity-Technologies/server-team +/com.unity.netcode.adapter.utp/ @Unity-Technologies/server-team Documentation~/ @Briancoughlin diff --git a/.yamato/project.metafile b/.yamato/project.metafile index ff1780e842..d6fc23d246 100644 --- a/.yamato/project.metafile +++ b/.yamato/project.metafile @@ -26,8 +26,8 @@ projects: packages: - name: com.unity.netcode.gameobjects path: com.unity.netcode.gameobjects - - name: com.unity.multiplayer.transport.utp - path: com.unity.multiplayer.transport.utp + - name: com.unity.netcode.adapter.utp + path: com.unity.netcode.adapter.utp test_editors: - 2021.1 - 2021.2 diff --git a/README.md b/README.md index 43645895bf..e513958259 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,9 @@ We follow the [Gitflow Workflow](https://www.atlassian.com/git/tutorials/compari This repository is broken into multiple components, each one implemented as a Unity Package. ``` . - ├── com.unity.multiplayer.mlapi # The core netcode SDK unity package (source + tests) - ├── com.unity.multiplayer.transport.utp # Transport wrapper for com.unity.transport experimental package (not currently supported) - └── testproject # A Unity project with various test implementations & scenes which exercise the features in the above package(s). + ├── com.unity.multiplayer.mlapi # The core netcode SDK unity package (source + tests) + ├── com.unity.netcode.adapter.utp # Transport wrapper for com.unity.transport experimental package (not currently supported) + └── testproject # A Unity project with various test implementations & scenes which exercise the features in the above package(s). ``` ### Contributing diff --git a/com.unity.multiplayer.transport.utp/CHANGELOG.md b/com.unity.netcode.adapter.utp/CHANGELOG.md similarity index 100% rename from com.unity.multiplayer.transport.utp/CHANGELOG.md rename to com.unity.netcode.adapter.utp/CHANGELOG.md diff --git a/com.unity.multiplayer.transport.utp/CHANGELOG.md.meta b/com.unity.netcode.adapter.utp/CHANGELOG.md.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/CHANGELOG.md.meta rename to com.unity.netcode.adapter.utp/CHANGELOG.md.meta diff --git a/com.unity.multiplayer.transport.utp/Documentation~/Manual.md b/com.unity.netcode.adapter.utp/Documentation~/Manual.md similarity index 100% rename from com.unity.multiplayer.transport.utp/Documentation~/Manual.md rename to com.unity.netcode.adapter.utp/Documentation~/Manual.md diff --git a/com.unity.multiplayer.transport.utp/LICENSE.md b/com.unity.netcode.adapter.utp/LICENSE.md similarity index 100% rename from com.unity.multiplayer.transport.utp/LICENSE.md rename to com.unity.netcode.adapter.utp/LICENSE.md diff --git a/com.unity.multiplayer.transport.utp/LICENSE.md.meta b/com.unity.netcode.adapter.utp/LICENSE.md.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/LICENSE.md.meta rename to com.unity.netcode.adapter.utp/LICENSE.md.meta diff --git a/com.unity.multiplayer.transport.utp/README.md b/com.unity.netcode.adapter.utp/README.md similarity index 100% rename from com.unity.multiplayer.transport.utp/README.md rename to com.unity.netcode.adapter.utp/README.md diff --git a/com.unity.multiplayer.transport.utp/README.md.meta b/com.unity.netcode.adapter.utp/README.md.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/README.md.meta rename to com.unity.netcode.adapter.utp/README.md.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime.meta b/com.unity.netcode.adapter.utp/Runtime.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Runtime.meta rename to com.unity.netcode.adapter.utp/Runtime.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs rename to com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs diff --git a/com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Runtime/UTPTransport.cs.meta rename to com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef similarity index 86% rename from com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef rename to com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef index eb976f8ed5..fdc8f9488c 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef +++ b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef @@ -1,5 +1,6 @@ { - "name": "Unity.Multiplayer.Transport.UTP", + "name": "Unity.Netcode.Adapater.UTP", + "rootNamespace": "", "references": [ "Unity.Collections", "Unity.Jobs", @@ -16,4 +17,4 @@ "defineConstraints": [], "versionDefines": [], "noEngineReferences": false -} +} \ No newline at end of file diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef.meta b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef.meta similarity index 76% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef.meta rename to com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef.meta index abefeea927..9de99bab96 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef.meta +++ b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 05c2d009acf3b36488f0e38dc7ee0e0f +guid: 3bf5041814073ec4089849c425919d5a AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/com.unity.multiplayer.transport.utp/Tests.meta b/com.unity.netcode.adapter.utp/Tests.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests.meta rename to com.unity.netcode.adapter.utp/Tests.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor.meta b/com.unity.netcode.adapter.utp/Tests/Editor.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Editor.meta rename to com.unity.netcode.adapter.utp/Tests/Editor.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs rename to com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Editor/UTPTransportTests.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef similarity index 72% rename from com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef rename to com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef index 5faffd6ef4..db0855e44e 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef +++ b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef @@ -1,10 +1,10 @@ { - "name": "Unity.Multiplayer.Transport.UTP.EditorTests", + "name": "Unity.Netcode.Adapater.UTP.EditorTests", "rootNamespace": "Unity.Netcode.UTP.EditorTests", "references": [ "Unity.Netcode.Runtime", "Unity.Networking.Transport", - "Unity.Multiplayer.Transport.UTP" + "Unity.Netcode.Adapater.UTP" ], "optionalUnityReferences": [ "TestAssemblies" diff --git a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef.meta b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef.meta similarity index 76% rename from com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef.meta rename to com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef.meta index 927ee7a884..b80b4eabc4 100644 --- a/com.unity.multiplayer.transport.utp/Runtime/com.unity.multiplayer.transport.utp.asmdef.meta +++ b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3ca8b3b66202abc418c13ff7812fb7ef +guid: 0bf62c6e1b90cf343a0d87bd323f46d0 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime.meta b/com.unity.netcode.adapter.utp/Tests/Runtime.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/ChannelsTests.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/ConnectionTests.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/DummyTestScript.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/DummyTestScript.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/DummyTestScript.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/DummyTestScript.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/DummyTestScript.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/DummyTestScript.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/DummyTestScript.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/DummyTestScript.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/Helpers.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/DriverClient.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs rename to com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/TransportTests.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs.meta diff --git a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef similarity index 85% rename from com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef rename to com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef index 8d7f6e12ac..03dabc495e 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Runtime/com.unity.multiplayer.transport.utp.runtimetests.asmdef +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef @@ -1,12 +1,12 @@ { - "name": "Unity.Multiplayer.Transport.UTP.RuntimeTests", + "name": "Unity.Netcode.Adapater.UTP.RuntimeTests", "rootNamespace": "Unity.Netcode.UTP.RuntimeTests", "references": [ "Unity.Netcode.Runtime", "Unity.Networking.Transport", "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "Unity.Multiplayer.Transport.UTP" + "Unity.Netcode.Adapater.UTP" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef.meta similarity index 76% rename from com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef.meta rename to com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef.meta index c7f78fea6f..af42d3571a 100644 --- a/com.unity.multiplayer.transport.utp/Tests/Editor/com.unity.multiplayer.transport.utp.editortests.asmdef.meta +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e7d1cf2f203c677459c30bada5c15a9a +guid: f61c9ac8cd8eb034b9ab68c718c02763 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/com.unity.multiplayer.transport.utp/package.json b/com.unity.netcode.adapter.utp/package.json similarity index 90% rename from com.unity.multiplayer.transport.utp/package.json rename to com.unity.netcode.adapter.utp/package.json index 227128fbb7..30ba8ad86a 100644 --- a/com.unity.multiplayer.transport.utp/package.json +++ b/com.unity.netcode.adapter.utp/package.json @@ -1,5 +1,5 @@ { - "name": "com.unity.multiplayer.transport.utp", + "name": "com.unity.netcode.adapter.utp", "displayName": "Unity Transport for Netcode for GameObjects", "description": "This package is plugging Unity Transport into Netcode for GameObjects, which is a network transport layer - the low-level interface for sending UDP data", "version": "0.0.1-preview.1", diff --git a/com.unity.multiplayer.transport.utp/package.json.meta b/com.unity.netcode.adapter.utp/package.json.meta similarity index 100% rename from com.unity.multiplayer.transport.utp/package.json.meta rename to com.unity.netcode.adapter.utp/package.json.meta diff --git a/com.unity.netcode.gameobjects/README.md b/com.unity.netcode.gameobjects/README.md index 38378716c4..ffa8974a61 100644 --- a/com.unity.netcode.gameobjects/README.md +++ b/com.unity.netcode.gameobjects/README.md @@ -31,9 +31,9 @@ We follow the [Gitflow Workflow](https://www.atlassian.com/git/tutorials/compari This repository is broken into multiple components, each one implemented as a Unity Package. ``` . - ├── com.unity.multiplayer.mlapi # The core netcode SDK unity package (source + tests) - ├── com.unity.multiplayer.transport.utp # Transport wrapper for com.unity.transport experimental package (not currently supported) - └── testproject # A Unity project with various test implementations & scenes which exercise the features in the above package(s). + ├── com.unity.multiplayer.mlapi # The core netcode SDK unity package (source + tests) + ├── com.unity.netcode.adapter.utp # Transport wrapper for com.unity.transport experimental package (not currently supported) + └── testproject # A Unity project with various test implementations & scenes which exercise the features in the above package(s). ``` ### Contributing diff --git a/testproject-tools-integration/Packages/manifest.json b/testproject-tools-integration/Packages/manifest.json index d0c23cd17d..8a73ec8ac7 100644 --- a/testproject-tools-integration/Packages/manifest.json +++ b/testproject-tools-integration/Packages/manifest.json @@ -4,7 +4,7 @@ "com.unity.ide.rider": "3.0.7", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.multiplayer.tools": "0.0.1-preview.1", - "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.multiplayer.transport.utp": "file:../../com.unity.netcode.adapter.utp", "com.unity.test-framework": "1.1.26", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 5395bc39d6..8b0631e2a9 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -3,6 +3,7 @@ using Unity.Netcode; #if ENABLE_RELAY_SERVICE +using System; using Unity.Services.Core; using Unity.Services.Authentication; #endif @@ -212,7 +213,7 @@ private IEnumerator StartRelayClient() //assumes that RelayJoinCodeInput populated RelayJoinCode prior to this var clientRelayUtilityTask = RelayUtility.JoinRelayServerFromJoinCode(RelayJoinCode); - + while (!clientRelayUtilityTask.IsCompleted) { yield return null; diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index e394081ea4..60f558af8f 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -5,7 +5,7 @@ "Unity.Netcode.Runtime", "Unity.Netcode.Editor", "Unity.Netcode.Prototyping", - "Unity.Multiplayer.Transport.UTP", + "Unity.Netcode.Adapater.UTP", "Unity.Services.Authentication", "Unity.Services.Core", "Unity.Services.Relay" diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 96bd38e14f..8ae6726a45 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -6,7 +6,7 @@ "com.unity.ide.vscode": "1.2.3", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.mathematics": "1.2.1", - "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.netcode.adapter.utp": "file:../../com.unity.netcode.adapter.utp", "com.unity.package-validation-suite": "0.21.0-preview", "com.unity.services.authentication": "1.0.0-pre.4", "com.unity.services.core": "1.1.0-pre.8", @@ -51,7 +51,7 @@ }, "testables": [ "com.unity.netcode.gameobjects", - "com.unity.multiplayer.transport.utp" + "com.unity.netcode.adapter.utp" ], "scopedRegistries": [ { diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 33fe9d45df..0f64ed4da5 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -77,8 +77,8 @@ "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.multiplayer.transport.utp": { - "version": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.netcode.adapter.utp": { + "version": "file:../../com.unity.netcode.adapter.utp", "depth": 0, "source": "local", "dependencies": { From 2d55696aa75e38f167aad49f1d2ec520d7936c84 Mon Sep 17 00:00:00 2001 From: Cosmin Date: Wed, 1 Sep 2021 16:15:33 +0100 Subject: [PATCH 29/65] feat: add a send queue in the UTP adapter so that we are not sending the messages right away, instead we add them to a queue and flush that queue at the end of the frame --- .../Runtime/UTPTransport.cs | 275 ++++++++++++++++-- 1 file changed, 247 insertions(+), 28 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index ed17751ef5..144dcbe79a 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; @@ -12,6 +13,7 @@ using Unity.Collections.LowLevel.Unsafe; using System.Linq; using Unity.Networking.Transport.Utilities; +using UnityEngine.Assertions; using NetworkEvent = Unity.Netcode.NetworkEvent; namespace Unity.Netcode @@ -38,6 +40,10 @@ private enum State [SerializeField] private int m_ReciveQueueSize = 128; [SerializeField] private int m_SendQueueSize = 128; + [Tooltip("The maximum size of the send queue for batching NGO events")] + [SerializeField] + private int m_SendQueueBatchSize = 4096; + [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; @@ -57,6 +63,11 @@ private enum State private RelayServerData m_RelayServerData; + /// + /// SendQueue dictionary is used to batch events instead of sending them immediately. + /// + private readonly Dictionary m_SendQueue = new Dictionary(); + private void InitDriver() { if (m_NetworkParameters.Count > 0) @@ -130,7 +141,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) yield break; } - m_NetworkParameters.Add(new RelayNetworkParameter{ ServerData = m_RelayServerData }); + m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); } else { @@ -316,36 +327,59 @@ private bool ProcessEvent() return true; case UTPNetworkEvent.Type.Data: - var channelId = reader.ReadByte(); - var size = reader.ReadInt(); - - if (size > m_MessageBufferSize) + var isBatched = reader.ReadByte(); + if (isBatched == 1) { - Debug.LogError("The received message does not fit into the message buffer"); - } - else - { - unsafe + while (reader.GetBytesRead() < reader.Length) { - fixed(byte* buffer = &m_MessageBuffer[0]) - { - reader.ReadBytes(buffer, size); - } + var channelId = reader.ReadByte(); + var payloadSize = reader.ReadInt(); + ReadData(payloadSize, ref reader, ref networkConnection, channelId); } - InvokeOnTransportEvent(NetworkEvent.Data, - ParseClientId(networkConnection), - (NetworkChannel)channelId, - new ArraySegment(m_MessageBuffer, 0, size), - Time.realtimeSinceStartup - ); - // Debug.Log($"Receiving: {String.Join(", ", m_MessageBuffer.Take(size).Select(x => string.Format("{0:x}", x)))}"); } + else // If is not batched, then read the entire buffer at once + { + var channelId = reader.ReadByte(); + var payloadSize = reader.ReadInt(); + + ReadData(payloadSize, ref reader, ref networkConnection, channelId); + } + return true; } return false; } + private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection, byte channelId) + { + // TODO: cosmin remove debug log + Debug.LogFormat("Reading {0}! ", size); + + if (size > m_MessageBufferSize) + { + Debug.LogError("The received message does not fit into the message buffer"); + } + else + { + unsafe + { + fixed (byte* buffer = &m_MessageBuffer[0]) + { + reader.ReadBytes(buffer, size); + } + } + + InvokeOnTransportEvent(NetworkEvent.Data, + ParseClientId(networkConnection), + (NetworkChannel)channelId, + new ArraySegment(m_MessageBuffer, 0, size), + Time.realtimeSinceStartup + ); + // Debug.Log($"Receiving: {String.Join(", ", m_MessageBuffer.Take(size).Select(x => string.Format("{0:x}", x)))}"); + } + } + private void Update() { if (m_Driver.IsCreated) @@ -364,6 +398,17 @@ private void Update() } + /// + /// Send batched messages out in LateUpdate. + /// + private void LateUpdate() + { + if (m_Driver.IsCreated) + { + FlushAllSendQueues(); + } + } + private void OnDestroy() { DisposeDriver(); @@ -442,28 +487,94 @@ public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel ne public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) { - var size = data.Count + 5; - + var size = data.Count + 1 + 4; // 1 byte for the channel and 4 for the count of the data var pipeline = SelectSendPipeline(networkChannel, size); - var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, size); + + SendTarget sendTarget = new SendTarget(clientId, pipeline); + if (!m_SendQueue.TryGetValue(sendTarget, out var queue)) + { + queue = new SendQueue(m_SendQueueBatchSize); + m_SendQueue.Add(sendTarget, queue); + } + + var success = queue.AddEvent((byte)networkChannel, data); + if (!success) + { + // If we are in here data exceeded remaining queue size. This should not happen under normal operation. + if (data.Count > queue.Size) + { + // If data is too large to be batched, flush it out immediately. This happens with large initial spawn packets from Netcode for Gameobjects. + Debug.LogWarning($"Sent {data.Count} bytes on channel: {networkChannel}. Event size exceeds sendQueueBatchSize: ({m_SendQueueBatchSize})."); + Debug.Assert(networkChannel == NetworkChannel.Fragmented); + SendMessageInstantly(sendTarget.ClientId, data, networkChannel, pipeline); + } + else + { + // TODO: Cosmin handle this edge case! + Debug.Assert(false); + } + } + } + + private unsafe void SendBatchedMessage(ulong clientId, ArraySegment data, NetworkPipeline pipeline) + { + var payloadSize = data.Count + 1; // One extra byte to mark whether this message is batched or not + var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, payloadSize); if (result == 0) { - writer.WriteByte((byte)networkChannel); - writer.WriteInt(data.Count); + if (data.Array != null) + { + // This 1 byte indicates whether the message has been batched or not + writer.WriteByte(1); + + // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue + unsafe + { + fixed (byte* dataPtr = &data.Array[data.Offset]) + { + writer.WriteBytes(dataPtr, data.Count); + } + } + } + + result = m_Driver.EndSend(writer); + if (result == payloadSize) // If the whole data fit, then we are done here + { + Debug.LogFormat("Writing {0}! ", result); + return; + } + } + + Debug.LogError($"Error sending the message {result}"); + } + private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data, NetworkChannel networkChannel, NetworkPipeline pipeline) + { + var payloadSize = data.Count + 1 + 1 + 4; // 1 byte to indicate if the message is batched, 1 for channelId and 4 for the payload size + var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, payloadSize); + if (result == 0) + { if (data.Array != null) { + writer.WriteByte(0); // This 1 byte indicates whether the message has been batched or not, in this case is not, as is sent instantly + writer.WriteByte((byte)networkChannel); // Send the channel ID; + writer.WriteInt(payloadSize); + + // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue unsafe { - fixed(byte* dataPtr = &data.Array[data.Offset]) + fixed (byte* dataPtr = &data.Array[data.Offset]) { writer.WriteBytes(dataPtr, data.Count); } } } + result = m_Driver.EndSend(writer); - if (result == size) + if (result == payloadSize) // If the whole data fit, then we are done here { + // TODO: cosmin remove debug log + Debug.LogFormat("Writing {0}! ", result); return; } } @@ -471,6 +582,32 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne Debug.LogError($"Error sending the message {result}"); } + /// + /// Flushes all send queues. + /// + private void FlushAllSendQueues() + { + foreach (var kvp in m_SendQueue) + { + if (kvp.Value.IsEmpty()) + { + continue; + } + + NetworkPipeline pipeline = kvp.Key.NetworkPipeline; + var payloadSize = kvp.Value.Count + 1; + if (payloadSize > NetworkParameterConstants.MTU) // If this is bigger than MTU then force it to be sent via the FragmentedReliableSequencedPipeline + { + // TODO: Cosmin re-check this with Andrew + pipeline = SelectSendPipeline(NetworkChannel.Fragmented, payloadSize); + } + + var sendBuffer = kvp.Value.GetData(); + SendBatchedMessage(kvp.Key.ClientId, sendBuffer, pipeline); + kvp.Value.Clear(); + } + } + public override SocketTasks StartClient() { if (m_Driver.IsCreated) @@ -507,5 +644,87 @@ public override void Shutdown() { DisposeDriver(); } + + + // -------------- Utility Types ------------------------------------------------------------------------------- + + /// + /// Memory Stream controller to store several events into one single buffer + /// + private class SendQueue + { + MemoryStream m_Stream; + + /// + /// The size of the send queue. + /// + public int Size { get; } + + public SendQueue(int size) + { + Size = size; + byte[] buffer = new byte[size]; + m_Stream = new MemoryStream(buffer, 0, buffer.Length, true, true); + } + + /// + /// Ads an event to the send queue. + /// + /// The channel this event should be sent on. + /// The data to send. + /// True if the event was added successfully to the queue. False if there was no space in the queue. + internal bool AddEvent(byte channelId, ArraySegment data) + { + if (m_Stream.Position + data.Count + 1 + 4 > Size) // TODO: Cosmin should comment this + { + return false; + } + + using (PooledNetworkWriter writer = PooledNetworkWriter.Get(m_Stream)) + { + writer.WriteByte(channelId); + writer.WriteInt32(data.Count); + Array.Copy(data.Array, data.Offset, m_Stream.GetBuffer(), m_Stream.Position, data.Count); + m_Stream.Position += data.Count; + } + + return true; + } + + internal void Clear() + { + m_Stream.Position = 0; + } + + internal bool IsEmpty() + { + return m_Stream.Position == 0; + } + + internal int Count => (int)m_Stream.Position; + + internal ArraySegment GetData() + { + return new ArraySegment(m_Stream.GetBuffer(), 0, (int)m_Stream.Position); + } + } + + /// + /// Cached information about reliability mode with a certain client + /// + private struct SendTarget + { + + // TODO: implement IEquatable? + // TODO: maybe replace ClientId with NetworkConnection to avoid any casting?? + public readonly ulong ClientId; + public readonly NetworkPipeline NetworkPipeline; + + public SendTarget(ulong clientId, NetworkPipeline networkPipeline) + { + ClientId = clientId; + NetworkPipeline = networkPipeline; + } + } } } From ad7bd95406994b9df464efb58bb31707b18dcf5d Mon Sep 17 00:00:00 2001 From: Cosmin Date: Thu, 2 Sep 2021 12:52:53 +0100 Subject: [PATCH 30/65] fix: an edge case where the send queue buffer would become full and we would not clear and send that data is covered, fix some minor bugs where I writing the wrong number of bytes + flushing send queues now happens in Update rather than LateUpdate + more clean-up and added some more comments --- .../Runtime/UTPTransport.cs | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 144dcbe79a..f273491ad4 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -376,7 +376,6 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup ); - // Debug.Log($"Receiving: {String.Join(", ", m_MessageBuffer.Take(size).Select(x => string.Format("{0:x}", x)))}"); } } @@ -385,6 +384,7 @@ private void Update() if (m_Driver.IsCreated) { m_Driver.ScheduleUpdate().Complete(); + while(AcceptConnection() && m_Driver.IsCreated) { ; @@ -394,6 +394,8 @@ private void Update() { ; } + + FlushAllSendQueues(); } } @@ -401,13 +403,13 @@ private void Update() /// /// Send batched messages out in LateUpdate. /// - private void LateUpdate() - { - if (m_Driver.IsCreated) - { - FlushAllSendQueues(); - } - } + // private void LateUpdate() + // { + // if (m_Driver.IsCreated) + // { + // FlushAllSendQueues(); + // } + // } private void OnDestroy() { @@ -487,7 +489,7 @@ public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel ne public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) { - var size = data.Count + 1 + 4; // 1 byte for the channel and 4 for the count of the data + var size = data.Count + 1 + 4; // 1 extra byte for the channel and another 4 for the count of the data var pipeline = SelectSendPipeline(networkChannel, size); SendTarget sendTarget = new SendTarget(clientId, pipeline); @@ -498,20 +500,23 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } var success = queue.AddEvent((byte)networkChannel, data); - if (!success) + if (!success) // This would be false only when the SendQueue is full already or we are sending a super large message at once { // If we are in here data exceeded remaining queue size. This should not happen under normal operation. if (data.Count > queue.Size) { // If data is too large to be batched, flush it out immediately. This happens with large initial spawn packets from Netcode for Gameobjects. - Debug.LogWarning($"Sent {data.Count} bytes on channel: {networkChannel}. Event size exceeds sendQueueBatchSize: ({m_SendQueueBatchSize})."); - Debug.Assert(networkChannel == NetworkChannel.Fragmented); + Debug.LogWarning($"Sent {data.Count} bytes on channel: {networkChannel}. Event size exceeds sendQueueBatchSize: ({m_SendQueueBatchSize}). This can be the initial payload!"); + Debug.Assert(networkChannel == NetworkChannel.Fragmented); // Messages like this, should always be sent via the fragmented pipeline. SendMessageInstantly(sendTarget.ClientId, data, networkChannel, pipeline); } else { - // TODO: Cosmin handle this edge case! - Debug.Assert(false); + // Since our queue buffer is full then send that right away, clear it and queue this new data + SendBatchedMessageAndClearQueue(sendTarget, queue); + Debug.Assert(queue.IsEmpty() == true); + queue.Clear(); + queue.AddEvent((byte)networkChannel, data); } } } @@ -524,7 +529,7 @@ private unsafe void SendBatchedMessage(ulong clientId, ArraySegment data, { if (data.Array != null) { - // This 1 byte indicates whether the message has been batched or not + // This 1 byte indicates whether the message has been batched or not, in this case it is writer.WriteByte(1); // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue @@ -558,7 +563,7 @@ private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data { writer.WriteByte(0); // This 1 byte indicates whether the message has been batched or not, in this case is not, as is sent instantly writer.WriteByte((byte)networkChannel); // Send the channel ID; - writer.WriteInt(payloadSize); + writer.WriteInt(data.Count); // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue unsafe @@ -594,18 +599,23 @@ private void FlushAllSendQueues() continue; } - NetworkPipeline pipeline = kvp.Key.NetworkPipeline; - var payloadSize = kvp.Value.Count + 1; - if (payloadSize > NetworkParameterConstants.MTU) // If this is bigger than MTU then force it to be sent via the FragmentedReliableSequencedPipeline - { - // TODO: Cosmin re-check this with Andrew - pipeline = SelectSendPipeline(NetworkChannel.Fragmented, payloadSize); - } + SendBatchedMessageAndClearQueue(kvp.Key, kvp.Value); + } + } - var sendBuffer = kvp.Value.GetData(); - SendBatchedMessage(kvp.Key.ClientId, sendBuffer, pipeline); - kvp.Value.Clear(); + private void SendBatchedMessageAndClearQueue(SendTarget sendTarget, SendQueue sendQueue) + { + NetworkPipeline pipeline = sendTarget.NetworkPipeline; + var payloadSize = sendQueue.Count + 1; // 1 extra byte to tell whether the message is batched or not + if (payloadSize > NetworkParameterConstants.MTU) // If this is bigger than MTU then force it to be sent via the FragmentedReliableSequencedPipeline + { + // TODO: Cosmin re-check this with Andrew + pipeline = SelectSendPipeline(NetworkChannel.Fragmented, payloadSize); } + + var sendBuffer = sendQueue.GetData(); + SendBatchedMessage(sendTarget.ClientId, sendBuffer, pipeline); + sendQueue.Clear(); } public override SocketTasks StartClient() @@ -675,7 +685,9 @@ public SendQueue(int size) /// True if the event was added successfully to the queue. False if there was no space in the queue. internal bool AddEvent(byte channelId, ArraySegment data) { - if (m_Stream.Position + data.Count + 1 + 4 > Size) // TODO: Cosmin should comment this + // Check if we are about to write more than the buffer can fit + // Note: 1 byte for the channel + 4 for the count of data + if (m_Stream.Position + data.Count + 1 + 4 > Size) { return false; } From 89735775c7f6f4a73ea0a99baf03bcb571f13f09 Mon Sep 17 00:00:00 2001 From: Cosmin Date: Thu, 2 Sep 2021 13:05:17 +0100 Subject: [PATCH 31/65] fix: remove commented code --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index f273491ad4..94af403e42 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -400,17 +400,6 @@ private void Update() } - /// - /// Send batched messages out in LateUpdate. - /// - // private void LateUpdate() - // { - // if (m_Driver.IsCreated) - // { - // FlushAllSendQueues(); - // } - // } - private void OnDestroy() { DisposeDriver(); From dd9d850599d74509ff23d3c5c5a867a919417daf Mon Sep 17 00:00:00 2001 From: Cosmin Date: Thu, 2 Sep 2021 15:54:03 +0100 Subject: [PATCH 32/65] Replace MemoryStream with a NativeArray + DataStreamWriter --- .../Runtime/UTPTransport.cs | 128 ++++++++++-------- 1 file changed, 75 insertions(+), 53 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 94af403e42..dfc8bb3db4 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -1,20 +1,15 @@ using System; using System.Collections; using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; +using System.Linq; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; - -using Unity.Netcode; using UnityEngine; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; -using System.Linq; +using Unity.Collections; using Unity.Networking.Transport.Utilities; -using UnityEngine.Assertions; -using NetworkEvent = Unity.Netcode.NetworkEvent; namespace Unity.Netcode { @@ -41,8 +36,7 @@ private enum State [SerializeField] private int m_SendQueueSize = 128; [Tooltip("The maximum size of the send queue for batching NGO events")] - [SerializeField] - private int m_SendQueueBatchSize = 4096; + [SerializeField] private int m_SendQueueBatchSize = 4096; [SerializeField] private string m_ServerAddress = "127.0.0.1"; [SerializeField] private ushort m_ServerPort = 7777; @@ -133,7 +127,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) { //This comparison is currently slow since RelayServerData does not implement a custom comparison operator that doesn't use //reflection, but this does not live in the context of a performance-critical loop, it runs once at initial connection time. - if(m_RelayServerData.Equals(default(RelayServerData))) + if (m_RelayServerData.Equals(default(RelayServerData))) { Debug.LogError("You must call SetRelayServerData() at least once before calling StartRelayServer."); task.IsDone = true; @@ -141,7 +135,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) yield break; } - m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); + m_NetworkParameters.Add(new RelayNetworkParameter {ServerData = m_RelayServerData}); } else { @@ -247,7 +241,8 @@ private static RelayConnectionData ConvertConnectionData(byte[] connectionData) } } - public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) + public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, + byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) { RelayConnectionData hostConnectionData; @@ -264,7 +259,9 @@ public void SetRelayServerData(string ipv4address, ushort port, byte[] allocatio { hostConnectionData = connectionData; } - m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, ref hostConnectionData, ref key); + + m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, + ref hostConnectionData, ref key); m_RelayServerData.ComputeNewNonce(); } @@ -281,7 +278,7 @@ private IEnumerator StartRelayServer(SocketTask task) } else { - m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); + m_NetworkParameters.Add(new RelayNetworkParameter {ServerData = m_RelayServerData}); yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); } @@ -337,7 +334,7 @@ private bool ProcessEvent() ReadData(payloadSize, ref reader, ref networkConnection, channelId); } } - else // If is not batched, then read the entire buffer at once + else // If is not batched, then read the entire buffer at once { var channelId = reader.ReadByte(); var payloadSize = reader.ReadInt(); @@ -351,7 +348,8 @@ private bool ProcessEvent() return false; } - private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection, byte channelId) + private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection, + byte channelId) { // TODO: cosmin remove debug log Debug.LogFormat("Reading {0}! ", size); @@ -372,7 +370,7 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC InvokeOnTransportEvent(NetworkEvent.Data, ParseClientId(networkConnection), - (NetworkChannel)channelId, + (NetworkChannel) channelId, new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup ); @@ -407,12 +405,12 @@ private void OnDestroy() private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) { - return *(ulong*)&utpConnectionId; + return *(ulong*) &utpConnectionId; } private static unsafe NetworkConnection ParseClientId(ulong netcodeConnectionId) { - return *(NetworkConnection*)&netcodeConnectionId; + return *(NetworkConnection*) &netcodeConnectionId; } public override void DisconnectLocalClient() @@ -437,6 +435,14 @@ public override void DisconnectRemoteClient(ulong clientId) { m_Driver.Disconnect(connection); } + + // we need to cleanup any SendQueues for this connectionID; + var keys = m_SendQueue.Keys.Where(k => k.ClientId == clientId); + foreach (var queue in keys) + { + m_SendQueue[queue].Dispose(); + m_SendQueue.Remove(queue); + } } } @@ -447,7 +453,8 @@ public override ulong GetCurrentRtt(ulong clientId) public override void Init() { - Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), "Netcode connection id size does not match UTP connection id size"); + Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), + "Netcode connection id size does not match UTP connection id size"); Debug.Assert(m_MessageBufferSize > 5, "Message buffer size must be greater than 5"); m_NetworkParameters = new List(); @@ -456,10 +463,10 @@ public override void Init() // size, we need to allow a bit more than that in FragmentationUtility since this needs // to account for headers and such. 128 bytes is plenty enough for such overhead. var maxFragmentationCapacity = MaximumMessageLength + 128; - m_NetworkParameters.Add(new FragmentationUtility.Parameters(){PayloadCapacity = maxFragmentationCapacity}); + m_NetworkParameters.Add(new FragmentationUtility.Parameters() {PayloadCapacity = maxFragmentationCapacity}); m_NetworkParameters.Add(new BaselibNetworkParameter() { - maximumPayloadSize = (uint)m_MessageBufferSize, + maximumPayloadSize = (uint) m_MessageBufferSize, receiveQueueCapacity = m_ReciveQueueSize, sendQueueCapacity = m_SendQueueSize }); @@ -467,7 +474,8 @@ public override void Init() m_MessageBuffer = new byte[m_MessageBufferSize]; } - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, out ArraySegment payload, out float receiveTime) + public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, + out ArraySegment payload, out float receiveTime) { clientId = default; networkChannel = default; @@ -510,25 +518,18 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne } } - private unsafe void SendBatchedMessage(ulong clientId, ArraySegment data, NetworkPipeline pipeline) + private unsafe void SendBatchedMessage(ulong clientId, ref NativeArray data, NetworkPipeline pipeline) { - var payloadSize = data.Count + 1; // One extra byte to mark whether this message is batched or not + var payloadSize = data.Length + 1; // One extra byte to mark whether this message is batched or not var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, payloadSize); + if (result == 0) { - if (data.Array != null) + if (data.IsCreated) { // This 1 byte indicates whether the message has been batched or not, in this case it is writer.WriteByte(1); - - // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue - unsafe - { - fixed (byte* dataPtr = &data.Array[data.Offset]) - { - writer.WriteBytes(dataPtr, data.Count); - } - } + writer.WriteBytes(data); } result = m_Driver.EndSend(writer); @@ -542,9 +543,12 @@ private unsafe void SendBatchedMessage(ulong clientId, ArraySegment data, Debug.LogError($"Error sending the message {result}"); } - private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data, NetworkChannel networkChannel, NetworkPipeline pipeline) + private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data, NetworkChannel networkChannel, + NetworkPipeline pipeline) { - var payloadSize = data.Count + 1 + 1 + 4; // 1 byte to indicate if the message is batched, 1 for channelId and 4 for the payload size + var payloadSize = + data.Count + 1 + 1 + + 4; // 1 byte to indicate if the message is batched, 1 for channelId and 4 for the payload size var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, payloadSize); if (result == 0) { @@ -603,7 +607,7 @@ private void SendBatchedMessageAndClearQueue(SendTarget sendTarget, SendQueue se } var sendBuffer = sendQueue.GetData(); - SendBatchedMessage(sendTarget.ClientId, sendBuffer, pipeline); + SendBatchedMessage(sendTarget.ClientId, ref sendBuffer, pipeline); sendQueue.Clear(); } @@ -636,12 +640,21 @@ public override SocketTasks StartServer() StartCoroutine(StartRelayServer(task)); break; } + return task.AsTasks(); } public override void Shutdown() { DisposeDriver(); + + foreach (var queue in m_SendQueue.Values) + { + queue.Dispose(); + } + + // make sure we don't leak queues when we shutdown + m_SendQueue.Clear(); } @@ -650,9 +663,10 @@ public override void Shutdown() /// /// Memory Stream controller to store several events into one single buffer /// - private class SendQueue + private class SendQueue : IDisposable { - MemoryStream m_Stream; + private NativeArray m_Array; + private DataStreamWriter m_Stream; /// /// The size of the send queue. @@ -662,8 +676,8 @@ private class SendQueue public SendQueue(int size) { Size = size; - byte[] buffer = new byte[size]; - m_Stream = new MemoryStream(buffer, 0, buffer.Length, true, true); + m_Array = new NativeArray(size, Allocator.Persistent); + m_Stream = new DataStreamWriter(m_Array); } /// @@ -676,17 +690,20 @@ internal bool AddEvent(byte channelId, ArraySegment data) { // Check if we are about to write more than the buffer can fit // Note: 1 byte for the channel + 4 for the count of data - if (m_Stream.Position + data.Count + 1 + 4 > Size) + if (m_Stream.Length + data.Count + 1 + 4 > Size) { return false; } - using (PooledNetworkWriter writer = PooledNetworkWriter.Get(m_Stream)) + m_Stream.WriteByte(channelId); + m_Stream.WriteInt(data.Count); + + unsafe { - writer.WriteByte(channelId); - writer.WriteInt32(data.Count); - Array.Copy(data.Array, data.Offset, m_Stream.GetBuffer(), m_Stream.Position, data.Count); - m_Stream.Position += data.Count; + fixed (byte* byteData = data.Array) + { + m_Stream.WriteBytes(byteData, data.Count); + } } return true; @@ -694,19 +711,24 @@ internal bool AddEvent(byte channelId, ArraySegment data) internal void Clear() { - m_Stream.Position = 0; + m_Stream.Clear(); } internal bool IsEmpty() { - return m_Stream.Position == 0; + return m_Stream.Length == 0; } - internal int Count => (int)m_Stream.Position; + internal int Count => m_Stream.Length; + + internal NativeArray GetData() + { + return m_Stream.AsNativeArray(); + } - internal ArraySegment GetData() + public void Dispose() { - return new ArraySegment(m_Stream.GetBuffer(), 0, (int)m_Stream.Position); + m_Array.Dispose(); } } From 1c5ee1ff85ac543a5aaf2d1c92919414a937bc7f Mon Sep 17 00:00:00 2001 From: Cosmin Date: Tue, 7 Sep 2021 12:16:18 +0100 Subject: [PATCH 33/65] fix: a minor exception when exiting play mode in editor + clean-up all debug logs and comments --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index dfc8bb3db4..160859a92d 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -351,9 +351,6 @@ private bool ProcessEvent() private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection, byte channelId) { - // TODO: cosmin remove debug log - Debug.LogFormat("Reading {0}! ", size); - if (size > m_MessageBufferSize) { Debug.LogError("The received message does not fit into the message buffer"); @@ -437,7 +434,7 @@ public override void DisconnectRemoteClient(ulong clientId) } // we need to cleanup any SendQueues for this connectionID; - var keys = m_SendQueue.Keys.Where(k => k.ClientId == clientId); + var keys = m_SendQueue.Keys.Where(k => k.ClientId == clientId).ToList(); foreach (var queue in keys) { m_SendQueue[queue].Dispose(); @@ -571,8 +568,6 @@ private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data result = m_Driver.EndSend(writer); if (result == payloadSize) // If the whole data fit, then we are done here { - // TODO: cosmin remove debug log - Debug.LogFormat("Writing {0}! ", result); return; } } @@ -602,7 +597,6 @@ private void SendBatchedMessageAndClearQueue(SendTarget sendTarget, SendQueue se var payloadSize = sendQueue.Count + 1; // 1 extra byte to tell whether the message is batched or not if (payloadSize > NetworkParameterConstants.MTU) // If this is bigger than MTU then force it to be sent via the FragmentedReliableSequencedPipeline { - // TODO: Cosmin re-check this with Andrew pipeline = SelectSendPipeline(NetworkChannel.Fragmented, payloadSize); } @@ -739,7 +733,6 @@ private struct SendTarget { // TODO: implement IEquatable? - // TODO: maybe replace ClientId with NetworkConnection to avoid any casting?? public readonly ulong ClientId; public readonly NetworkPipeline NetworkPipeline; From ac5cca88f81f0bc39b53deb5fef071ad0a6caea4 Mon Sep 17 00:00:00 2001 From: Cosmin Date: Tue, 7 Sep 2021 12:30:25 +0100 Subject: [PATCH 34/65] fix: implement the IEquatable interface for the SendTarget struct to avoid any allocations when accessing the sendQueue dictionary --- .../Runtime/UTPTransport.cs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 160859a92d..843366ce56 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -729,10 +729,8 @@ public void Dispose() /// /// Cached information about reliability mode with a certain client /// - private struct SendTarget + private struct SendTarget : IEquatable { - - // TODO: implement IEquatable? public readonly ulong ClientId; public readonly NetworkPipeline NetworkPipeline; @@ -741,6 +739,24 @@ public SendTarget(ulong clientId, NetworkPipeline networkPipeline) ClientId = clientId; NetworkPipeline = networkPipeline; } + + public bool Equals(SendTarget other) + { + return ClientId == other.ClientId && NetworkPipeline.Equals(other.NetworkPipeline); + } + + public override bool Equals(object obj) + { + return obj is SendTarget other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + return (ClientId.GetHashCode() * 397) ^ NetworkPipeline.GetHashCode(); + } + } } } } From a3b2df824eb838db9b2bf67d88d6f481b50423f9 Mon Sep 17 00:00:00 2001 From: Cosmin Date: Tue, 7 Sep 2021 13:19:51 +0100 Subject: [PATCH 35/65] Update UTPTransport adapter to latest NGO develop, NetworkChannels are now replaced by QoS delivery hence we no longer need to send them between server and client + update all the UTP Adapter tests and remove the ones that are no longer needed --- .../Runtime/UTPTransport.cs | 72 +++--- .../Tests/Editor/UTPTransportTests.cs | 12 +- .../Tests/Runtime/ChannelsTests.cs | 218 ------------------ .../Tests/Runtime/ChannelsTests.cs.meta | 11 - .../Runtime/Helpers/RuntimeTestsHelpers.cs | 6 +- .../Tests/Runtime/TransportTests.cs | 24 +- 6 files changed, 51 insertions(+), 292 deletions(-) delete mode 100644 com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs delete mode 100644 com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 843366ce56..cdb1179de5 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -88,11 +88,9 @@ private void DisposeDriver() } } - private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) + private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery, int size) { - TransportChannel transportChannel = Array.Find(NETCODE_CHANNELS, tc => tc.Channel == channel); - - switch (transportChannel.Delivery) + switch (delivery) { case NetworkDelivery.Unreliable: return NetworkPipeline.Null; @@ -114,7 +112,7 @@ private NetworkPipeline SelectSendPipeline(NetworkChannel channel, int size) return m_ReliableSequencedFragmentedPipeline; default: - Debug.LogError($"Unknown NetworkDelivery value: {transportChannel.Delivery}"); + Debug.LogError($"Unknown NetworkDelivery value: {delivery}"); return NetworkPipeline.Null; } } @@ -241,12 +239,12 @@ private static RelayConnectionData ConvertConnectionData(byte[] connectionData) } } - public void SetRelayServerData(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, + public void SetRelayServerData(string ipv4Address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) { RelayConnectionData hostConnectionData; - var serverEndpoint = NetworkEndPoint.Parse(ipv4address, port); + var serverEndpoint = NetworkEndPoint.Parse(ipv4Address, port); var allocationId = ConvertFromAllocationIdBytes(allocationIdBytes); var key = ConvertFromHMAC(keyBytes); var connectionData = ConvertConnectionData(connectionDataBytes); @@ -288,17 +286,18 @@ private bool AcceptConnection() { var connection = m_Driver.Accept(); - if (connection != default(NetworkConnection)) + if (connection == default(NetworkConnection)) { - InvokeOnTransportEvent(NetworkEvent.Connect, - ParseClientId(connection), - NetworkChannel.Internal, - default(ArraySegment), - Time.realtimeSinceStartup); - return true; + return false; } - return false; + InvokeOnTransportEvent(NetworkEvent.Connect, + ParseClientId(connection), + default(ArraySegment), + Time.realtimeSinceStartup); + + return true; + } private bool ProcessEvent() @@ -310,7 +309,6 @@ private bool ProcessEvent() case UTPNetworkEvent.Type.Connect: InvokeOnTransportEvent(NetworkEvent.Connect, ParseClientId(networkConnection), - NetworkChannel.Internal, default(ArraySegment), Time.realtimeSinceStartup); return true; @@ -318,7 +316,6 @@ private bool ProcessEvent() case UTPNetworkEvent.Type.Disconnect: InvokeOnTransportEvent(NetworkEvent.Disconnect, ParseClientId(networkConnection), - NetworkChannel.Internal, default(ArraySegment), Time.realtimeSinceStartup); return true; @@ -367,7 +364,6 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC InvokeOnTransportEvent(NetworkEvent.Data, ParseClientId(networkConnection), - (NetworkChannel) channelId, new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup ); @@ -448,7 +444,7 @@ public override ulong GetCurrentRtt(ulong clientId) return 0; } - public override void Init() + public override void Initialize() { Debug.Assert(sizeof(ulong) == UnsafeUtility.SizeOf(), "Netcode connection id size does not match UTP connection id size"); @@ -471,20 +467,18 @@ public override void Init() m_MessageBuffer = new byte[m_MessageBufferSize]; } - public override NetworkEvent PollEvent(out ulong clientId, out NetworkChannel networkChannel, - out ArraySegment payload, out float receiveTime) + public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = default; - networkChannel = default; payload = default; receiveTime = default; return NetworkEvent.Nothing; } - public override void Send(ulong clientId, ArraySegment data, NetworkChannel networkChannel) + public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) { - var size = data.Count + 1 + 4; // 1 extra byte for the channel and another 4 for the count of the data - var pipeline = SelectSendPipeline(networkChannel, size); + var size = payload.Count + 1 + 4; // 1 extra byte for the channel and another 4 for the count of the data + var pipeline = SelectSendPipeline(networkDelivery, size); SendTarget sendTarget = new SendTarget(clientId, pipeline); if (!m_SendQueue.TryGetValue(sendTarget, out var queue)) @@ -493,16 +487,16 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne m_SendQueue.Add(sendTarget, queue); } - var success = queue.AddEvent((byte)networkChannel, data); + var success = queue.AddEvent(payload); if (!success) // This would be false only when the SendQueue is full already or we are sending a super large message at once { // If we are in here data exceeded remaining queue size. This should not happen under normal operation. - if (data.Count > queue.Size) + if (payload.Count > queue.Size) { // If data is too large to be batched, flush it out immediately. This happens with large initial spawn packets from Netcode for Gameobjects. - Debug.LogWarning($"Sent {data.Count} bytes on channel: {networkChannel}. Event size exceeds sendQueueBatchSize: ({m_SendQueueBatchSize}). This can be the initial payload!"); - Debug.Assert(networkChannel == NetworkChannel.Fragmented); // Messages like this, should always be sent via the fragmented pipeline. - SendMessageInstantly(sendTarget.ClientId, data, networkChannel, pipeline); + Debug.LogWarning($"Sent {payload.Count} bytes based on delivery method: {networkDelivery}. Event size exceeds sendQueueBatchSize: ({m_SendQueueBatchSize}). This can be the initial payload!"); + Debug.Assert(networkDelivery == NetworkDelivery.ReliableFragmentedSequenced); // Messages like this, should always be sent via the fragmented pipeline. + SendMessageInstantly(sendTarget.ClientId, payload, pipeline); } else { @@ -510,7 +504,7 @@ public override void Send(ulong clientId, ArraySegment data, NetworkChanne SendBatchedMessageAndClearQueue(sendTarget, queue); Debug.Assert(queue.IsEmpty() == true); queue.Clear(); - queue.AddEvent((byte)networkChannel, data); + queue.AddEvent(payload); } } } @@ -540,19 +534,17 @@ private unsafe void SendBatchedMessage(ulong clientId, ref NativeArray dat Debug.LogError($"Error sending the message {result}"); } - private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data, NetworkChannel networkChannel, + private unsafe void SendMessageInstantly(ulong clientId, ArraySegment data, NetworkPipeline pipeline) { var payloadSize = - data.Count + 1 + 1 + - 4; // 1 byte to indicate if the message is batched, 1 for channelId and 4 for the payload size + data.Count + 1 + 4; // 1 byte to indicate if the message is batched and 4 for the payload size var result = m_Driver.BeginSend(pipeline, ParseClientId(clientId), out var writer, payloadSize); if (result == 0) { if (data.Array != null) { writer.WriteByte(0); // This 1 byte indicates whether the message has been batched or not, in this case is not, as is sent instantly - writer.WriteByte((byte)networkChannel); // Send the channel ID; writer.WriteInt(data.Count); // Note: we are not writing the one byte for the channel and the other 4 for the data count as it will be handled by the queue @@ -597,7 +589,7 @@ private void SendBatchedMessageAndClearQueue(SendTarget sendTarget, SendQueue se var payloadSize = sendQueue.Count + 1; // 1 extra byte to tell whether the message is batched or not if (payloadSize > NetworkParameterConstants.MTU) // If this is bigger than MTU then force it to be sent via the FragmentedReliableSequencedPipeline { - pipeline = SelectSendPipeline(NetworkChannel.Fragmented, payloadSize); + pipeline = SelectSendPipeline(NetworkDelivery.ReliableFragmentedSequenced, payloadSize); } var sendBuffer = sendQueue.GetData(); @@ -677,19 +669,17 @@ public SendQueue(int size) /// /// Ads an event to the send queue. /// - /// The channel this event should be sent on. /// The data to send. /// True if the event was added successfully to the queue. False if there was no space in the queue. - internal bool AddEvent(byte channelId, ArraySegment data) + internal bool AddEvent(ArraySegment data) { // Check if we are about to write more than the buffer can fit - // Note: 1 byte for the channel + 4 for the count of data - if (m_Stream.Length + data.Count + 1 + 4 > Size) + // Note: 4 bytes for the count of data + if (m_Stream.Length + data.Count + 4 > Size) { return false; } - m_Stream.WriteByte(channelId); m_Stream.WriteInt(data.Count); unsafe diff --git a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs index f2f639ed4e..3bbb72241f 100644 --- a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs @@ -10,7 +10,7 @@ public class UTPTransportTests public void BasicInitServer() { UTPTransport transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); var tasks = transport.StartServer(); Assert.False(tasks.IsDone && !tasks.Success); @@ -23,7 +23,7 @@ public void BasicInitServer() public void BasicInitClient() { UTPTransport transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); var tasks = transport.StartClient(); Assert.False(tasks.IsDone && !tasks.Success); @@ -36,7 +36,7 @@ public void BasicInitClient() public void NoRestartServer() { UTPTransport transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); transport.StartServer(); var tasks = transport.StartServer(); @@ -50,7 +50,7 @@ public void NoRestartServer() public void NoRestartClient() { UTPTransport transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); transport.StartClient(); var tasks = transport.StartClient(); @@ -68,7 +68,7 @@ public void NotBothServerAndClient() // Start server then client. transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); transport.StartServer(); tasks = transport.StartClient(); @@ -78,7 +78,7 @@ public void NotBothServerAndClient() // Start client then server. transport = new GameObject().AddComponent(); - transport.Init(); + transport.Initialize(); transport.StartClient(); tasks = transport.StartServer(); diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs deleted file mode 100644 index 47219ba3f1..0000000000 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs +++ /dev/null @@ -1,218 +0,0 @@ -using NUnit.Framework; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Unity.Networking.Transport; -using UnityEngine; -using UnityEngine.TestTools; -using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; - -namespace Unity.Netcode.UTP.RuntimeTests -{ - using static RuntimeTestsHelpers; - - public class ChannelsTests - { - // Check that we receive the correct channel (one message after the other). - [UnityTest] - public IEnumerator ReceiveCorrectChannelSequenced() - { - UTPTransport server, client; - List serverEvents, clientEvents; - - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); - - server.StartServer(); - client.StartClient(); - - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - - int eventIndex = 1; - foreach (var transportChannel in server.NETCODE_CHANNELS) - { - server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); - - yield return WaitForNetworkEvent(NetworkEvent.Data, clientEvents); - - Assert.AreEqual(transportChannel.Channel, clientEvents[eventIndex].Channel); - - eventIndex++; - } - - server.Shutdown(); - client.Shutdown(); - - yield return null; - } - - // Check that we receive the correct channel (all messages received at once). - [UnityTest] - public IEnumerator ReceiveCorrectChannelSameFrame() - { - UTPTransport server, client; - List serverEvents, clientEvents; - - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); - - server.StartServer(); - client.StartClient(); - - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - - foreach (var transportChannel in server.NETCODE_CHANNELS) - client.Send(client.ServerClientId, default(ArraySegment), transportChannel.Channel); - - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); - - Assert.AreEqual(server.NETCODE_CHANNELS.Length + 1, serverEvents.Count); - - int eventIndex = 1; - foreach (var transportChannel in server.NETCODE_CHANNELS) - { - Assert.AreEqual(transportChannel.Channel, serverEvents[eventIndex].Channel); - eventIndex++; - } - - server.Shutdown(); - client.Shutdown(); - - yield return null; - } - - // Check pipeline mapping for every default channel (except fragmented). - [UnityTest] - public IEnumerator ChannelPipelineMapping() - { - UTPTransport server; - List serverEvents; - DriverClient client = new GameObject().AddComponent(); - - InitializeTransport(out server, out serverEvents); - - server.StartServer(); - client.Connect(); - - yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); - - foreach (var transportChannel in server.NETCODE_CHANNELS) - { - // Skip over fragmented channels (covered by different test). - if (transportChannel.Delivery == NetworkDelivery.ReliableFragmentedSequenced) - continue; - - server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); - - yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); - - // Check that data's pipeline is what's expected for the delivery. - switch (transportChannel.Delivery) - { - case NetworkDelivery.Unreliable: - Assert.AreEqual(NetworkPipeline.Null, client.LastEventPipeline); - break; - - case NetworkDelivery.UnreliableSequenced: - Assert.AreEqual(client.UnreliableSequencedPipeline, client.LastEventPipeline); - break; - - case NetworkDelivery.Reliable: - case NetworkDelivery.ReliableSequenced: - Assert.AreEqual(client.ReliableSequencedPipeline, client.LastEventPipeline); - break; - } - } - - server.Shutdown(); - - yield return null; - } - - // Check pipeline mapping for every default channel that has fragmentation. - [UnityTest] - public IEnumerator ChannelPipelineMappingFragmented() - { - UTPTransport server; - List serverEvents; - DriverClient client = new GameObject().AddComponent(); - - InitializeTransport(out server, out serverEvents); - - server.StartServer(); - client.Connect(); - - yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Connect); - - foreach (var transportChannel in server.NETCODE_CHANNELS) - { - // Skip over non-fragmented channels (covered by different test). - if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) - continue; - - // Check that data smaller than MTU doesn't trigger fragmented pipeline. - - server.Send(serverEvents[0].ClientID, default(ArraySegment), transportChannel.Channel); - - yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); - - Assert.AreEqual(client.ReliableSequencedPipeline, client.LastEventPipeline); - - // Check that data larger than MTU does trigger fragmented pipeline. - - var data = new ArraySegment(new byte[UTPTransport.MaximumMessageLength]); - server.Send(serverEvents[0].ClientID, data, transportChannel.Channel); - - yield return client.WaitForNetworkEvent(UTPNetworkEvent.Type.Data); - - Assert.AreEqual(client.ReliableSequencedFragmentedPipeline, client.LastEventPipeline); - } - - server.Shutdown(); - - yield return null; - } - - // Check fragmentation on channels where it is expected. - [UnityTest] - public IEnumerator FragmentedDelivery() - { - UTPTransport server, client; - List serverEvents, clientEvents; - - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); - - server.StartServer(); - client.StartClient(); - - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - - int eventIndex = 1; - foreach (var transportChannel in server.NETCODE_CHANNELS) - { - // Only want to test fragmentation-enabled channels. - if (transportChannel.Delivery != NetworkDelivery.ReliableFragmentedSequenced) - continue; - - var data = new byte[UTPTransport.MaximumMessageLength]; - for (int i = 0; i < data.Length; i++) - data[i] = (byte) i; - - client.Send(client.ServerClientId, new ArraySegment(data), transportChannel.Channel); - - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); - - Assert.True(serverEvents[eventIndex].Data.SequenceEqual(data)); - - eventIndex++; - } - - server.Shutdown(); - client.Shutdown(); - - yield return null; - } - } -} diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta deleted file mode 100644 index fbba9ef7f2..0000000000 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ChannelsTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fa2a36c2e74a6504fb086b2b7d25161c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 4eaec2c8bb..1feef3e77e 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -43,7 +43,7 @@ public static void InitializeTransport(out UTPTransport transport, out List(); transport.OnTransportEvent += logger.HandleEvent; - transport.Init(); + transport.Initialize(); } // Information about an event generated by a transport (basically just the parameters that @@ -52,7 +52,6 @@ public struct TransportEvent { public NetworkEvent Type; public ulong ClientID; - public NetworkChannel Channel; public ArraySegment Data; public float ReceiveTime; } @@ -65,7 +64,7 @@ public class TransportEventLogger private readonly List m_Events = new List(); public List Events => m_Events; - public void HandleEvent(NetworkEvent type, ulong clientID, NetworkChannel channel, ArraySegment data, float receiveTime) + public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment data, float receiveTime) { // Copy the data since the backing array will be reused for future messages. if (data != default(ArraySegment)) @@ -75,7 +74,6 @@ public void HandleEvent(NetworkEvent type, ulong clientID, NetworkChannel channe { Type = type, ClientID = clientID, - Channel = channel, Data = data, ReceiveTime = receiveTime }); diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index cca48f090c..023702d413 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -28,14 +28,14 @@ public IEnumerator PingPong() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); - client.Send(client.ServerClientId, ping, NetworkChannel.Internal); + client.Send(client.ServerClientId, ping, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); - server.Send(serverEvents[0].ClientID, pong, NetworkChannel.Internal); + server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, clientEvents); @@ -63,8 +63,8 @@ public IEnumerator PingPongSimultaneous() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); - server.Send(serverEvents[0].ClientID, ping, NetworkChannel.Internal); - client.Send(client.ServerClientId, ping, NetworkChannel.Internal); + server.Send(serverEvents[0].ClientID, ping, NetworkDelivery.ReliableSequenced); + client.Send(client.ServerClientId, ping, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -73,8 +73,8 @@ public IEnumerator PingPongSimultaneous() Assert.That(clientEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); - server.Send(serverEvents[0].ClientID, pong, NetworkChannel.Internal); - client.Send(client.ServerClientId, pong, NetworkChannel.Internal); + server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); + client.Send(client.ServerClientId, pong, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -104,10 +104,10 @@ public IEnumerator MultipleSendsSingleFrame() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var data1 = new ArraySegment(new byte [] { 11 }); - client.Send(client.ServerClientId, data1, NetworkChannel.Internal); + client.Send(client.ServerClientId, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte [] { 22 }); - client.Send(client.ServerClientId, data2, NetworkChannel.Internal); + client.Send(client.ServerClientId, data2, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -144,10 +144,10 @@ public IEnumerator SendMultipleClients() Assert.AreEqual(2, serverEvents.Count); var data1 = new ArraySegment(new byte [] { 11 }); - server.Send(serverEvents[0].ClientID, data1, NetworkChannel.Internal); + server.Send(serverEvents[0].ClientID, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte [] { 22 }); - server.Send(serverEvents[1].ClientID, data2, NetworkChannel.Internal); + server.Send(serverEvents[1].ClientID, data2, NetworkDelivery.ReliableSequenced); // Once one has received its data, the other should have too. yield return WaitForNetworkEvent(NetworkEvent.Data, client1Events); @@ -188,10 +188,10 @@ public IEnumerator ReceiveMultipleClients() Assert.AreEqual(1, client2Events.Count); var data1 = new ArraySegment(new byte [] { 11 }); - client1.Send(client1.ServerClientId, data1, NetworkChannel.Internal); + client1.Send(client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte [] { 22 }); - client2.Send(client2.ServerClientId, data2, NetworkChannel.Internal); + client2.Send(client2.ServerClientId, data2, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); From 247a7530204e10b225652169704d6b400318aac3 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 19:19:39 +0200 Subject: [PATCH 36/65] Fix: Depending on all public packages * Depending on all public packages * Fixed usage of relay SDK (using SDK API vs the other API we were using) * Updated NGO Package to use pre-release version of collections * Updated usage of FixedString because of name change in the collection packages * Removed dependecy on jobs package as its internal --- .../Runtime/UTPTransport.cs | 4 +- com.unity.netcode.adapter.utp/package.json | 5 +- .../Tests/Runtime/NetworkVariableTests.cs | 2 +- com.unity.netcode.gameobjects/package.json | 2 +- .../Assets/Scripts/ConnectionModeScript.cs | 48 ++++++++++------ testproject/Assets/Scripts/RelayUtility.cs | 24 ++++---- testproject/Packages/manifest.json | 26 ++------- testproject/Packages/packages-lock.json | 56 ++++++++----------- 8 files changed, 76 insertions(+), 91 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index cdb1179de5..c55e440d1d 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -240,7 +240,7 @@ private static RelayConnectionData ConvertConnectionData(byte[] connectionData) } public void SetRelayServerData(string ipv4Address, ushort port, byte[] allocationIdBytes, byte[] keyBytes, - byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null) + byte[] connectionDataBytes, byte[] hostConnectionDataBytes = null, bool isSecure = false) { RelayConnectionData hostConnectionData; @@ -259,7 +259,7 @@ public void SetRelayServerData(string ipv4Address, ushort port, byte[] allocatio } m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, - ref hostConnectionData, ref key); + ref hostConnectionData, ref key, isSecure); m_RelayServerData.ComputeNewNonce(); } diff --git a/com.unity.netcode.adapter.utp/package.json b/com.unity.netcode.adapter.utp/package.json index 30ba8ad86a..050da4e23c 100644 --- a/com.unity.netcode.adapter.utp/package.json +++ b/com.unity.netcode.adapter.utp/package.json @@ -6,7 +6,6 @@ "unity": "2020.3", "dependencies": { "com.unity.netcode.gameobjects": "0.0.1-preview.1", - "com.unity.transport": "0.9.0-preview.3", - "com.unity.jobs": "0.10.0-preview.18" + "com.unity.transport": "1.0.0-pre.4" } -} +} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariableTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariableTests.cs index c77bc80e07..eafa90ff35 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariableTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariableTests.cs @@ -10,7 +10,7 @@ namespace Unity.Netcode.RuntimeTests { public struct FixedString32Struct : INetworkSerializable { - public FixedString32 FixedString; + public FixedString32Bytes FixedString; public void NetworkSerialize(NetworkSerializer serializer) { if (serializer.IsReading) diff --git a/com.unity.netcode.gameobjects/package.json b/com.unity.netcode.gameobjects/package.json index 43b530af03..4bf79f247d 100644 --- a/com.unity.netcode.gameobjects/package.json +++ b/com.unity.netcode.gameobjects/package.json @@ -8,6 +8,6 @@ "com.unity.modules.ai": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.nuget.mono-cecil": "1.10.1-preview.1", - "com.unity.collections": "0.12.0-preview.13" + "com.unity.collections": "1.0.0-pre.5" } } diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index db42f40e2f..a77182f2e8 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -2,6 +2,7 @@ using UnityEngine; using Unity.Netcode; + #if ENABLE_RELAY_SERVICE using System; using Unity.Services.Core; @@ -27,6 +28,8 @@ public class ConnectionModeScript : MonoBehaviour private CommandLineProcessor m_CommandLineProcessor; + private bool m_UsingRelay = false; + #if ENABLE_RELAY_SERVICE [SerializeField] private string m_RelayAllocationBasePath = "https://relay-allocations-stg.services.api.unity.com"; @@ -78,6 +81,7 @@ private void Start() #if ENABLE_RELAY_SERVICE if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { + m_UsingRelay = true; m_JoinCodeInput.SetActive(true); //If Start() is called on the first frame update, it's not likely that the AuthenticationService is going to be instantiated yet //Moved old logic for this out to OnServicesInitialized @@ -113,11 +117,14 @@ public void OnStartServerButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { -#if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayServer(StartServer)); -#else - StartServer(); -#endif + if (m_UsingRelay) + { + StartCoroutine(StartRelayServer(StartServer)); + } + else + { + StartServer(); + } } } @@ -128,12 +135,13 @@ private void StartServer() m_ConnectionModeButtons.SetActive(false); } -#if ENABLE_RELAY_SERVICE + /// /// Coroutine that handles starting MLAPI in server mode if Relay is enabled /// private IEnumerator StartRelayServer(Action postAllocationAction) { +#if ENABLE_RELAY_SERVICE m_ConnectionModeButtons.SetActive(false); var serverRelayUtilityTask = RelayUtility.AllocateRelayServerAndGetJoinCode(m_MaxConnections); @@ -155,8 +163,11 @@ private IEnumerator StartRelayServer(Action postAllocationAction) NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); postAllocationAction(); - } +#else + yield return null; #endif + } + /// /// Handles starting netcode in host mode @@ -165,11 +176,14 @@ public void OnStartHostButton() { if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { -#if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayServer(StartHost)); -#else - StartHost(); -#endif + if (m_UsingRelay) + { + StartCoroutine(StartRelayServer(StartHost)); + } + else + { + StartHost(); + } } } @@ -202,13 +216,14 @@ private void StartClient() m_ConnectionModeButtons.SetActive(false); } -#if ENABLE_RELAY_SERVICE + /// /// Coroutine that kicks off Relay SDK calls to join a Relay Server instance with a join code /// /// private IEnumerator StartRelayClient() { +#if ENABLE_RELAY_SERVICE m_ConnectionModeButtons.SetActive(false); //assumes that RelayJoinCodeInput populated RelayJoinCode prior to this @@ -232,16 +247,17 @@ private IEnumerator StartRelayClient() NetworkManager.Singleton.StartClient(); OnNotifyConnectionEventClient?.Invoke(); - } +#else + yield return null; #endif + } + /// /// Handles authenticating UnityServices, needed for Relay /// public async void OnSignIn() { #if ENABLE_RELAY_SERVICE - Unity.Services.Relay.RelayService.Configuration.BasePath = m_RelayAllocationBasePath; - await UnityServices.InitializeAsync(); OnServicesInitialized(); await AuthenticationService.Instance.SignInAnonymouslyAsync(); diff --git a/testproject/Assets/Scripts/RelayUtility.cs b/testproject/Assets/Scripts/RelayUtility.cs index 9bf63bce77..6c27642f76 100644 --- a/testproject/Assets/Scripts/RelayUtility.cs +++ b/testproject/Assets/Scripts/RelayUtility.cs @@ -1,33 +1,31 @@ using System.Threading.Tasks; using UnityEngine; using Unity.Services.Relay; -using Unity.Services.Relay.Allocations; using Unity.Services.Relay.Models; +using System; public class RelayUtility { async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) { - Response allocationResponse; - Response createJoinCodeResponse; + Allocation allocation; + string createJoinCode; try { - allocationResponse = await RelayService.AllocationsApiClient.CreateAllocationAsync(new CreateAllocationRequest(new AllocationRequest(maxConnections, region))); + allocation = await Relay.Instance.CreateAllocationAsync(maxConnections); } - catch + catch (Exception e) { - Debug.LogError("Relay create allocation request failed"); + Debug.LogError($"Relay create allocation request failed {e.Message}"); throw; } - var allocation = allocationResponse.Result.Data.Allocation; - Debug.Log($"server: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); Debug.Log($"server: {allocation.AllocationId}"); try { - createJoinCodeResponse = await RelayService.AllocationsApiClient.CreateJoincodeAsync(new CreateJoincodeRequest(new JoinCodeRequest(allocationResponse.Result.Data.Allocation.AllocationId))); + createJoinCode = await Relay.Instance.GetJoinCodeAsync(allocation.AllocationId); } catch { @@ -35,15 +33,15 @@ public class RelayUtility throw; } - return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCodeResponse.Result.Data.JoinCode); + return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCode); } async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) { - Response joinResponse; + JoinAllocation allocation; try { - joinResponse = await RelayService.AllocationsApiClient.JoinRelayAsync(new JoinRelayRequest(new JoinRequest(joinCode))); + allocation = await Relay.Instance.JoinAllocationAsync(joinCode); } catch { @@ -51,8 +49,6 @@ public class RelayUtility throw; } - var allocation = joinResponse.Result.Data.Allocation; - Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}"); Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}"); Debug.Log($"client: {allocation.AllocationId}"); diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 8ae6726a45..ad9e383464 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,21 +1,21 @@ { "dependencies": { - "com.unity.collab-proxy": "1.7.1", + "com.unity.collab-proxy": "1.9.0", "com.unity.ide.rider": "3.0.7", "com.unity.ide.visualstudio": "2.0.11", "com.unity.ide.vscode": "1.2.3", - "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.mathematics": "1.2.1", "com.unity.netcode.adapter.utp": "file:../../com.unity.netcode.adapter.utp", + "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.package-validation-suite": "0.21.0-preview", "com.unity.services.authentication": "1.0.0-pre.4", "com.unity.services.core": "1.1.0-pre.8", - "com.unity.services.relay": "1.0.0-preview.1", - "com.unity.test-framework": "1.1.27", + "com.unity.services.relay": "1.0.1-pre.1", + "com.unity.test-framework": "1.1.29", "com.unity.test-framework.performance": "2.8.0-preview", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.5.6", - "com.unity.transport": "1.0.0-pre.1", + "com.unity.timeline": "1.6.2", + "com.unity.transport": "1.0.0-pre.4", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", @@ -52,19 +52,5 @@ "testables": [ "com.unity.netcode.gameobjects", "com.unity.netcode.adapter.utp" - ], - "scopedRegistries": [ - { - "name": "Candidate", - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", - "scopes": [ - "com.unity.transport", - "com.unity.collections", - "com.unity.services.relay", - "com.unity.services.authentication", - "com.unity.services.core", - "com.unity.jobs" - ] - } ] } diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 4be90514ce..0706f2bbb7 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,8 +1,8 @@ { "dependencies": { "com.unity.burst": { - "version": "1.5.3", - "depth": 2, + "version": "1.5.5", + "depth": 1, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1" @@ -10,23 +10,21 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.7.1", + "version": "1.9.0", "depth": 0, "source": "registry", - "dependencies": { - "com.unity.nuget.newtonsoft-json": "2.0.0" - }, + "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "1.0.0-pre.3", + "version": "1.0.0-pre.5", "depth": 1, "source": "registry", "dependencies": { - "com.unity.burst": "1.5.3", + "com.unity.burst": "1.5.4", "com.unity.test-framework": "1.1.22" }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { "version": "1.0.6", @@ -60,16 +58,6 @@ "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.jobs": { - "version": "0.10.0-preview.18", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.collections": "0.17.0-preview.18", - "com.unity.mathematics": "1.2.1" - }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" - }, "com.unity.mathematics": { "version": "1.2.1", "depth": 0, @@ -83,8 +71,7 @@ "source": "local", "dependencies": { "com.unity.netcode.gameobjects": "0.0.1-preview.1", - "com.unity.transport": "0.9.0-preview.3", - "com.unity.jobs": "0.10.0-preview.18" + "com.unity.transport": "1.0.0-pre.4" } }, "com.unity.netcode.gameobjects": { @@ -95,7 +82,7 @@ "com.unity.modules.ai": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.nuget.mono-cecil": "1.10.1-preview.1", - "com.unity.collections": "0.12.0-preview.13" + "com.unity.collections": "1.0.0-pre.5" } }, "com.unity.nuget.mono-cecil": { @@ -130,7 +117,7 @@ "com.unity.services.core": "1.1.0-pre.8", "com.unity.modules.unitywebrequest": "1.0.0" }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "url": "https://packages.unity.com" }, "com.unity.services.core": { "version": "1.1.0-pre.8", @@ -139,25 +126,26 @@ "dependencies": { "com.unity.modules.unitywebrequest": "1.0.0" }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "url": "https://packages.unity.com" }, "com.unity.services.relay": { - "version": "1.0.0-preview.1", + "version": "1.0.1-pre.1", "depth": 0, "source": "registry", "dependencies": { - "com.unity.services.core": "1.1.0-pre.4", + "com.unity.services.core": "1.1.0-pre.8", "com.unity.modules.unitywebrequest": "1.0.0", "com.unity.modules.unitywebrequestassetbundle": "1.0.0", "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.nuget.newtonsoft-json": "2.0.0" + "com.unity.nuget.newtonsoft-json": "2.0.0", + "com.unity.services.authentication": "1.0.0-pre.4" }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.1.27", + "version": "1.1.29", "depth": 0, "source": "registry", "dependencies": { @@ -187,7 +175,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.5.6", + "version": "1.6.2", "depth": 0, "source": "registry", "dependencies": { @@ -199,15 +187,15 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "1.0.0-pre.1", + "version": "1.0.0-pre.4", "depth": 0, "source": "registry", "dependencies": { - "com.unity.collections": "1.0.0-pre.3", - "com.unity.burst": "1.5.1", + "com.unity.collections": "1.0.0-pre.5", + "com.unity.burst": "1.5.5", "com.unity.mathematics": "1.2.1" }, - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates" + "url": "https://packages.unity.com" }, "com.unity.ugui": { "version": "1.0.0", From bcae920cb62e3acbf6d0309af55ff8a4a18a6d94 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 19:25:30 +0200 Subject: [PATCH 37/65] Fix: Fixing spelling error --- .../Runtime/com.unity.netcode.adapter.utp.asmdef | 2 +- .../Editor/com.unity.netcode.adapter.utp.editortests.asmdef | 4 ++-- .../Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef | 4 ++-- testproject/Assets/Scripts/testproject.asmdef | 2 +- testproject/ProjectSettings/ProjectSettings.asset | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef index fdc8f9488c..84ff623c67 100644 --- a/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef +++ b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef @@ -1,5 +1,5 @@ { - "name": "Unity.Netcode.Adapater.UTP", + "name": "Unity.Netcode.Adapter.UTP", "rootNamespace": "", "references": [ "Unity.Collections", diff --git a/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef index db0855e44e..71e472c195 100644 --- a/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef +++ b/com.unity.netcode.adapter.utp/Tests/Editor/com.unity.netcode.adapter.utp.editortests.asmdef @@ -1,10 +1,10 @@ { - "name": "Unity.Netcode.Adapater.UTP.EditorTests", + "name": "Unity.Netcode.Adapter.UTP.EditorTests", "rootNamespace": "Unity.Netcode.UTP.EditorTests", "references": [ "Unity.Netcode.Runtime", "Unity.Networking.Transport", - "Unity.Netcode.Adapater.UTP" + "Unity.Netcode.Adapter.UTP" ], "optionalUnityReferences": [ "TestAssemblies" diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef index 03dabc495e..9abd7f4b5d 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/com.unity.netcode.adapter.utp.runtimetests.asmdef @@ -1,12 +1,12 @@ { - "name": "Unity.Netcode.Adapater.UTP.RuntimeTests", + "name": "Unity.Netcode.Adapter.UTP.RuntimeTests", "rootNamespace": "Unity.Netcode.UTP.RuntimeTests", "references": [ "Unity.Netcode.Runtime", "Unity.Networking.Transport", "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "Unity.Netcode.Adapater.UTP" + "Unity.Netcode.Adapter.UTP" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 60f558af8f..e48da7c834 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -5,7 +5,7 @@ "Unity.Netcode.Runtime", "Unity.Netcode.Editor", "Unity.Netcode.Prototyping", - "Unity.Netcode.Adapater.UTP", + "Unity.Netcode.Adapter.UTP", "Unity.Services.Authentication", "Unity.Services.Core", "Unity.Services.Relay" diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 8dd731d6ee..34e206a82f 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -678,7 +678,7 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: 41b4b759-38bb-46fb-9eb2-b233a90bade7 + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] projectName: relay-stg From dabe2d01944ad0c8e94847a590f98cf37077c985 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 20:48:48 +0200 Subject: [PATCH 38/65] Fix: Fixing tests Fixing tests and fixing coding standards for Adapter project. --- .../Runtime/UTPTransport.cs | 35 ++++++++++--------- .../Tests/Runtime/ConnectionTests.cs | 17 +++++---- .../Tests/Runtime/Helpers/DriverClient.cs | 7 ++-- .../Runtime/Helpers/RuntimeTestsHelpers.cs | 17 +++++---- .../Tests/Runtime/TransportTests.cs | 15 ++++---- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index c55e440d1d..000bce40f0 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -133,7 +133,7 @@ private IEnumerator ClientBindAndConnect(SocketTask task) yield break; } - m_NetworkParameters.Add(new RelayNetworkParameter {ServerData = m_RelayServerData}); + m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); } else { @@ -177,8 +177,6 @@ private IEnumerator ClientBindAndConnect(SocketTask task) private IEnumerator ServerBindAndListen(SocketTask task, NetworkEndPoint endPoint) { - //var endpoint = NetworkEndPoint.Parse(m_ServerAddress, m_ServerPort); - InitDriver(); if (m_Driver.Bind(endPoint) != 0) @@ -276,7 +274,7 @@ private IEnumerator StartRelayServer(SocketTask task) } else { - m_NetworkParameters.Add(new RelayNetworkParameter {ServerData = m_RelayServerData}); + m_NetworkParameters.Add(new RelayNetworkParameter { ServerData = m_RelayServerData }); yield return ServerBindAndListen(task, NetworkEndPoint.AnyIpv4); } @@ -326,17 +324,15 @@ private bool ProcessEvent() { while (reader.GetBytesRead() < reader.Length) { - var channelId = reader.ReadByte(); var payloadSize = reader.ReadInt(); - ReadData(payloadSize, ref reader, ref networkConnection, channelId); + ReadData(payloadSize, ref reader, ref networkConnection); } } else // If is not batched, then read the entire buffer at once { - var channelId = reader.ReadByte(); var payloadSize = reader.ReadInt(); - ReadData(payloadSize, ref reader, ref networkConnection, channelId); + ReadData(payloadSize, ref reader, ref networkConnection); } return true; @@ -345,8 +341,7 @@ private bool ProcessEvent() return false; } - private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection, - byte channelId) + private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkConnection networkConnection) { if (size > m_MessageBufferSize) { @@ -376,7 +371,7 @@ private void Update() { m_Driver.ScheduleUpdate().Complete(); - while(AcceptConnection() && m_Driver.IsCreated) + while (AcceptConnection() && m_Driver.IsCreated) { ; } @@ -398,12 +393,12 @@ private void OnDestroy() private static unsafe ulong ParseClientId(NetworkConnection utpConnectionId) { - return *(ulong*) &utpConnectionId; + return *(ulong*)&utpConnectionId; } private static unsafe NetworkConnection ParseClientId(ulong netcodeConnectionId) { - return *(NetworkConnection*) &netcodeConnectionId; + return *(NetworkConnection*)&netcodeConnectionId; } public override void DisconnectLocalClient() @@ -456,10 +451,10 @@ public override void Initialize() // size, we need to allow a bit more than that in FragmentationUtility since this needs // to account for headers and such. 128 bytes is plenty enough for such overhead. var maxFragmentationCapacity = MaximumMessageLength + 128; - m_NetworkParameters.Add(new FragmentationUtility.Parameters() {PayloadCapacity = maxFragmentationCapacity}); + m_NetworkParameters.Add(new FragmentationUtility.Parameters() { PayloadCapacity = maxFragmentationCapacity }); m_NetworkParameters.Add(new BaselibNetworkParameter() { - maximumPayloadSize = (uint) m_MessageBufferSize, + maximumPayloadSize = (uint)m_MessageBufferSize, receiveQueueCapacity = m_ReciveQueueSize, sendQueueCapacity = m_SendQueueSize }); @@ -479,8 +474,15 @@ public override void Send(ulong clientId, ArraySegment payload, NetworkDel { var size = payload.Count + 1 + 4; // 1 extra byte for the channel and another 4 for the count of the data var pipeline = SelectSendPipeline(networkDelivery, size); - +/* Unmerged change from project 'Unity.Netcode.Adapater.UTP' +Before: SendTarget sendTarget = new SendTarget(clientId, pipeline); +After: + var sendTarget = new SendTarget(clientId, pipeline); +*/ + + + var sendTarget = new SendTarget(clientId, pipeline); if (!m_SendQueue.TryGetValue(sendTarget, out var queue)) { queue = new SendQueue(m_SendQueueBatchSize); @@ -526,7 +528,6 @@ private unsafe void SendBatchedMessage(ulong clientId, ref NativeArray dat result = m_Driver.EndSend(writer); if (result == payloadSize) // If the whole data fit, then we are done here { - Debug.LogFormat("Writing {0}! ", result); return; } } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 8d3b83b27a..454776c70e 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -1,18 +1,13 @@ using NUnit.Framework; -using System; using System.Collections; using System.Collections.Generic; using System.Linq; - -using Unity.Netcode; -using Unity.Netcode.UTP.RuntimeTests; using UnityEngine; using UnityEngine.TestTools; +using static Unity.Netcode.UTP.RuntimeTests.RuntimeTestsHelpers; namespace Unity.Netcode.RuntimeTests { - using static RuntimeTestsHelpers; - public class ConnectionTests { // For tests using multiple clients. @@ -70,7 +65,9 @@ public IEnumerator ConnectMultipleClients() server.Shutdown(); for (int i = 0; i < NumClients; i++) + { clients[i].Shutdown(); + } yield return null; } @@ -132,7 +129,9 @@ public IEnumerator ServerDisconnectMultipleClients() // Disconnect all the other clients. for (int i = 1; i < NumClients; i++) + { server.DisconnectRemoteClient(serverEvents[i].ClientID); + } // Need to manually wait since we don't know which client got the Disconnect. yield return new WaitForSeconds(MaxNetworkEventWaitTime); @@ -143,7 +142,9 @@ public IEnumerator ServerDisconnectMultipleClients() server.Shutdown(); for (int i = 0; i < NumClients; i++) + { clients[i].Shutdown(); + } yield return null; } @@ -201,7 +202,9 @@ public IEnumerator ClientDisconnectMultipleClients() // Disconnect all the other clients. for (int i = 1; i < NumClients; i++) + { clients[i].DisconnectLocalClient(); + } yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); @@ -211,7 +214,9 @@ public IEnumerator ClientDisconnectMultipleClients() server.Shutdown(); for (int i = 0; i < NumClients; i++) + { clients[i].Shutdown(); + } yield return null; } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs index 3860fb6a70..52686e2721 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs @@ -5,11 +5,10 @@ using UnityEngine; using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; +using static Unity.Netcode.UTP.RuntimeTests.RuntimeTestsHelpers; namespace Unity.Netcode.UTP.RuntimeTests { - using static RuntimeTestsHelpers; - // Thin wrapper around a UTP NetworkDriver that can act as a client to a UTPTransport server. // In particular that means the pipelines are set up the same way as in UTPTransport. // @@ -37,7 +36,7 @@ public class DriverClient : MonoBehaviour private void Awake() { var maxCap = UTPTransport.MaximumMessageLength + 128; - var fragParams = new FragmentationUtility.Parameters(){ PayloadCapacity = maxCap }; + var fragParams = new FragmentationUtility.Parameters() { PayloadCapacity = maxCap }; m_Driver = NetworkDriver.Create(fragParams); @@ -56,7 +55,9 @@ private void Update() private void OnDestroy() { if (m_Driver.IsCreated) + { m_Driver.Dispose(); + } } public void Connect() diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 1feef3e77e..953ef0283b 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -3,10 +3,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; - -using Unity.Netcode; using UnityEngine; -using UnityEngine.TestTools; namespace Unity.Netcode.UTP.RuntimeTests { @@ -68,15 +65,17 @@ public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment da { // Copy the data since the backing array will be reused for future messages. if (data != default(ArraySegment)) + { data = new ArraySegment(data.ToArray()); + } m_Events.Add(new TransportEvent - { - Type = type, - ClientID = clientID, - Data = data, - ReceiveTime = receiveTime - }); + { + Type = type, + ClientID = clientID, + Data = data, + ReceiveTime = receiveTime + }); } } } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index 023702d413..d5a1e6763b 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -5,11 +5,10 @@ using System.Linq; using System.Text; using UnityEngine.TestTools; +using static Unity.Netcode.UTP.RuntimeTests.RuntimeTestsHelpers; namespace Unity.Netcode.UTP.RuntimeTests { - using static RuntimeTestsHelpers; - public class TransportTests { // Check if can make a simple data exchange. @@ -103,10 +102,10 @@ public IEnumerator MultipleSendsSingleFrame() yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - var data1 = new ArraySegment(new byte [] { 11 }); + var data1 = new ArraySegment(new byte[] { 11 }); client.Send(client.ServerClientId, data1, NetworkDelivery.ReliableSequenced); - var data2 = new ArraySegment(new byte [] { 22 }); + var data2 = new ArraySegment(new byte[] { 22 }); client.Send(client.ServerClientId, data2, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -143,10 +142,10 @@ public IEnumerator SendMultipleClients() // Ensure we got both Connect events. Assert.AreEqual(2, serverEvents.Count); - var data1 = new ArraySegment(new byte [] { 11 }); + var data1 = new ArraySegment(new byte[] { 11 }); server.Send(serverEvents[0].ClientID, data1, NetworkDelivery.ReliableSequenced); - var data2 = new ArraySegment(new byte [] { 22 }); + var data2 = new ArraySegment(new byte[] { 22 }); server.Send(serverEvents[1].ClientID, data2, NetworkDelivery.ReliableSequenced); // Once one has received its data, the other should have too. @@ -187,10 +186,10 @@ public IEnumerator ReceiveMultipleClients() // Ensure we got the Connect event on the other client too. Assert.AreEqual(1, client2Events.Count); - var data1 = new ArraySegment(new byte [] { 11 }); + var data1 = new ArraySegment(new byte[] { 11 }); client1.Send(client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); - var data2 = new ArraySegment(new byte [] { 22 }); + var data2 = new ArraySegment(new byte[] { 22 }); client2.Send(client2.ServerClientId, data2, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); From 5c45642cc55577b1cb8017e52055dde826e9ad43 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 20:59:46 +0200 Subject: [PATCH 39/65] Fix: Fixing wrong path and package reference. --- testproject-tools-integration/Packages/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject-tools-integration/Packages/manifest.json b/testproject-tools-integration/Packages/manifest.json index 7d187e5d57..47c85028ca 100644 --- a/testproject-tools-integration/Packages/manifest.json +++ b/testproject-tools-integration/Packages/manifest.json @@ -4,7 +4,7 @@ "com.unity.ide.rider": "3.0.7", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.multiplayer.tools": "0.0.1-preview.8", - "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.unity.netcode.adapter.utp": "file:../../com.unity.netcode.adapter.utp", "com.unity.test-framework": "1.1.26", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", From 3fa3b2d5001cacdd0abe3a47f3b7d654c7382e9a Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 21:34:29 +0200 Subject: [PATCH 40/65] Fix: Coding standards --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 000bce40f0..1101345e3f 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -474,13 +474,6 @@ public override void Send(ulong clientId, ArraySegment payload, NetworkDel { var size = payload.Count + 1 + 4; // 1 extra byte for the channel and another 4 for the count of the data var pipeline = SelectSendPipeline(networkDelivery, size); -/* Unmerged change from project 'Unity.Netcode.Adapater.UTP' -Before: - SendTarget sendTarget = new SendTarget(clientId, pipeline); -After: - var sendTarget = new SendTarget(clientId, pipeline); -*/ - var sendTarget = new SendTarget(clientId, pipeline); if (!m_SendQueue.TryGetValue(sendTarget, out var queue)) From 19a792d48ee1a0ccc6721eeeb980d45525349df3 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Tue, 7 Sep 2021 21:44:36 +0200 Subject: [PATCH 41/65] Fix: Fixing coding standards --- .../Tests/Runtime/ConnectionTests.cs | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 454776c70e..2e96dea0f7 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -11,7 +11,7 @@ namespace Unity.Netcode.RuntimeTests public class ConnectionTests { // For tests using multiple clients. - private const int NumClients = 5; + private const int k_NumClients = 5; // Check connection with a single client. [UnityTest] @@ -43,15 +43,15 @@ public IEnumerator ConnectSingleClient() public IEnumerator ConnectMultipleClients() { UTPTransport server; - var clients = new UTPTransport[NumClients]; + var clients = new UTPTransport[k_NumClients]; List serverEvents; - var clientsEvents = new List[NumClients]; + var clientsEvents = new List[k_NumClients]; InitializeTransport(out server, out serverEvents); server.StartServer(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { InitializeTransport(out clients[i], out clientsEvents[i]); clients[i].StartClient(); @@ -64,7 +64,7 @@ public IEnumerator ConnectMultipleClients() Assert.True(clientsEvents.All(evs => evs[0].Type == NetworkEvent.Connect)); server.Shutdown(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { clients[i].Shutdown(); } @@ -102,15 +102,15 @@ public IEnumerator ServerDisconnectSingleClient() public IEnumerator ServerDisconnectMultipleClients() { UTPTransport server; - var clients = new UTPTransport[NumClients]; + var clients = new UTPTransport[k_NumClients]; List serverEvents; - var clientsEvents = new List[NumClients]; + var clientsEvents = new List[k_NumClients]; InitializeTransport(out server, out serverEvents); server.StartServer(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { InitializeTransport(out clients[i], out clientsEvents[i]); clients[i].StartClient(); @@ -128,7 +128,7 @@ public IEnumerator ServerDisconnectMultipleClients() Assert.AreEqual(1, clientsEvents.Count(evs => evs.Count == 2 && evs[1].Type == NetworkEvent.Disconnect)); // Disconnect all the other clients. - for (int i = 1; i < NumClients; i++) + for (int i = 1; i < k_NumClients; i++) { server.DisconnectRemoteClient(serverEvents[i].ClientID); } @@ -141,7 +141,7 @@ public IEnumerator ServerDisconnectMultipleClients() Assert.True(clientsEvents.All(evs => evs[1].Type == NetworkEvent.Disconnect)); server.Shutdown(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { clients[i].Shutdown(); } @@ -179,15 +179,15 @@ public IEnumerator ClientDisconnectSingleClient() public IEnumerator ClientDisconnectMultipleClients() { UTPTransport server; - var clients = new UTPTransport[NumClients]; + var clients = new UTPTransport[k_NumClients]; List serverEvents; - var clientsEvents = new List[NumClients]; + var clientsEvents = new List[k_NumClients]; InitializeTransport(out server, out serverEvents); server.StartServer(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { InitializeTransport(out clients[i], out clientsEvents[i]); clients[i].StartClient(); @@ -201,7 +201,7 @@ public IEnumerator ClientDisconnectMultipleClients() yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); // Disconnect all the other clients. - for (int i = 1; i < NumClients; i++) + for (int i = 1; i < k_NumClients; i++) { clients[i].DisconnectLocalClient(); } @@ -209,11 +209,11 @@ public IEnumerator ClientDisconnectMultipleClients() yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); // Check that we got the correct number of Disconnect events on the server. - Assert.AreEqual(NumClients * 2, serverEvents.Count); - Assert.AreEqual(NumClients, serverEvents.Count(e => e.Type == NetworkEvent.Disconnect)); + Assert.AreEqual(k_NumClients * 2, serverEvents.Count); + Assert.AreEqual(k_NumClients, serverEvents.Count(e => e.Type == NetworkEvent.Disconnect)); server.Shutdown(); - for (int i = 0; i < NumClients; i++) + for (int i = 0; i < k_NumClients; i++) { clients[i].Shutdown(); } From 1cd8eaa5bbb4410cc4b640e62334da10fa3a4370 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 12:16:41 +0200 Subject: [PATCH 42/65] Fix: Allow for the ability to provide a new driver/pipeline constructor --- .../Runtime/UTPTransport.cs | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 1101345e3f..d09586f4e2 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -2,18 +2,26 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Unity.Networking.Transport; -using Unity.Networking.Transport.Relay; using UnityEngine; -using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; +using UTPNetworkEvent = Unity.Netcode.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; using Unity.Collections; +using Unity.Networking.Transport; +using Unity.Networking.Transport.Relay; using Unity.Networking.Transport.Utilities; namespace Unity.Netcode { - public class UTPTransport : NetworkTransport + /// + /// Provides an interface that overrides the ability to create your own drivers and pipelines + /// + public interface INetworkStreamDriverConstructor + { + void CreateDriver(UTPTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline); + } + + public class UTPTransport : NetworkTransport, INetworkStreamDriverConstructor { public enum ProtocolType { @@ -30,6 +38,11 @@ private enum State public const int MaximumMessageLength = 6 * 1024; +#pragma warning disable IDE1006 // Naming Styles + public static INetworkStreamDriverConstructor s_DriverConstructor; +#pragma warning restore IDE1006 // Naming Styles + public INetworkStreamDriverConstructor DriverConstructor => DriverConstructor != null ? DriverConstructor : this; + [SerializeField] private ProtocolType m_ProtocolType; [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; [SerializeField] private int m_ReciveQueueSize = 128; @@ -64,20 +77,7 @@ private enum State private void InitDriver() { - if (m_NetworkParameters.Count > 0) - { - m_Driver = NetworkDriver.Create(m_NetworkParameters.ToArray()); - } - else - { - m_Driver = NetworkDriver.Create(); - } - - m_UnreliableSequencedPipeline = m_Driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); - m_ReliableSequencedPipeline = m_Driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); - m_ReliableSequencedFragmentedPipeline = m_Driver.CreatePipeline( - typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) - ); + DriverConstructor.CreateDriver(this, out m_Driver, out m_UnreliableSequencedPipeline, out m_ReliableSequencedPipeline, out m_ReliableSequencedFragmentedPipeline); } private void DisposeDriver() @@ -289,7 +289,7 @@ private bool AcceptConnection() return false; } - InvokeOnTransportEvent(NetworkEvent.Connect, + InvokeOnTransportEvent(UTPNetworkEvent.Connect, ParseClientId(connection), default(ArraySegment), Time.realtimeSinceStartup); @@ -304,21 +304,21 @@ private bool ProcessEvent() switch (eventType) { - case UTPNetworkEvent.Type.Connect: - InvokeOnTransportEvent(NetworkEvent.Connect, + case Networking.Transport.NetworkEvent.Type.Connect: + InvokeOnTransportEvent(UTPNetworkEvent.Connect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case UTPNetworkEvent.Type.Disconnect: - InvokeOnTransportEvent(NetworkEvent.Disconnect, + case Networking.Transport.NetworkEvent.Type.Disconnect: + InvokeOnTransportEvent(UTPNetworkEvent.Disconnect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case UTPNetworkEvent.Type.Data: + case Networking.Transport.NetworkEvent.Type.Data: var isBatched = reader.ReadByte(); if (isBatched == 1) { @@ -357,7 +357,7 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC } } - InvokeOnTransportEvent(NetworkEvent.Data, + InvokeOnTransportEvent(UTPNetworkEvent.Data, ParseClientId(networkConnection), new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup @@ -462,12 +462,12 @@ public override void Initialize() m_MessageBuffer = new byte[m_MessageBufferSize]; } - public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) + public override UTPNetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = default; payload = default; receiveTime = default; - return NetworkEvent.Nothing; + return UTPNetworkEvent.Nothing; } public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) @@ -637,6 +637,24 @@ public override void Shutdown() m_SendQueue.Clear(); } + public void CreateDriver(UTPTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline) + { + if (transport.m_NetworkParameters.Count > 0) + { + driver = NetworkDriver.Create(transport.m_NetworkParameters.ToArray()); + } + else + { + driver = NetworkDriver.Create(); + } + + unreliableSequencedPipeline = driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + reliableSequencedPipeline = driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); + reliableSequencedFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) + ); + } + // -------------- Utility Types ------------------------------------------------------------------------------- From 35d394bad6eda5592ab96d052a6e7bc6b80c6883 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 12:24:35 +0200 Subject: [PATCH 43/65] Fix: Fixing a copy pasta error --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index d09586f4e2..2d1373827f 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -41,7 +41,7 @@ private enum State #pragma warning disable IDE1006 // Naming Styles public static INetworkStreamDriverConstructor s_DriverConstructor; #pragma warning restore IDE1006 // Naming Styles - public INetworkStreamDriverConstructor DriverConstructor => DriverConstructor != null ? DriverConstructor : this; + public INetworkStreamDriverConstructor DriverConstructor => s_DriverConstructor != null ? DriverConstructor : this; [SerializeField] private ProtocolType m_ProtocolType; [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; From 10b84a76c2c6ea95340574547f2e87da27b8776e Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 12:51:01 +0200 Subject: [PATCH 44/65] test: up the timeout to 150ms We give a little extra room for the timeout because the test runner may launch a series of tests and thus impact the 50ms time 150ms seems to be reasonable. --- .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 953ef0283b..66f46b9a74 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -10,7 +10,7 @@ namespace Unity.Netcode.UTP.RuntimeTests public static class RuntimeTestsHelpers { // 50ms should be plenty enough for any network interaction to occur (even roundtrips). - public const float MaxNetworkEventWaitTime = 0.05f; + public const float MaxNetworkEventWaitTime = 0.15f; // Wait for an event to appear in the given event list (must be the very next event). public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events) From 7143ad87b49ef50778fe819418eb5de4f8b36744 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 12:58:58 +0200 Subject: [PATCH 45/65] fix: Fixing coding standards --- testproject/Assets/Scripts/ConnectionModeScript.cs | 2 +- testproject/Assets/Scripts/RelayJoinCodeInput.cs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index a77182f2e8..1c572f365e 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -202,7 +202,7 @@ public void OnStartClientButton() if (NetworkManager.Singleton && !NetworkManager.Singleton.IsListening && m_ConnectionModeButtons) { #if ENABLE_RELAY_SERVICE - StartCoroutine(StartRelayClient()); + StartCoroutine(StartRelayClient()); #else StartClient(); #endif diff --git a/testproject/Assets/Scripts/RelayJoinCodeInput.cs b/testproject/Assets/Scripts/RelayJoinCodeInput.cs index 70895562cf..1c18f76e2e 100644 --- a/testproject/Assets/Scripts/RelayJoinCodeInput.cs +++ b/testproject/Assets/Scripts/RelayJoinCodeInput.cs @@ -13,8 +13,10 @@ private void Start() private void Update() { - if (m_TextInput.IsInteractable()) { - if (!string.IsNullOrEmpty(ConnectionScript.RelayJoinCode)) { + if (m_TextInput.IsInteractable()) + { + if (!string.IsNullOrEmpty(ConnectionScript.RelayJoinCode)) + { m_TextInput.text = ConnectionScript.RelayJoinCode; m_TextInput.readOnly = true; } From 5bce37121e6e18e98d6602162438083b63bee160 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 16:21:22 +0200 Subject: [PATCH 46/65] Fix: Fixing more whitespace issues --- testproject/Assets/Scripts/UIController.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index de077807f2..9b85f78356 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -17,7 +17,8 @@ public class UIController : MonoBehaviour private void Awake() { #if ENABLE_RELAY_SERVICE - if (Transport.Protocol == UTPTransport.ProtocolType.RelayUnityTransport) { + if (Transport.Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + { HideButtons(); JoinCode.SetActive(false); } @@ -56,7 +57,8 @@ public async void OnSignIn() await AuthenticationService.Instance.SignInAnonymouslyAsync(); Debug.Log($"Logging in with PlayerID {AuthenticationService.Instance.PlayerId}"); - if (AuthenticationService.Instance.IsSignedIn) { + if (AuthenticationService.Instance.IsSignedIn) + { ButtonsRoot.SetActive(true); JoinCode.SetActive(true); AuthButton.SetActive(false); From bf31bc76770c715fe6a8ad79aba728c360e49974 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 19:04:38 +0200 Subject: [PATCH 47/65] chore: Adding in some tools for simulator stuff --- com.unity.netcode.adapter.utp/Editor.meta | 8 ++ .../Editor/MultiplayerWindow.cs | 60 +++++++++++++ .../Editor/MultiplayerWindow.cs.meta | 11 +++ ...om.unity.netcode.adapter.utp.editor.asmdef | 22 +++++ ...ity.netcode.adapter.utp.editor.asmdef.meta | 7 ++ .../Runtime/UTPTransport.cs | 85 +++++++++++++++++-- .../Runtime/Helpers/RuntimeTestsHelpers.cs | 1 - 7 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 com.unity.netcode.adapter.utp/Editor.meta create mode 100644 com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs create mode 100644 com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs.meta create mode 100644 com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef create mode 100644 com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef.meta diff --git a/com.unity.netcode.adapter.utp/Editor.meta b/com.unity.netcode.adapter.utp/Editor.meta new file mode 100644 index 0000000000..75ed8837de --- /dev/null +++ b/com.unity.netcode.adapter.utp/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 191a641d72a2e49e0876f4c985b1bdab +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs new file mode 100644 index 0000000000..6395da940a --- /dev/null +++ b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs @@ -0,0 +1,60 @@ +using UnityEditor; +using UnityEngine; + +namespace Unity.Netcode.Editor +{ + public class MultiplayerWindow : EditorWindow + { + private const string k_PrefsKeyPrefix = "NetcodeGameObjects"; + + [MenuItem("Netcode/NGO Tools")] + public static void ShowWindow() + { + GetWindow(false, "NGO Tools Tools", true); + } + + private void OnGUI() + { + EditorInt("Client send/recv delay (ms)", "ClientDelay", 0, 2000); + EditorInt("Client send/recv jitter (ms)", "ClientJitter", 0, 200); + EditorInt("Client packet drop (percentage)", "ClientDropRate", 0, 100); + } + + private static string GetKey(string subKey) + { + return k_PrefsKeyPrefix + "_" + Application.productName + "_" + subKey; + } + + private int EditorInt(string label, string key = null, int minValue = int.MinValue, int maxValue = int.MaxValue) + { + string prefsKey = (string.IsNullOrEmpty(key) ? GetKey(label) : GetKey(key)); + int value; + value = EditorPrefs.GetInt(prefsKey); + + if (value < minValue) + { + value = minValue; + } + + if (value > maxValue) + { + value = maxValue; + } + + value = EditorGUILayout.IntField(label, value); + if (value < minValue) + { + value = minValue; + } + + if (value > maxValue) + { + value = maxValue; + } + + EditorPrefs.SetInt(prefsKey, value); + + return value; + } + } +} diff --git a/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs.meta b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs.meta new file mode 100644 index 0000000000..92757498fb --- /dev/null +++ b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3b1aa39632a3442d89c1bcac12d94b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef b/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef new file mode 100644 index 0000000000..cd3256c0dc --- /dev/null +++ b/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Unity.Netcode.Adapter.UTP.Editor", + "rootNamespace": "", + "references": [ + "Unity.Collections", + "Unity.Jobs", + "Unity.Burst", + "Unity.Netcode.Runtime", + "Unity.Networking.Transport" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": true, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef.meta b/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef.meta new file mode 100644 index 0000000000..a6b631fdec --- /dev/null +++ b/com.unity.netcode.adapter.utp/Editor/com.unity.netcode.adapter.utp.editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a5fe0308ef4604593b1bd69a244fb186 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 2d1373827f..1b19252642 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -70,6 +70,43 @@ private enum State private RelayServerData m_RelayServerData; +#if UNITY_EDITOR + private static int ClientPacketDelayMs => UnityEditor.EditorPrefs.GetInt($"NetcodeGameObjects_{Application.productName}_ClientDelay"); + private static int ClientPacketJitterMs => UnityEditor.EditorPrefs.GetInt($"NetcodeGameObjects_{Application.productName}_ClientJitter"); + private static int ClientPacketDropRate => UnityEditor.EditorPrefs.GetInt($"NetcodeGameObjects_{Application.productName}_ClientDropRate"); +#elif DEVELOPMENT_BUILD + public static int ClientPacketDelayMs = 0; + public static int ClientPacketJitterMs = 0; + public static int ClientPacketDropRate = 0; +#endif +#if UNITY_EDITOR || DEVELOPMENT_BUILD + public SimulatorUtility.Parameters ClientSimulatorParameters + { + get + { + var packetDelay = ClientPacketDelayMs; + var jitter = ClientPacketJitterMs; + if (jitter > packetDelay) + { + jitter = packetDelay; + } + + var packetDrop = ClientPacketDropRate; + int networkRate = 60; // TODO: read from some better place + // All 3 packet types every frame stored for maximum delay, doubled for safety margin + int maxPackets = 2 * (networkRate * 3 * packetDelay + 999) / 1000; + return new SimulatorUtility.Parameters + { + MaxPacketSize = NetworkParameterConstants.MTU, + MaxPacketCount = maxPackets, + PacketDelayMs = packetDelay, + PacketJitterMs = jitter, + PacketDropPercentage = packetDrop + }; + } + } +#endif + /// /// SendQueue dictionary is used to batch events instead of sending them immediately. /// @@ -639,6 +676,22 @@ public override void Shutdown() public void CreateDriver(UTPTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline) { + +#if UNITY_EDITOR || DEVELOPMENT_BUILD + var netParams = new NetworkConfigParameter + { + maxConnectAttempts = NetworkParameterConstants.MaxConnectAttempts, + connectTimeoutMS = NetworkParameterConstants.ConnectTimeoutMS, + disconnectTimeoutMS = NetworkParameterConstants.DisconnectTimeoutMS, + maxFrameTimeMS = 100 + }; + + var simulatorParams = ClientSimulatorParameters; + transport.m_NetworkParameters.Insert(0, simulatorParams); + transport.m_NetworkParameters.Insert(0, netParams); +#else + driver = NetworkDriver.Create(reliabilityParams, fragmentationParams); +#endif if (transport.m_NetworkParameters.Count > 0) { driver = NetworkDriver.Create(transport.m_NetworkParameters.ToArray()); @@ -647,12 +700,32 @@ public void CreateDriver(UTPTransport transport, out NetworkDriver driver, out N { driver = NetworkDriver.Create(); } - - unreliableSequencedPipeline = driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); - reliableSequencedPipeline = driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); - reliableSequencedFragmentedPipeline = driver.CreatePipeline( - typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) - ); +#if UNITY_EDITOR || DEVELOPMENT_BUILD + if (simulatorParams.PacketDelayMs > 0 || simulatorParams.PacketDropInterval > 0) + { + unreliableSequencedPipeline = driver.CreatePipeline( + typeof(UnreliableSequencedPipelineStage), + typeof(SimulatorPipelineStage), + typeof(SimulatorPipelineStageInSend)); + reliableSequencedPipeline = driver.CreatePipeline( + typeof(ReliableSequencedPipelineStage), + typeof(SimulatorPipelineStage), + typeof(SimulatorPipelineStageInSend)); + reliableSequencedFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), + typeof(ReliableSequencedPipelineStage), + typeof(SimulatorPipelineStage), + typeof(SimulatorPipelineStageInSend)); + } + else +#endif + { + unreliableSequencedPipeline = driver.CreatePipeline(typeof(UnreliableSequencedPipelineStage)); + reliableSequencedPipeline = driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); + reliableSequencedFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage) + ); + } } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 66f46b9a74..2ed90f1ec6 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -2,7 +2,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; using UnityEngine; namespace Unity.Netcode.UTP.RuntimeTests From ea523fd837ee4085de6540590ee1755c11552c60 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 20:18:57 +0200 Subject: [PATCH 48/65] Rolling back to an older version of UTP to see if tests pass --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 2 +- com.unity.netcode.adapter.utp/package.json | 2 +- testproject/Packages/manifest.json | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 1b19252642..c43bd8cab7 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -294,7 +294,7 @@ public void SetRelayServerData(string ipv4Address, ushort port, byte[] allocatio } m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, - ref hostConnectionData, ref key, isSecure); + ref hostConnectionData, ref key); m_RelayServerData.ComputeNewNonce(); } diff --git a/com.unity.netcode.adapter.utp/package.json b/com.unity.netcode.adapter.utp/package.json index 050da4e23c..d70b67fb38 100644 --- a/com.unity.netcode.adapter.utp/package.json +++ b/com.unity.netcode.adapter.utp/package.json @@ -6,6 +6,6 @@ "unity": "2020.3", "dependencies": { "com.unity.netcode.gameobjects": "0.0.1-preview.1", - "com.unity.transport": "1.0.0-pre.4" + "com.unity.transport": "0.9.0-preview.3" } } \ No newline at end of file diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index ad9e383464..0a95c18271 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -15,7 +15,6 @@ "com.unity.test-framework.performance": "2.8.0-preview", "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.6.2", - "com.unity.transport": "1.0.0-pre.4", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", @@ -52,5 +51,15 @@ "testables": [ "com.unity.netcode.gameobjects", "com.unity.netcode.adapter.utp" + ], + "scopedRegistries": [ + { + "name": "Candidate", + "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", + "scopes": [ + "com.unity.transport", + "com.unity.collections" + ] + } ] } From 54830b55a38521fc67470c3537e3a1553bcea371 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 20:31:27 +0200 Subject: [PATCH 49/65] Revert "Rolling back to an older version of UTP to see if tests pass" This reverts commit ea523fd837ee4085de6540590ee1755c11552c60. --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 2 +- com.unity.netcode.adapter.utp/package.json | 2 +- testproject/Packages/manifest.json | 11 +---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index c43bd8cab7..1b19252642 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -294,7 +294,7 @@ public void SetRelayServerData(string ipv4Address, ushort port, byte[] allocatio } m_RelayServerData = new RelayServerData(ref serverEndpoint, 0, ref allocationId, ref connectionData, - ref hostConnectionData, ref key); + ref hostConnectionData, ref key, isSecure); m_RelayServerData.ComputeNewNonce(); } diff --git a/com.unity.netcode.adapter.utp/package.json b/com.unity.netcode.adapter.utp/package.json index d70b67fb38..050da4e23c 100644 --- a/com.unity.netcode.adapter.utp/package.json +++ b/com.unity.netcode.adapter.utp/package.json @@ -6,6 +6,6 @@ "unity": "2020.3", "dependencies": { "com.unity.netcode.gameobjects": "0.0.1-preview.1", - "com.unity.transport": "0.9.0-preview.3" + "com.unity.transport": "1.0.0-pre.4" } } \ No newline at end of file diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 0a95c18271..ad9e383464 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -15,6 +15,7 @@ "com.unity.test-framework.performance": "2.8.0-preview", "com.unity.textmeshpro": "3.0.6", "com.unity.timeline": "1.6.2", + "com.unity.transport": "1.0.0-pre.4", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", @@ -51,15 +52,5 @@ "testables": [ "com.unity.netcode.gameobjects", "com.unity.netcode.adapter.utp" - ], - "scopedRegistries": [ - { - "name": "Candidate", - "url": "https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates", - "scopes": [ - "com.unity.transport", - "com.unity.collections" - ] - } ] } From a575916fed25dce69407db5464571556611d702b Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 20:46:05 +0200 Subject: [PATCH 50/65] Testing a bug fix :P --- .../Runtime/Core/NetworkManager.cs | 2 +- .../Tests/Runtime/Helpers/NetworkManagerHelper.cs | 13 ++++++------- .../Runtime/com.unity.netcode.runtimetests.asmdef | 5 +++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 6bbd2841ba..70833997f6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -905,7 +905,7 @@ public void Shutdown() } } - if (IsClient) + if (IsClient && IsConnectedClient) { // Client only, send disconnect to server NetworkConfig.NetworkTransport.DisconnectLocalClient(); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs index 44e27b7b84..d0c8d68f06 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs @@ -69,7 +69,7 @@ public static bool StartNetworkManager(out NetworkManager networkManager, Networ Debug.Log($"{nameof(NetworkManager)} Instantiated."); - var unetTransport = NetworkManagerGameObject.AddComponent(); + var unetTransport = NetworkManagerGameObject.AddComponent(); if (networkConfig == null) { networkConfig = new NetworkConfig @@ -80,12 +80,11 @@ public static bool StartNetworkManager(out NetworkManager networkManager, Networ NetworkManagerObject.NetworkConfig = networkConfig; - unetTransport.ConnectAddress = "127.0.0.1"; - unetTransport.ConnectPort = 7777; - unetTransport.ServerListenPort = 7777; - unetTransport.MessageBufferSize = 65535; - unetTransport.MaxConnections = 100; - unetTransport.MessageSendMode = UNetTransport.SendMode.Immediately; + // unetTransport.ConnectAddress = "127.0.0.1"; + // unetTransport.ConnectPort = 7777; + // unetTransport.ServerListenPort = 7777; + // unetTransport.MaxConnections = 100; + // unetTransport.MessageSendMode = UNetTransport.SendMode.Immediately; NetworkManagerObject.NetworkConfig.NetworkTransport = unetTransport; // Starts the network manager in the mode specified diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef index 993f362322..0ccb5017d1 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef @@ -8,7 +8,8 @@ "Unity.Collections", "UnityEngine.TestRunner", "Unity.Multiplayer.MetricTypes", - "Unity.Multiplayer.NetStats" + "Unity.Multiplayer.NetStats", + "Unity.Netcode.Adapter.UTP" ], "includePlatforms": [], "excludePlatforms": [], @@ -29,4 +30,4 @@ } ], "noEngineReferences": false -} +} \ No newline at end of file From ef2652036904204eda4d0c96e879f66bc801af12 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 20:55:14 +0200 Subject: [PATCH 51/65] Going back to uNET --- .../Tests/Runtime/Helpers/NetworkManagerHelper.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs index d0c8d68f06..44e27b7b84 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs @@ -69,7 +69,7 @@ public static bool StartNetworkManager(out NetworkManager networkManager, Networ Debug.Log($"{nameof(NetworkManager)} Instantiated."); - var unetTransport = NetworkManagerGameObject.AddComponent(); + var unetTransport = NetworkManagerGameObject.AddComponent(); if (networkConfig == null) { networkConfig = new NetworkConfig @@ -80,11 +80,12 @@ public static bool StartNetworkManager(out NetworkManager networkManager, Networ NetworkManagerObject.NetworkConfig = networkConfig; - // unetTransport.ConnectAddress = "127.0.0.1"; - // unetTransport.ConnectPort = 7777; - // unetTransport.ServerListenPort = 7777; - // unetTransport.MaxConnections = 100; - // unetTransport.MessageSendMode = UNetTransport.SendMode.Immediately; + unetTransport.ConnectAddress = "127.0.0.1"; + unetTransport.ConnectPort = 7777; + unetTransport.ServerListenPort = 7777; + unetTransport.MessageBufferSize = 65535; + unetTransport.MaxConnections = 100; + unetTransport.MessageSendMode = UNetTransport.SendMode.Immediately; NetworkManagerObject.NetworkConfig.NetworkTransport = unetTransport; // Starts the network manager in the mode specified From bceb0755e003ed760fa6f4e16933765b9a8037c7 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 21:22:26 +0200 Subject: [PATCH 52/65] fix: fixing a compile issue --- .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 2ed90f1ec6..66f46b9a74 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace Unity.Netcode.UTP.RuntimeTests From 748160f1a6f8106c4e71327afa1902c00780fcee Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 8 Sep 2021 21:37:11 +0200 Subject: [PATCH 53/65] Fixing compile issue --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 1b19252642..68a4a27bbf 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -689,8 +689,6 @@ public void CreateDriver(UTPTransport transport, out NetworkDriver driver, out N var simulatorParams = ClientSimulatorParameters; transport.m_NetworkParameters.Insert(0, simulatorParams); transport.m_NetworkParameters.Insert(0, netParams); -#else - driver = NetworkDriver.Create(reliabilityParams, fragmentationParams); #endif if (transport.m_NetworkParameters.Count > 0) { From 18809394e0e532fcf3c63a16cdc19c35bf4b54a8 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 13:25:24 +0200 Subject: [PATCH 54/65] Trying to ensure things get cleaned up after every test --- .../Tests/Runtime/ConnectionTests.cs | 135 +++++++----------- .../Tests/Runtime/TransportTests.cs | 98 +++++++------ 2 files changed, 107 insertions(+), 126 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 2e96dea0f7..0980490b58 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -13,27 +13,56 @@ public class ConnectionTests // For tests using multiple clients. private const int k_NumClients = 5; + UTPTransport server; + UTPTransport[] clients = new UTPTransport[k_NumClients]; + + List serverEvents; + List[] clientsEvents = new List[k_NumClients]; + + [UnityTearDown] + public IEnumerator Cleanup() + { + Debug.Log("Calling Cleanup"); + + if (server) + { + server.Shutdown(); + GameObject.DestroyImmediate(server); + } + + foreach (var transport in clients) + { + if (transport) + { + transport.Shutdown(); + GameObject.DestroyImmediate(transport); + } + } + + foreach (var transportEvents in clientsEvents) + { + transportEvents?.Clear(); + } + + yield return null; + } + // Check connection with a single client. [UnityTest] public IEnumerator ConnectSingleClient() { - UTPTransport server, client; - List serverEvents, clientEvents; InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out clients[0], out clientsEvents[0]); server.StartServer(); - client.StartClient(); + clients[0].StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); // Check we've received Connect event on client too. - Assert.AreEqual(1, clientEvents.Count); - Assert.AreEqual(NetworkEvent.Connect, clientEvents[0].Type); - - server.Shutdown(); - client.Shutdown(); + Assert.AreEqual(1, clientsEvents[0].Count); + Assert.AreEqual(NetworkEvent.Connect, clientsEvents[0][0].Type); yield return null; } @@ -42,11 +71,6 @@ public IEnumerator ConnectSingleClient() [UnityTest] public IEnumerator ConnectMultipleClients() { - UTPTransport server; - var clients = new UTPTransport[k_NumClients]; - - List serverEvents; - var clientsEvents = new List[k_NumClients]; InitializeTransport(out server, out serverEvents); server.StartServer(); @@ -63,12 +87,6 @@ public IEnumerator ConnectMultipleClients() Assert.True(clientsEvents.All(evs => evs.Count == 1)); Assert.True(clientsEvents.All(evs => evs[0].Type == NetworkEvent.Connect)); - server.Shutdown(); - for (int i = 0; i < k_NumClients; i++) - { - clients[i].Shutdown(); - } - yield return null; } @@ -76,23 +94,18 @@ public IEnumerator ConnectMultipleClients() [UnityTest] public IEnumerator ServerDisconnectSingleClient() { - UTPTransport server, client; - List serverEvents, clientEvents; InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out clients[0], out clientsEvents[0]); server.StartServer(); - client.StartClient(); + clients[0].StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); server.DisconnectRemoteClient(serverEvents[0].ClientID); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientEvents); - - server.Shutdown(); - client.Shutdown(); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientsEvents[0]); yield return null; } @@ -101,12 +114,6 @@ public IEnumerator ServerDisconnectSingleClient() [UnityTest] public IEnumerator ServerDisconnectMultipleClients() { - UTPTransport server; - var clients = new UTPTransport[k_NumClients]; - - List serverEvents; - var clientsEvents = new List[k_NumClients]; - InitializeTransport(out server, out serverEvents); server.StartServer(); @@ -140,12 +147,6 @@ public IEnumerator ServerDisconnectMultipleClients() Assert.True(clientsEvents.All(evs => evs.Count == 2)); Assert.True(clientsEvents.All(evs => evs[1].Type == NetworkEvent.Disconnect)); - server.Shutdown(); - for (int i = 0; i < k_NumClients; i++) - { - clients[i].Shutdown(); - } - yield return null; } @@ -153,24 +154,19 @@ public IEnumerator ServerDisconnectMultipleClients() [UnityTest] public IEnumerator ClientDisconnectSingleClient() { - UTPTransport server, client; - List serverEvents, clientEvents; InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out clients[0], out clientsEvents[0]); server.StartServer(); - client.StartClient(); + clients[0].StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - client.DisconnectLocalClient(); + clients[0].DisconnectLocalClient(); yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); - server.Shutdown(); - client.Shutdown(); - yield return null; } @@ -178,12 +174,6 @@ public IEnumerator ClientDisconnectSingleClient() [UnityTest] public IEnumerator ClientDisconnectMultipleClients() { - UTPTransport server; - var clients = new UTPTransport[k_NumClients]; - - List serverEvents; - var clientsEvents = new List[k_NumClients]; - InitializeTransport(out server, out serverEvents); server.StartServer(); @@ -212,12 +202,6 @@ public IEnumerator ClientDisconnectMultipleClients() Assert.AreEqual(k_NumClients * 2, serverEvents.Count); Assert.AreEqual(k_NumClients, serverEvents.Count(e => e.Type == NetworkEvent.Disconnect)); - server.Shutdown(); - for (int i = 0; i < k_NumClients; i++) - { - clients[i].Shutdown(); - } - yield return null; } @@ -225,23 +209,20 @@ public IEnumerator ClientDisconnectMultipleClients() [UnityTest] public IEnumerator RepeatedServerDisconnectsNoop() { - UTPTransport server, client; - List serverEvents, clientEvents; - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out clients[0], out clientsEvents[0]); server.StartServer(); - client.StartClient(); + clients[0].StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); server.DisconnectRemoteClient(serverEvents[0].ClientID); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientsEvents[0]); var previousServerEventsCount = serverEvents.Count; - var previousClientEventsCount = clientEvents.Count; + var previousClientEventsCount = clientsEvents[0].Count; server.DisconnectRemoteClient(serverEvents[0].ClientID); @@ -250,10 +231,7 @@ public IEnumerator RepeatedServerDisconnectsNoop() // Check we haven't received anything else on the client or server. Assert.AreEqual(serverEvents.Count, previousServerEventsCount); - Assert.AreEqual(clientEvents.Count, previousClientEventsCount); - - server.Shutdown(); - client.Shutdown(); + Assert.AreEqual(clientsEvents[0].Count, previousClientEventsCount); yield return null; } @@ -262,35 +240,32 @@ public IEnumerator RepeatedServerDisconnectsNoop() [UnityTest] public IEnumerator RepeatedClientDisconnectsNoop() { - UTPTransport server, client; - List serverEvents, clientEvents; InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out clients[0], out clientsEvents[0]); server.StartServer(); - client.StartClient(); + clients[0].StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); - client.DisconnectLocalClient(); + clients[0].DisconnectLocalClient(); yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); var previousServerEventsCount = serverEvents.Count; - var previousClientEventsCount = clientEvents.Count; + var previousClientEventsCount = clientsEvents[0].Count; - client.DisconnectLocalClient(); + clients[0].DisconnectLocalClient(); // Need to wait manually since no event should be generated. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check we haven't received anything else on the client or server. Assert.AreEqual(serverEvents.Count, previousServerEventsCount); - Assert.AreEqual(clientEvents.Count, previousClientEventsCount); + Assert.AreEqual(clientsEvents[0].Count, previousClientEventsCount); server.Shutdown(); - client.Shutdown(); yield return null; } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index d5a1e6763b..a3393281a9 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using UnityEngine; using UnityEngine.TestTools; using static Unity.Netcode.UTP.RuntimeTests.RuntimeTestsHelpers; @@ -11,23 +12,52 @@ namespace Unity.Netcode.UTP.RuntimeTests { public class TransportTests { + UTPTransport server, client1, client2; + List serverEvents, client1Events, client2Events; + + [UnityTearDown] + public IEnumerator Cleanup() + { + Debug.Log("Calling Cleanup"); + if (server) + { + server.Shutdown(); + GameObject.DestroyImmediate(server); + } + + if (client1) + { + client1.Shutdown(); + GameObject.DestroyImmediate(client1); + } + + if (client2) + { + client2.Shutdown(); + GameObject.DestroyImmediate(client2); + } + + serverEvents?.Clear(); + client1Events?.Clear(); + client2Events?.Clear(); + + yield return null; + } + // Check if can make a simple data exchange. [UnityTest] public IEnumerator PingPong() { - UTPTransport server, client; - List serverEvents, clientEvents; - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out client1, out client1Events); server.StartServer(); - client.StartClient(); + client1.StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); - client.Send(client.ServerClientId, ping, NetworkDelivery.ReliableSequenced); + client1.Send(client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -36,53 +66,49 @@ public IEnumerator PingPong() var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); - yield return WaitForNetworkEvent(NetworkEvent.Data, clientEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, client1Events); - Assert.That(clientEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + Assert.That(client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); - server.Shutdown(); - client.Shutdown(); + // server.Shutdown(); + // client.Shutdown(); yield return null; } + + // Check if can make a simple data exchange (both ways at a time). [UnityTest] public IEnumerator PingPongSimultaneous() { - UTPTransport server, client; - List serverEvents, clientEvents; - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out client1, out client1Events); server.StartServer(); - client.StartClient(); + client1.StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); server.Send(serverEvents[0].ClientID, ping, NetworkDelivery.ReliableSequenced); - client.Send(client.ServerClientId, ping, NetworkDelivery.ReliableSequenced); + client1.Send(client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); - Assert.That(clientEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + Assert.That(client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); - client.Send(client.ServerClientId, pong, NetworkDelivery.ReliableSequenced); + client1.Send(client1.ServerClientId, pong, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); Assert.That(serverEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); - Assert.That(clientEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); - - server.Shutdown(); - client.Shutdown(); + Assert.That(client1Events[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); yield return null; } @@ -91,22 +117,19 @@ public IEnumerator PingPongSimultaneous() [UnityTest] public IEnumerator MultipleSendsSingleFrame() { - UTPTransport server, client; - List serverEvents, clientEvents; - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client, out clientEvents); + InitializeTransport(out client1, out client1Events); server.StartServer(); - client.StartClient(); + client1.StartClient(); yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); var data1 = new ArraySegment(new byte[] { 11 }); - client.Send(client.ServerClientId, data1, NetworkDelivery.ReliableSequenced); + client1.Send(client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte[] { 22 }); - client.Send(client.ServerClientId, data2, NetworkDelivery.ReliableSequenced); + client1.Send(client1.ServerClientId, data2, NetworkDelivery.ReliableSequenced); yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); @@ -116,9 +139,6 @@ public IEnumerator MultipleSendsSingleFrame() Assert.AreEqual(11, serverEvents[1].Data.First()); Assert.AreEqual(22, serverEvents[2].Data.First()); - server.Shutdown(); - client.Shutdown(); - yield return null; } @@ -126,9 +146,6 @@ public IEnumerator MultipleSendsSingleFrame() [UnityTest] public IEnumerator SendMultipleClients() { - UTPTransport server, client1, client2; - List serverEvents, client1Events, client2Events; - InitializeTransport(out server, out serverEvents); InitializeTransport(out client1, out client1Events); InitializeTransport(out client2, out client2Events); @@ -159,10 +176,6 @@ public IEnumerator SendMultipleClients() byte c2Data = client2Events[1].Data.First(); Assert.True((c1Data == 11 && c2Data == 22) || (c1Data == 22 && c2Data == 11)); - server.Shutdown(); - client1.Shutdown(); - client2.Shutdown(); - yield return null; } @@ -170,9 +183,6 @@ public IEnumerator SendMultipleClients() [UnityTest] public IEnumerator ReceiveMultipleClients() { - UTPTransport server, client1, client2; - List serverEvents, client1Events, client2Events; - InitializeTransport(out server, out serverEvents); InitializeTransport(out client1, out client1Events); InitializeTransport(out client2, out client2Events); @@ -202,10 +212,6 @@ public IEnumerator ReceiveMultipleClients() byte sData2 = serverEvents[3].Data.First(); Assert.True((sData1 == 11 && sData2 == 22) || (sData1 == 22 && sData2 == 11)); - server.Shutdown(); - client1.Shutdown(); - client2.Shutdown(); - yield return null; } } From c400fd1c8eefd7ce895b610c418840024a5b0576 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 18:07:58 +0200 Subject: [PATCH 55/65] test: changing timeout logic for macOS and coding standard cleanup --- .../Runtime/UTPTransport.cs | 2 +- .../Tests/Runtime/ConnectionTests.cs | 14 ++++++-------- .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 6 +++++- .../Tests/Runtime/TransportTests.cs | 10 +++++----- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 68a4a27bbf..79d3105d89 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -41,7 +41,7 @@ private enum State #pragma warning disable IDE1006 // Naming Styles public static INetworkStreamDriverConstructor s_DriverConstructor; #pragma warning restore IDE1006 // Naming Styles - public INetworkStreamDriverConstructor DriverConstructor => s_DriverConstructor != null ? DriverConstructor : this; + public INetworkStreamDriverConstructor DriverConstructor => s_DriverConstructor != null ? s_DriverConstructor : this; [SerializeField] private ProtocolType m_ProtocolType; [SerializeField] private int m_MessageBufferSize = MaximumMessageLength; diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 0980490b58..6633252449 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -12,12 +12,10 @@ public class ConnectionTests { // For tests using multiple clients. private const int k_NumClients = 5; - - UTPTransport server; - UTPTransport[] clients = new UTPTransport[k_NumClients]; - - List serverEvents; - List[] clientsEvents = new List[k_NumClients]; + private UTPTransport server; + private UTPTransport[] clients = new UTPTransport[k_NumClients]; + private List serverEvents; + private List[] clientsEvents = new List[k_NumClients]; [UnityTearDown] public IEnumerator Cleanup() @@ -27,7 +25,7 @@ public IEnumerator Cleanup() if (server) { server.Shutdown(); - GameObject.DestroyImmediate(server); + Object.DestroyImmediate(server); } foreach (var transport in clients) @@ -35,7 +33,7 @@ public IEnumerator Cleanup() if (transport) { transport.Shutdown(); - GameObject.DestroyImmediate(transport); + Object.DestroyImmediate(transport); } } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 66f46b9a74..6b5bc72a7b 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -10,7 +10,11 @@ namespace Unity.Netcode.UTP.RuntimeTests public static class RuntimeTestsHelpers { // 50ms should be plenty enough for any network interaction to occur (even roundtrips). - public const float MaxNetworkEventWaitTime = 0.15f; +#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX + public const float MaxNetworkEventWaitTime = 0.35f; +#else + public const float MaxNetworkEventWaitTime = 0.05f; +#endif // Wait for an event to appear in the given event list (must be the very next event). public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index a3393281a9..e3c636059a 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -12,8 +12,8 @@ namespace Unity.Netcode.UTP.RuntimeTests { public class TransportTests { - UTPTransport server, client1, client2; - List serverEvents, client1Events, client2Events; + private UTPTransport server, client1, client2; + private List serverEvents, client1Events, client2Events; [UnityTearDown] public IEnumerator Cleanup() @@ -22,19 +22,19 @@ public IEnumerator Cleanup() if (server) { server.Shutdown(); - GameObject.DestroyImmediate(server); + UnityEngine.Object.DestroyImmediate(server); } if (client1) { client1.Shutdown(); - GameObject.DestroyImmediate(client1); + UnityEngine.Object.DestroyImmediate(client1); } if (client2) { client2.Shutdown(); - GameObject.DestroyImmediate(client2); + UnityEngine.Object.DestroyImmediate(client2); } serverEvents?.Clear(); From 9a4ca02a303c1a43757cc684babdcb50fb0de466 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 18:38:58 +0200 Subject: [PATCH 56/65] test: again change time --- .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index 6b5bc72a7b..ba26ebe4c7 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -13,7 +13,7 @@ public static class RuntimeTestsHelpers #if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX public const float MaxNetworkEventWaitTime = 0.35f; #else - public const float MaxNetworkEventWaitTime = 0.05f; + public const float MaxNetworkEventWaitTime = 0.15f; #endif // Wait for an event to appear in the given event list (must be the very next event). From faa2a1a6c83e7f18c03a50516a6a92c7f75a3ba5 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 19:20:19 +0200 Subject: [PATCH 57/65] fix: coding standards --- .../Tests/Runtime/ConnectionTests.cs | 166 +++++++++--------- .../Tests/Runtime/TransportTests.cs | 164 ++++++++--------- 2 files changed, 165 insertions(+), 165 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 6633252449..0ee1a42205 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -12,23 +12,23 @@ public class ConnectionTests { // For tests using multiple clients. private const int k_NumClients = 5; - private UTPTransport server; - private UTPTransport[] clients = new UTPTransport[k_NumClients]; - private List serverEvents; - private List[] clientsEvents = new List[k_NumClients]; + private UTPTransport m_Server; + private UTPTransport[] m_Clients = new UTPTransport[k_NumClients]; + private List m_ServerEvents; + private List[] m_ClientsEvents = new List[k_NumClients]; [UnityTearDown] public IEnumerator Cleanup() { Debug.Log("Calling Cleanup"); - if (server) + if (m_Server) { - server.Shutdown(); - Object.DestroyImmediate(server); + m_Server.Shutdown(); + Object.DestroyImmediate(m_Server); } - foreach (var transport in clients) + foreach (var transport in m_Clients) { if (transport) { @@ -37,7 +37,7 @@ public IEnumerator Cleanup() } } - foreach (var transportEvents in clientsEvents) + foreach (var transportEvents in m_ClientsEvents) { transportEvents?.Clear(); } @@ -50,17 +50,17 @@ public IEnumerator Cleanup() public IEnumerator ConnectSingleClient() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out clients[0], out clientsEvents[0]); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - server.StartServer(); - clients[0].StartClient(); + m_Server.StartServer(); + m_Clients[0].StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); // Check we've received Connect event on client too. - Assert.AreEqual(1, clientsEvents[0].Count); - Assert.AreEqual(NetworkEvent.Connect, clientsEvents[0][0].Type); + Assert.AreEqual(1, m_ClientsEvents[0].Count); + Assert.AreEqual(NetworkEvent.Connect, m_ClientsEvents[0][0].Type); yield return null; } @@ -70,20 +70,20 @@ public IEnumerator ConnectSingleClient() public IEnumerator ConnectMultipleClients() { - InitializeTransport(out server, out serverEvents); - server.StartServer(); + InitializeTransport(out m_Server, out m_ServerEvents); + m_Server.StartServer(); for (int i = 0; i < k_NumClients; i++) { - InitializeTransport(out clients[i], out clientsEvents[i]); - clients[i].StartClient(); + InitializeTransport(out m_Clients[i], out m_ClientsEvents[i]); + m_Clients[i].StartClient(); } - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); // Check that every client also received a Connect event. - Assert.True(clientsEvents.All(evs => evs.Count == 1)); - Assert.True(clientsEvents.All(evs => evs[0].Type == NetworkEvent.Connect)); + Assert.True(m_ClientsEvents.All(evs => evs.Count == 1)); + Assert.True(m_ClientsEvents.All(evs => evs[0].Type == NetworkEvent.Connect)); yield return null; } @@ -93,17 +93,17 @@ public IEnumerator ConnectMultipleClients() public IEnumerator ServerDisconnectSingleClient() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out clients[0], out clientsEvents[0]); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - server.StartServer(); - clients[0].StartClient(); + m_Server.StartServer(); + m_Clients[0].StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); - server.DisconnectRemoteClient(serverEvents[0].ClientID); + m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientsEvents[0]); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ClientsEvents[0]); yield return null; } @@ -112,38 +112,38 @@ public IEnumerator ServerDisconnectSingleClient() [UnityTest] public IEnumerator ServerDisconnectMultipleClients() { - InitializeTransport(out server, out serverEvents); - server.StartServer(); + InitializeTransport(out m_Server, out m_ServerEvents); + m_Server.StartServer(); for (int i = 0; i < k_NumClients; i++) { - InitializeTransport(out clients[i], out clientsEvents[i]); - clients[i].StartClient(); + InitializeTransport(out m_Clients[i], out m_ClientsEvents[i]); + m_Clients[i].StartClient(); } - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); // Disconnect a single client. - server.DisconnectRemoteClient(serverEvents[0].ClientID); + m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID); // Need to manually wait since we don't know which client will get the Disconnect. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check that we received a Disconnect event on only one client. - Assert.AreEqual(1, clientsEvents.Count(evs => evs.Count == 2 && evs[1].Type == NetworkEvent.Disconnect)); + Assert.AreEqual(1, m_ClientsEvents.Count(evs => evs.Count == 2 && evs[1].Type == NetworkEvent.Disconnect)); // Disconnect all the other clients. for (int i = 1; i < k_NumClients; i++) { - server.DisconnectRemoteClient(serverEvents[i].ClientID); + m_Server.DisconnectRemoteClient(m_ServerEvents[i].ClientID); } // Need to manually wait since we don't know which client got the Disconnect. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check that all clients got a Disconnect event. - Assert.True(clientsEvents.All(evs => evs.Count == 2)); - Assert.True(clientsEvents.All(evs => evs[1].Type == NetworkEvent.Disconnect)); + Assert.True(m_ClientsEvents.All(evs => evs.Count == 2)); + Assert.True(m_ClientsEvents.All(evs => evs[1].Type == NetworkEvent.Disconnect)); yield return null; } @@ -153,17 +153,17 @@ public IEnumerator ServerDisconnectMultipleClients() public IEnumerator ClientDisconnectSingleClient() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out clients[0], out clientsEvents[0]); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - server.StartServer(); - clients[0].StartClient(); + m_Server.StartServer(); + m_Clients[0].StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); - clients[0].DisconnectLocalClient(); + m_Clients[0].DisconnectLocalClient(); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); yield return null; } @@ -172,33 +172,33 @@ public IEnumerator ClientDisconnectSingleClient() [UnityTest] public IEnumerator ClientDisconnectMultipleClients() { - InitializeTransport(out server, out serverEvents); - server.StartServer(); + InitializeTransport(out m_Server, out m_ServerEvents); + m_Server.StartServer(); for (int i = 0; i < k_NumClients; i++) { - InitializeTransport(out clients[i], out clientsEvents[i]); - clients[i].StartClient(); + InitializeTransport(out m_Clients[i], out m_ClientsEvents[i]); + m_Clients[i].StartClient(); } - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); // Disconnect a single client. - clients[0].DisconnectLocalClient(); + m_Clients[0].DisconnectLocalClient(); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); // Disconnect all the other clients. for (int i = 1; i < k_NumClients; i++) { - clients[i].DisconnectLocalClient(); + m_Clients[i].DisconnectLocalClient(); } - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); // Check that we got the correct number of Disconnect events on the server. - Assert.AreEqual(k_NumClients * 2, serverEvents.Count); - Assert.AreEqual(k_NumClients, serverEvents.Count(e => e.Type == NetworkEvent.Disconnect)); + Assert.AreEqual(k_NumClients * 2, m_ServerEvents.Count); + Assert.AreEqual(k_NumClients, m_ServerEvents.Count(e => e.Type == NetworkEvent.Disconnect)); yield return null; } @@ -207,29 +207,29 @@ public IEnumerator ClientDisconnectMultipleClients() [UnityTest] public IEnumerator RepeatedServerDisconnectsNoop() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out clients[0], out clientsEvents[0]); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - server.StartServer(); - clients[0].StartClient(); + m_Server.StartServer(); + m_Clients[0].StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); - server.DisconnectRemoteClient(serverEvents[0].ClientID); + m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, clientsEvents[0]); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ClientsEvents[0]); - var previousServerEventsCount = serverEvents.Count; - var previousClientEventsCount = clientsEvents[0].Count; + var previousServerEventsCount = m_ServerEvents.Count; + var previousClientEventsCount = m_ClientsEvents[0].Count; - server.DisconnectRemoteClient(serverEvents[0].ClientID); + m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID); // Need to wait manually since no event should be generated. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check we haven't received anything else on the client or server. - Assert.AreEqual(serverEvents.Count, previousServerEventsCount); - Assert.AreEqual(clientsEvents[0].Count, previousClientEventsCount); + Assert.AreEqual(m_ServerEvents.Count, previousServerEventsCount); + Assert.AreEqual(m_ClientsEvents[0].Count, previousClientEventsCount); yield return null; } @@ -239,31 +239,31 @@ public IEnumerator RepeatedServerDisconnectsNoop() public IEnumerator RepeatedClientDisconnectsNoop() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out clients[0], out clientsEvents[0]); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - server.StartServer(); - clients[0].StartClient(); + m_Server.StartServer(); + m_Clients[0].StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); - clients[0].DisconnectLocalClient(); + m_Clients[0].DisconnectLocalClient(); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); - var previousServerEventsCount = serverEvents.Count; - var previousClientEventsCount = clientsEvents[0].Count; + var previousServerEventsCount = m_ServerEvents.Count; + var previousClientEventsCount = m_ClientsEvents[0].Count; - clients[0].DisconnectLocalClient(); + m_Clients[0].DisconnectLocalClient(); // Need to wait manually since no event should be generated. yield return new WaitForSeconds(MaxNetworkEventWaitTime); // Check we haven't received anything else on the client or server. - Assert.AreEqual(serverEvents.Count, previousServerEventsCount); - Assert.AreEqual(clientsEvents[0].Count, previousClientEventsCount); + Assert.AreEqual(m_ServerEvents.Count, previousServerEventsCount); + Assert.AreEqual(m_ClientsEvents[0].Count, previousClientEventsCount); - server.Shutdown(); + m_Server.Shutdown(); yield return null; } diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index e3c636059a..34ca55b7d2 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -12,34 +12,34 @@ namespace Unity.Netcode.UTP.RuntimeTests { public class TransportTests { - private UTPTransport server, client1, client2; - private List serverEvents, client1Events, client2Events; + private UTPTransport m_Server, m_Client1, m_Client2; + private List m_ServerEvents, m_Client1Events, m_Client2Events; [UnityTearDown] public IEnumerator Cleanup() { Debug.Log("Calling Cleanup"); - if (server) + if (m_Server) { - server.Shutdown(); - UnityEngine.Object.DestroyImmediate(server); + m_Server.Shutdown(); + UnityEngine.Object.DestroyImmediate(m_Server); } - if (client1) + if (m_Client1) { - client1.Shutdown(); - UnityEngine.Object.DestroyImmediate(client1); + m_Client1.Shutdown(); + UnityEngine.Object.DestroyImmediate(m_Client1); } - if (client2) + if (m_Client2) { - client2.Shutdown(); - UnityEngine.Object.DestroyImmediate(client2); + m_Client2.Shutdown(); + UnityEngine.Object.DestroyImmediate(m_Client2); } - serverEvents?.Clear(); - client1Events?.Clear(); - client2Events?.Clear(); + m_ServerEvents?.Clear(); + m_Client1Events?.Clear(); + m_Client2Events?.Clear(); yield return null; } @@ -48,27 +48,27 @@ public IEnumerator Cleanup() [UnityTest] public IEnumerator PingPong() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client1, out client1Events); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Client1, out m_Client1Events); - server.StartServer(); - client1.StartClient(); + m_Server.StartServer(); + m_Client1.StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); - client1.Send(client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents); - Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); - server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); + m_Server.Send(m_ServerEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); - yield return WaitForNetworkEvent(NetworkEvent.Data, client1Events); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_Client1Events); - Assert.That(client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + Assert.That(m_Client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); // server.Shutdown(); // client.Shutdown(); @@ -82,33 +82,33 @@ public IEnumerator PingPong() [UnityTest] public IEnumerator PingPongSimultaneous() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client1, out client1Events); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Client1, out m_Client1Events); - server.StartServer(); - client1.StartClient(); + m_Server.StartServer(); + m_Client1.StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); var ping = new ArraySegment(Encoding.ASCII.GetBytes("ping")); - server.Send(serverEvents[0].ClientID, ping, NetworkDelivery.ReliableSequenced); - client1.Send(client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); + m_Server.Send(m_ServerEvents[0].ClientID, ping, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, ping, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents); - Assert.That(serverEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); - Assert.That(client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); + Assert.That(m_Client1Events[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("ping"))); var pong = new ArraySegment(Encoding.ASCII.GetBytes("pong")); - server.Send(serverEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); - client1.Send(client1.ServerClientId, pong, NetworkDelivery.ReliableSequenced); + m_Server.Send(m_ServerEvents[0].ClientID, pong, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, pong, NetworkDelivery.ReliableSequenced); // Once one event is in the other should be too. - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents); - Assert.That(serverEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); - Assert.That(client1Events[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + Assert.That(m_ServerEvents[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); + Assert.That(m_Client1Events[2].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("pong"))); yield return null; } @@ -117,27 +117,27 @@ public IEnumerator PingPongSimultaneous() [UnityTest] public IEnumerator MultipleSendsSingleFrame() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client1, out client1Events); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Client1, out m_Client1Events); - server.StartServer(); - client1.StartClient(); + m_Server.StartServer(); + m_Client1.StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); var data1 = new ArraySegment(new byte[] { 11 }); - client1.Send(client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte[] { 22 }); - client1.Send(client1.ServerClientId, data2, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, data2, NetworkDelivery.ReliableSequenced); - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents); - Assert.AreEqual(3, serverEvents.Count); - Assert.AreEqual(NetworkEvent.Data, serverEvents[2].Type); + Assert.AreEqual(3, m_ServerEvents.Count); + Assert.AreEqual(NetworkEvent.Data, m_ServerEvents[2].Type); - Assert.AreEqual(11, serverEvents[1].Data.First()); - Assert.AreEqual(22, serverEvents[2].Data.First()); + Assert.AreEqual(11, m_ServerEvents[1].Data.First()); + Assert.AreEqual(22, m_ServerEvents[2].Data.First()); yield return null; } @@ -146,34 +146,34 @@ public IEnumerator MultipleSendsSingleFrame() [UnityTest] public IEnumerator SendMultipleClients() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client1, out client1Events); - InitializeTransport(out client2, out client2Events); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Client1, out m_Client1Events); + InitializeTransport(out m_Client2, out m_Client2Events); - server.StartServer(); - client1.StartClient(); - client2.StartClient(); + m_Server.StartServer(); + m_Client1.StartClient(); + m_Client2.StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ServerEvents); // Ensure we got both Connect events. - Assert.AreEqual(2, serverEvents.Count); + Assert.AreEqual(2, m_ServerEvents.Count); var data1 = new ArraySegment(new byte[] { 11 }); - server.Send(serverEvents[0].ClientID, data1, NetworkDelivery.ReliableSequenced); + m_Server.Send(m_ServerEvents[0].ClientID, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte[] { 22 }); - server.Send(serverEvents[1].ClientID, data2, NetworkDelivery.ReliableSequenced); + m_Server.Send(m_ServerEvents[1].ClientID, data2, NetworkDelivery.ReliableSequenced); // Once one has received its data, the other should have too. - yield return WaitForNetworkEvent(NetworkEvent.Data, client1Events); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_Client1Events); // Do make sure the other client got its Data event. - Assert.AreEqual(2, client2Events.Count); - Assert.AreEqual(NetworkEvent.Data, client2Events[1].Type); + Assert.AreEqual(2, m_Client2Events.Count); + Assert.AreEqual(NetworkEvent.Data, m_Client2Events[1].Type); - byte c1Data = client1Events[1].Data.First(); - byte c2Data = client2Events[1].Data.First(); + byte c1Data = m_Client1Events[1].Data.First(); + byte c2Data = m_Client2Events[1].Data.First(); Assert.True((c1Data == 11 && c2Data == 22) || (c1Data == 22 && c2Data == 11)); yield return null; @@ -183,33 +183,33 @@ public IEnumerator SendMultipleClients() [UnityTest] public IEnumerator ReceiveMultipleClients() { - InitializeTransport(out server, out serverEvents); - InitializeTransport(out client1, out client1Events); - InitializeTransport(out client2, out client2Events); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Client1, out m_Client1Events); + InitializeTransport(out m_Client2, out m_Client2Events); - server.StartServer(); - client1.StartClient(); - client2.StartClient(); + m_Server.StartServer(); + m_Client1.StartClient(); + m_Client2.StartClient(); - yield return WaitForNetworkEvent(NetworkEvent.Connect, client1Events); + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events); // Ensure we got the Connect event on the other client too. - Assert.AreEqual(1, client2Events.Count); + Assert.AreEqual(1, m_Client2Events.Count); var data1 = new ArraySegment(new byte[] { 11 }); - client1.Send(client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); + m_Client1.Send(m_Client1.ServerClientId, data1, NetworkDelivery.ReliableSequenced); var data2 = new ArraySegment(new byte[] { 22 }); - client2.Send(client2.ServerClientId, data2, NetworkDelivery.ReliableSequenced); + m_Client2.Send(m_Client2.ServerClientId, data2, NetworkDelivery.ReliableSequenced); - yield return WaitForNetworkEvent(NetworkEvent.Data, serverEvents); + yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents); // Make sure we got both data messages. - Assert.AreEqual(4, serverEvents.Count); - Assert.AreEqual(NetworkEvent.Data, serverEvents[3].Type); + Assert.AreEqual(4, m_ServerEvents.Count); + Assert.AreEqual(NetworkEvent.Data, m_ServerEvents[3].Type); - byte sData1 = serverEvents[2].Data.First(); - byte sData2 = serverEvents[3].Data.First(); + byte sData1 = m_ServerEvents[2].Data.First(); + byte sData2 = m_ServerEvents[3].Data.First(); Assert.True((sData1 == 11 && sData2 == 22) || (sData1 == 22 && sData2 == 11)); yield return null; From 83ed4aacb7c460a4720ec7d26886106e6d160601 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 21:24:46 +0200 Subject: [PATCH 58/65] fix: fix bad merge --- testproject/Assets/Scripts/testproject.asmdef | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index d06f93a919..1de8780d47 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -4,7 +4,7 @@ "references": [ "Unity.Netcode.Runtime", "Unity.Netcode.Editor", - "Unity.Netcode.Components" + "Unity.Netcode.Components", "Unity.Netcode.Adapter.UTP", "Unity.Services.Authentication", "Unity.Services.Core", From bb2bd1d745e5a37b48480f1739d0e2e3959e7b0d Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 21:43:38 +0200 Subject: [PATCH 59/65] [skip ci] fix: making sure to pass down the region for relay --- testproject/Assets/Scripts/RelayUtility.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testproject/Assets/Scripts/RelayUtility.cs b/testproject/Assets/Scripts/RelayUtility.cs index 6c27642f76..435842c2e2 100644 --- a/testproject/Assets/Scripts/RelayUtility.cs +++ b/testproject/Assets/Scripts/RelayUtility.cs @@ -6,13 +6,13 @@ public class RelayUtility { - async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) + public static async Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] key, string joinCode)> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null) { Allocation allocation; string createJoinCode; try { - allocation = await Relay.Instance.CreateAllocationAsync(maxConnections); + allocation = await Relay.Instance.CreateAllocationAsync(maxConnections, region); } catch (Exception e) { @@ -36,7 +36,7 @@ public class RelayUtility return (allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.ConnectionData, allocation.Key, createJoinCode); } - async public static Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) + public static async Task<(string ipv4address, ushort port, byte[] allocationIdBytes, byte[] connectionData, byte[] hostConnectionData, byte[] key)> JoinRelayServerFromJoinCode(string joinCode) { JoinAllocation allocation; try From 9804f9b562281a1a20f268a9a6d3412203697462 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Thu, 9 Sep 2021 21:59:45 +0200 Subject: [PATCH 60/65] [skip ci] removing stuff out of settings files --- testproject/Assets/Scripts/testproject.asmdef | 4 +- .../PackageManagerSettings.asset | 37 ++++--------------- .../ProjectSettings/ProjectSettings.asset | 5 +-- 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 1de8780d47..b10fb913ad 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -5,7 +5,7 @@ "Unity.Netcode.Runtime", "Unity.Netcode.Editor", "Unity.Netcode.Components", - "Unity.Netcode.Adapter.UTP", + "Unity.Netcode.Adapter.UTP", "Unity.Services.Authentication", "Unity.Services.Core", "Unity.Services.Relay" @@ -25,4 +25,4 @@ } ], "noEngineReferences": false -} +} \ No newline at end of file diff --git a/testproject/ProjectSettings/PackageManagerSettings.asset b/testproject/ProjectSettings/PackageManagerSettings.asset index 6715a68ef7..b01b2f8da9 100644 --- a/testproject/ProjectSettings/PackageManagerSettings.asset +++ b/testproject/ProjectSettings/PackageManagerSettings.asset @@ -24,43 +24,20 @@ MonoBehaviour: m_Scopes: [] m_IsDefault: 1 m_Capabilities: 7 - - m_Id: scoped:Candidate - m_Name: Candidate - m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates - m_Scopes: - - com.unity.transport - - com.unity.collections - - com.unity.services.relay - - com.unity.services.authentication - - com.unity.services.core - - com.unity.jobs - m_IsDefault: 0 - m_Capabilities: 0 m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: m_ErrorMessage: m_Original: - m_Id: scoped:Candidate - m_Name: Candidate - m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates - m_Scopes: - - com.unity.transport - - com.unity.collections - - com.unity.services.relay - - com.unity.services.authentication - - com.unity.services.core - - com.unity.jobs + m_Id: + m_Name: + m_Url: + m_Scopes: [] m_IsDefault: 0 m_Capabilities: 0 m_Modified: 0 - m_Name: Candidate - m_Url: https://artifactory.prd.cds.internal.unity3d.com/artifactory/api/npm/upm-candidates + m_Name: + m_Url: m_Scopes: - - com.unity.transport - - com.unity.collections - - com.unity.services.relay - - com.unity.services.authentication - - com.unity.services.core - - com.unity.jobs + - m_SelectedScopeIndex: 0 diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 34e206a82f..519d9b689f 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -555,7 +555,6 @@ PlayerSettings: ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 ps4CompatibilityPS5: 0 - ps4AllowPS5Detection: 0 ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] @@ -581,7 +580,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - 1: AUTHENTICATION_TESTING_STAGING_UAS + 1: additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -678,7 +677,7 @@ PlayerSettings: m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] projectName: relay-stg From 51d1f69e2b30d1ed33389c01e5d7fbc12b7c6afb Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Fri, 10 Sep 2021 14:20:57 +0200 Subject: [PATCH 61/65] Update ProjectVersion.txt --- testproject/ProjectSettings/ProjectVersion.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 5ac0724b15..79c71bce82 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.3.15f2 -m_EditorVersionWithRevision: 2020.3.15f2 (6cf78cb77498) +m_EditorVersion: 2020.3.12f1 +m_EditorVersionWithRevision: 2020.3.12f1 (b3b2c6512326) From 7ba5ed6811e051dcb94051bd2b174526f9c445d8 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Fri, 10 Sep 2021 17:18:50 +0200 Subject: [PATCH 62/65] Addressing some PR feedback --- .../Editor/MultiplayerWindow.cs | 4 ++-- .../Runtime/UTPTransport.cs | 21 ++++++++++--------- .../com.unity.netcode.adapter.utp.asmdef | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs index 6395da940a..0a8c8305b8 100644 --- a/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs +++ b/com.unity.netcode.adapter.utp/Editor/MultiplayerWindow.cs @@ -7,10 +7,10 @@ public class MultiplayerWindow : EditorWindow { private const string k_PrefsKeyPrefix = "NetcodeGameObjects"; - [MenuItem("Netcode/NGO Tools")] + [MenuItem("Netcode/Simulator Tools")] public static void ShowWindow() { - GetWindow(false, "NGO Tools Tools", true); + GetWindow(false, "Simulator Tools", true); } private void OnGUI() diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 79d3105d89..66d9b8507a 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -4,7 +4,8 @@ using System.Linq; using UnityEngine; -using UTPNetworkEvent = Unity.Netcode.NetworkEvent; +using NGONetworkEvent = Unity.Netcode.NetworkEvent; +using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; using Unity.Collections; using Unity.Networking.Transport; @@ -326,7 +327,7 @@ private bool AcceptConnection() return false; } - InvokeOnTransportEvent(UTPNetworkEvent.Connect, + InvokeOnTransportEvent(NGONetworkEvent.Connect, ParseClientId(connection), default(ArraySegment), Time.realtimeSinceStartup); @@ -341,21 +342,21 @@ private bool ProcessEvent() switch (eventType) { - case Networking.Transport.NetworkEvent.Type.Connect: - InvokeOnTransportEvent(UTPNetworkEvent.Connect, + case UTPNetworkEvent.Type.Connect: + InvokeOnTransportEvent(NGONetworkEvent.Connect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case Networking.Transport.NetworkEvent.Type.Disconnect: - InvokeOnTransportEvent(UTPNetworkEvent.Disconnect, + case UTPNetworkEvent.Type.Disconnect: + InvokeOnTransportEvent(NGONetworkEvent.Disconnect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case Networking.Transport.NetworkEvent.Type.Data: + case UTPNetworkEvent.Type.Data: var isBatched = reader.ReadByte(); if (isBatched == 1) { @@ -394,7 +395,7 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC } } - InvokeOnTransportEvent(UTPNetworkEvent.Data, + InvokeOnTransportEvent(NGONetworkEvent.Data, ParseClientId(networkConnection), new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup @@ -499,12 +500,12 @@ public override void Initialize() m_MessageBuffer = new byte[m_MessageBufferSize]; } - public override UTPNetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) + public override NGONetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = default; payload = default; receiveTime = default; - return UTPNetworkEvent.Nothing; + return NGONetworkEvent.Nothing; } public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) diff --git a/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef index 84ff623c67..b3e15bf3cc 100644 --- a/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef +++ b/com.unity.netcode.adapter.utp/Runtime/com.unity.netcode.adapter.utp.asmdef @@ -1,6 +1,6 @@ { "name": "Unity.Netcode.Adapter.UTP", - "rootNamespace": "", + "rootNamespace": "Unity.Netcode.UTP", "references": [ "Unity.Collections", "Unity.Jobs", From bb2f1105919d2598620fd571fd3b5191da99f790 Mon Sep 17 00:00:00 2001 From: Cosmin Date: Mon, 13 Sep 2021 11:47:09 +0100 Subject: [PATCH 63/65] fix: move FlushSendQueues call before we do drive update so that we don't delay the queued messages by another tick --- com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 66d9b8507a..3a54242a74 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -407,6 +407,8 @@ private void Update() { if (m_Driver.IsCreated) { + FlushAllSendQueues(); + m_Driver.ScheduleUpdate().Complete(); while (AcceptConnection() && m_Driver.IsCreated) @@ -418,8 +420,6 @@ private void Update() { ; } - - FlushAllSendQueues(); } } From 9715ced278fb547d5b8de1cc1afe38b8566ebd25 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Mon, 13 Sep 2021 17:24:28 +0200 Subject: [PATCH 64/65] PR Feedback --- .../Runtime/UTPTransport.cs | 32 +++++++++---------- .../Tests/Editor/UTPTransportTests.cs | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs index 3a54242a74..4c81922120 100644 --- a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs +++ b/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs @@ -4,8 +4,8 @@ using System.Linq; using UnityEngine; -using NGONetworkEvent = Unity.Netcode.NetworkEvent; -using UTPNetworkEvent = Unity.Networking.Transport.NetworkEvent; +using NetcodeNetworkEvent = Unity.Netcode.NetworkEvent; +using TransportNetworkEvent = Unity.Networking.Transport.NetworkEvent; using Unity.Collections.LowLevel.Unsafe; using Unity.Collections; using Unity.Networking.Transport; @@ -19,10 +19,10 @@ namespace Unity.Netcode /// public interface INetworkStreamDriverConstructor { - void CreateDriver(UTPTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline); + void CreateDriver(UnityTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline); } - public class UTPTransport : NetworkTransport, INetworkStreamDriverConstructor + public class UnityTransport : NetworkTransport, INetworkStreamDriverConstructor { public enum ProtocolType { @@ -49,7 +49,7 @@ private enum State [SerializeField] private int m_ReciveQueueSize = 128; [SerializeField] private int m_SendQueueSize = 128; - [Tooltip("The maximum size of the send queue for batching NGO events")] + [Tooltip("The maximum size of the send queue for batching Netcode events")] [SerializeField] private int m_SendQueueBatchSize = 4096; [SerializeField] private string m_ServerAddress = "127.0.0.1"; @@ -150,7 +150,7 @@ private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery, int size) return m_ReliableSequencedFragmentedPipeline; default: - Debug.LogError($"Unknown NetworkDelivery value: {delivery}"); + Debug.LogError($"Unknown {nameof(NetworkDelivery)} value: {delivery}"); return NetworkPipeline.Null; } } @@ -327,7 +327,7 @@ private bool AcceptConnection() return false; } - InvokeOnTransportEvent(NGONetworkEvent.Connect, + InvokeOnTransportEvent(NetcodeNetworkEvent.Connect, ParseClientId(connection), default(ArraySegment), Time.realtimeSinceStartup); @@ -342,21 +342,21 @@ private bool ProcessEvent() switch (eventType) { - case UTPNetworkEvent.Type.Connect: - InvokeOnTransportEvent(NGONetworkEvent.Connect, + case TransportNetworkEvent.Type.Connect: + InvokeOnTransportEvent(NetcodeNetworkEvent.Connect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case UTPNetworkEvent.Type.Disconnect: - InvokeOnTransportEvent(NGONetworkEvent.Disconnect, + case TransportNetworkEvent.Type.Disconnect: + InvokeOnTransportEvent(NetcodeNetworkEvent.Disconnect, ParseClientId(networkConnection), default(ArraySegment), Time.realtimeSinceStartup); return true; - case UTPNetworkEvent.Type.Data: + case TransportNetworkEvent.Type.Data: var isBatched = reader.ReadByte(); if (isBatched == 1) { @@ -395,7 +395,7 @@ private unsafe void ReadData(int size, ref DataStreamReader reader, ref NetworkC } } - InvokeOnTransportEvent(NGONetworkEvent.Data, + InvokeOnTransportEvent(NetcodeNetworkEvent.Data, ParseClientId(networkConnection), new ArraySegment(m_MessageBuffer, 0, size), Time.realtimeSinceStartup @@ -500,12 +500,12 @@ public override void Initialize() m_MessageBuffer = new byte[m_MessageBufferSize]; } - public override NGONetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) + public override NetcodeNetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) { clientId = default; payload = default; receiveTime = default; - return NGONetworkEvent.Nothing; + return NetcodeNetworkEvent.Nothing; } public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) @@ -675,7 +675,7 @@ public override void Shutdown() m_SendQueue.Clear(); } - public void CreateDriver(UTPTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline) + public void CreateDriver(UnityTransport transport, out NetworkDriver driver, out NetworkPipeline unreliableSequencedPipeline, out NetworkPipeline reliableSequencedPipeline, out NetworkPipeline reliableSequencedFragmentedPipeline) { #if UNITY_EDITOR || DEVELOPMENT_BUILD diff --git a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs index 3bbb72241f..ae7946058d 100644 --- a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs @@ -3,7 +3,7 @@ namespace Unity.Netcode.UTP.EditorTests { - public class UTPTransportTests + public class UnityTransportTests { // Check that starting a server doesn't immediately result in faulted tasks. [Test] From 95ca9e0b97f57feb9ab5a6d88f987cc2078dc7af Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Mon, 13 Sep 2021 18:04:39 +0200 Subject: [PATCH 65/65] Fixing rename issues --- .../Runtime/{UTPTransport.cs => UnityTransport.cs} | 0 ...UTPTransport.cs.meta => UnityTransport.cs.meta} | 0 ...UTPTransportTests.cs => UnityTransportTests.cs} | 14 +++++++------- ...rtTests.cs.meta => UnityTransportTests.cs.meta} | 0 .../Tests/Runtime/ConnectionTests.cs | 4 ++-- .../Tests/Runtime/Helpers/DriverClient.cs | 6 +++--- .../Tests/Runtime/Helpers/RuntimeTestsHelpers.cs | 8 ++++---- .../Tests/Runtime/TransportTests.cs | 2 +- testproject/Assets/Scripts/ConnectionModeScript.cs | 8 ++++---- testproject/Assets/Scripts/UIController.cs | 4 ++-- 10 files changed, 23 insertions(+), 23 deletions(-) rename com.unity.netcode.adapter.utp/Runtime/{UTPTransport.cs => UnityTransport.cs} (100%) rename com.unity.netcode.adapter.utp/Runtime/{UTPTransport.cs.meta => UnityTransport.cs.meta} (100%) rename com.unity.netcode.adapter.utp/Tests/Editor/{UTPTransportTests.cs => UnityTransportTests.cs} (80%) rename com.unity.netcode.adapter.utp/Tests/Editor/{UTPTransportTests.cs.meta => UnityTransportTests.cs.meta} (100%) diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs b/com.unity.netcode.adapter.utp/Runtime/UnityTransport.cs similarity index 100% rename from com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs rename to com.unity.netcode.adapter.utp/Runtime/UnityTransport.cs diff --git a/com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs.meta b/com.unity.netcode.adapter.utp/Runtime/UnityTransport.cs.meta similarity index 100% rename from com.unity.netcode.adapter.utp/Runtime/UTPTransport.cs.meta rename to com.unity.netcode.adapter.utp/Runtime/UnityTransport.cs.meta diff --git a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Editor/UnityTransportTests.cs similarity index 80% rename from com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs rename to com.unity.netcode.adapter.utp/Tests/Editor/UnityTransportTests.cs index ae7946058d..8a4b5feee6 100644 --- a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Editor/UnityTransportTests.cs @@ -9,7 +9,7 @@ public class UnityTransportTests [Test] public void BasicInitServer() { - UTPTransport transport = new GameObject().AddComponent(); + UnityTransport transport = new GameObject().AddComponent(); transport.Initialize(); var tasks = transport.StartServer(); @@ -22,7 +22,7 @@ public void BasicInitServer() [Test] public void BasicInitClient() { - UTPTransport transport = new GameObject().AddComponent(); + UnityTransport transport = new GameObject().AddComponent(); transport.Initialize(); var tasks = transport.StartClient(); @@ -35,7 +35,7 @@ public void BasicInitClient() [Test] public void NoRestartServer() { - UTPTransport transport = new GameObject().AddComponent(); + UnityTransport transport = new GameObject().AddComponent(); transport.Initialize(); transport.StartServer(); @@ -49,7 +49,7 @@ public void NoRestartServer() [Test] public void NoRestartClient() { - UTPTransport transport = new GameObject().AddComponent(); + UnityTransport transport = new GameObject().AddComponent(); transport.Initialize(); transport.StartClient(); @@ -63,11 +63,11 @@ public void NoRestartClient() [Test] public void NotBothServerAndClient() { - UTPTransport transport; + UnityTransport transport; SocketTasks tasks; // Start server then client. - transport = new GameObject().AddComponent(); + transport = new GameObject().AddComponent(); transport.Initialize(); transport.StartServer(); @@ -77,7 +77,7 @@ public void NotBothServerAndClient() transport.Shutdown(); // Start client then server. - transport = new GameObject().AddComponent(); + transport = new GameObject().AddComponent(); transport.Initialize(); transport.StartClient(); diff --git a/com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs.meta b/com.unity.netcode.adapter.utp/Tests/Editor/UnityTransportTests.cs.meta similarity index 100% rename from com.unity.netcode.adapter.utp/Tests/Editor/UTPTransportTests.cs.meta rename to com.unity.netcode.adapter.utp/Tests/Editor/UnityTransportTests.cs.meta diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs index 0ee1a42205..d28bfab8d0 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/ConnectionTests.cs @@ -12,8 +12,8 @@ public class ConnectionTests { // For tests using multiple clients. private const int k_NumClients = 5; - private UTPTransport m_Server; - private UTPTransport[] m_Clients = new UTPTransport[k_NumClients]; + private UnityTransport m_Server; + private UnityTransport[] m_Clients = new UnityTransport[k_NumClients]; private List m_ServerEvents; private List[] m_ClientsEvents = new List[k_NumClients]; diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs index 52686e2721..8f577cb61b 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/DriverClient.cs @@ -9,8 +9,8 @@ namespace Unity.Netcode.UTP.RuntimeTests { - // Thin wrapper around a UTP NetworkDriver that can act as a client to a UTPTransport server. - // In particular that means the pipelines are set up the same way as in UTPTransport. + // Thin wrapper around a UTP NetworkDriver that can act as a client to a UnityTransport server. + // In particular that means the pipelines are set up the same way as in UnityTransport. // // The only reason it's defined as a MonoBehaviour is that OnDestroy is the only reliable way // to get the driver's Dispose method called from a UnityTest. Making it disposable would be @@ -35,7 +35,7 @@ public class DriverClient : MonoBehaviour private void Awake() { - var maxCap = UTPTransport.MaximumMessageLength + 128; + var maxCap = UnityTransport.MaximumMessageLength + 128; var fragParams = new FragmentationUtility.Parameters() { PayloadCapacity = maxCap }; m_Driver = NetworkDriver.Create(fragParams); diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs index ba26ebe4c7..8aeea1ea23 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/Helpers/RuntimeTestsHelpers.cs @@ -36,13 +36,13 @@ public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events) + // Common code to initialize a UnityTransport that logs its events. + public static void InitializeTransport(out UnityTransport transport, out List events) { var logger = new TransportEventLogger(); events = logger.Events; - transport = new GameObject().AddComponent(); + transport = new GameObject().AddComponent(); transport.OnTransportEvent += logger.HandleEvent; transport.Initialize(); } @@ -57,7 +57,7 @@ public struct TransportEvent public float ReceiveTime; } - // Utility class that logs events generated by a UTPTransport. Set it up by adding the + // Utility class that logs events generated by a UnityTransport. Set it up by adding the // HandleEvent method as an OnTransportEvent delegate of the transport. The list of events // (in order in which they were generated) can be accessed through the Events property. public class TransportEventLogger diff --git a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs index 34ca55b7d2..0b1789d1e7 100644 --- a/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs +++ b/com.unity.netcode.adapter.utp/Tests/Runtime/TransportTests.cs @@ -12,7 +12,7 @@ namespace Unity.Netcode.UTP.RuntimeTests { public class TransportTests { - private UTPTransport m_Server, m_Client1, m_Client2; + private UnityTransport m_Server, m_Client1, m_Client2; private List m_ServerEvents, m_Client1Events, m_Client2Events; [UnityTearDown] diff --git a/testproject/Assets/Scripts/ConnectionModeScript.cs b/testproject/Assets/Scripts/ConnectionModeScript.cs index 1c572f365e..965a351d9d 100644 --- a/testproject/Assets/Scripts/ConnectionModeScript.cs +++ b/testproject/Assets/Scripts/ConnectionModeScript.cs @@ -79,7 +79,7 @@ private void Start() if (m_ConnectionModeButtons && m_AuthenticationButtons) { #if ENABLE_RELAY_SERVICE - if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + if (NetworkManager.Singleton.GetComponent().Protocol == UnityTransport.ProtocolType.RelayUnityTransport) { m_UsingRelay = true; m_JoinCodeInput.SetActive(true); @@ -101,7 +101,7 @@ private void Start() private void OnServicesInitialized() { #if ENABLE_RELAY_SERVICE - if (NetworkManager.Singleton.GetComponent().Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + if (NetworkManager.Singleton.GetComponent().Protocol == UnityTransport.ProtocolType.RelayUnityTransport) { m_JoinCodeInput.SetActive(true); m_ConnectionModeButtons.SetActive(false || AuthenticationService.Instance.IsSignedIn); @@ -160,7 +160,7 @@ private IEnumerator StartRelayServer(Action postAllocationAction) RelayJoinCode = joinCode; //When starting a relay server, both instances of connection data are identical. - NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData); postAllocationAction(); #else @@ -243,7 +243,7 @@ private IEnumerator StartRelayClient() var (ipv4address, port, allocationIdBytes, connectionData, hostConnectionData, key) = clientRelayUtilityTask.Result; //When connecting as a client to a relay server, connectionData and hostConnectionData are different. - NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData, hostConnectionData); + NetworkManager.Singleton.GetComponent().SetRelayServerData(ipv4address, port, allocationIdBytes, key, connectionData, hostConnectionData); NetworkManager.Singleton.StartClient(); OnNotifyConnectionEventClient?.Invoke(); diff --git a/testproject/Assets/Scripts/UIController.cs b/testproject/Assets/Scripts/UIController.cs index 9b85f78356..913e365835 100644 --- a/testproject/Assets/Scripts/UIController.cs +++ b/testproject/Assets/Scripts/UIController.cs @@ -12,12 +12,12 @@ public class UIController : MonoBehaviour public GameObject AuthButton; public GameObject JoinCode; - public UTPTransport Transport; + public UnityTransport Transport; private void Awake() { #if ENABLE_RELAY_SERVICE - if (Transport.Protocol == UTPTransport.ProtocolType.RelayUnityTransport) + if (Transport.Protocol == UnityTransport.ProtocolType.RelayUnityTransport) { HideButtons(); JoinCode.SetActive(false);