diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index f902782de2..ec0b15b3e6 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -10,6 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Added +- Added mappings between `ClientId` and `TransportId`. (#3515) - Added `SinglePlayerTransport` that provides the ability to start as a host for a single player network session. (#3475) - When using UnityTransport >=2.4 and Unity >= 6000.1.0a1, SetConnectionData will accept a fully qualified hostname instead of an IP as a connect address on the client side. (#3440) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index b539491533..daa9fcfb64 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1145,6 +1145,20 @@ private void HostServerInitialize() ConnectionManager.InvokeOnClientConnectedCallback(LocalClientId); } + /// + /// Get the TransportId from the associated ClientId. + /// + /// The ClientId to get the TransportId from + /// The TransportId associated with the given ClientId + public ulong GetTransportIdFromClientId(ulong clientId) => ConnectionManager.ClientIdToTransportId(clientId); + + /// + /// Get the ClientId from the associated TransportId. + /// + /// The TransportId to get the ClientId from + /// The ClientId from the associated TransportId + public ulong GetClientIdFromTransportId(ulong transportId) => ConnectionManager.TransportIdToClientId(transportId); + /// /// Disconnects the remote client. /// @@ -1305,7 +1319,7 @@ private void OnDestroy() } #if UNITY_EDITOR EditorApplication.playModeStateChanged -= ModeChanged; -#endif +#endif } // Command line options diff --git a/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs b/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs index 5756f81b85..378b307ce5 100644 --- a/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs +++ b/testproject/Assets/Tests/Runtime/NetworkManagerTests.cs @@ -9,9 +9,28 @@ namespace TestProject.RuntimeTests { + public class NetworkManagerTests : NetcodeIntegrationTest + { + protected override int NumberOfClients => 2; + + [Test] + public void ValidateTransportAndClientIds() + { + var transportId = m_ServerNetworkManager.GetTransportIdFromClientId(m_ServerNetworkManager.LocalClientId); + Assert.IsTrue(m_ServerNetworkManager.GetTransportIdFromClientId(m_ServerNetworkManager.LocalClientId) == m_ServerNetworkManager.ConnectionManager.ServerTransportId); + Assert.IsTrue(m_ServerNetworkManager.GetClientIdFromTransportId(transportId) == m_ServerNetworkManager.LocalClientId); + + foreach (var client in m_ClientNetworkManagers) + { + transportId = m_ServerNetworkManager.GetTransportIdFromClientId(client.LocalClientId); + Assert.AreEqual(client.LocalClientId, m_ServerNetworkManager.GetClientIdFromTransportId(transportId), "Server and client transport IDs don't match."); + } + } + } + [TestFixture(UseSceneManagement.SceneManagementDisabled)] [TestFixture(UseSceneManagement.SceneManagementEnabled)] - public class NetworkManagerTests : NetcodeIntegrationTest + public class NetworkManagerSceneTests : NetcodeIntegrationTest { private const string k_SceneToLoad = "InSceneNetworkObject"; protected override int NumberOfClients => 0; @@ -33,7 +52,7 @@ public enum UseSceneManagement private bool m_UseSceneManagement; - public NetworkManagerTests(UseSceneManagement useSceneManagement) + public NetworkManagerSceneTests(UseSceneManagement useSceneManagement) { m_UseSceneManagement = useSceneManagement == UseSceneManagement.SceneManagementEnabled; }