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;
}