diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs
index 82538717e4..2b64cbfc62 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs
@@ -11,6 +11,7 @@ namespace Unity.Netcode.Components
public class NetworkRigidbody : NetworkBehaviour
{
private Rigidbody m_Rigidbody;
+ private NetworkTransform m_NetworkTransform;
private bool m_OriginalKinematic;
@@ -20,25 +21,25 @@ public class NetworkRigidbody : NetworkBehaviour
///
/// Gets a bool value indicating whether this on this peer currently holds authority.
///
- internal bool HasAuthority => NetworkManager.IsServer; // TODO update this once we support owner authoritative NetworkTransform.
+ private bool HasAuthority => m_NetworkTransform.CanCommitToTransform;
private void Awake()
{
m_Rigidbody = GetComponent();
+ m_NetworkTransform = GetComponent();
}
- // Currently commented out because it is not needed as authority currently can't change at runtime.
- // private void FixedUpdate()
- // {
- // if (NetworkManager.IsListening)
- // {
- // if (HasAuthority != m_IsAuthority)
- // {
- // m_IsAuthority = HasAuthority;
- // UpdateRigidbodyKinematicMode();
- // }
- // }
- // }
+ private void FixedUpdate()
+ {
+ if (NetworkManager.IsListening)
+ {
+ if (HasAuthority != m_IsAuthority)
+ {
+ m_IsAuthority = HasAuthority;
+ UpdateRigidbodyKinematicMode();
+ }
+ }
+ }
// Puts the rigidbody in a kinematic non-interpolated mode on everyone but the server.
private void UpdateRigidbodyKinematicMode()
diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs
index c17cbe1c66..4222b53540 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs
@@ -11,6 +11,7 @@ namespace Unity.Netcode.Components
public class NetworkRigidbody2D : NetworkBehaviour
{
private Rigidbody2D m_Rigidbody;
+ private NetworkTransform m_NetworkTransform;
private bool m_OriginalKinematic;
@@ -20,25 +21,25 @@ public class NetworkRigidbody2D : NetworkBehaviour
///
/// Gets a bool value indicating whether this on this peer currently holds authority.
///
- internal bool HasAuthority => NetworkManager.IsServer; // TODO update this once we support owner authoritative NetworkTransform.
+ private bool HasAuthority => m_NetworkTransform.CanCommitToTransform;
private void Awake()
{
m_Rigidbody = GetComponent();
+ m_NetworkTransform = GetComponent();
}
- // Currently commented out because it is not needed as authority currently can't change at runtime.
- // private void FixedUpdate()
- // {
- // if (NetworkManager.IsListening)
- // {
- // if (HasAuthority != m_IsAuthority)
- // {
- // m_IsAuthority = HasAuthority;
- // UpdateRigidbodyKinematicMode();
- // }
- // }
- // }
+ private void FixedUpdate()
+ {
+ if (NetworkManager.IsListening)
+ {
+ if (HasAuthority != m_IsAuthority)
+ {
+ m_IsAuthority = HasAuthority;
+ UpdateRigidbodyKinematicMode();
+ }
+ }
+ }
// Puts the rigidbody in a kinematic non-interpolated mode on everyone but the server.
private void UpdateRigidbodyKinematicMode()
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs
index 10e10914e8..03c5cc4f26 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs
@@ -6,12 +6,12 @@
namespace Unity.Netcode.RuntimeTests.Physics
{
- public class NetworkRigidbody2DDynamicTest : NetworkRigidbodyTestBase
+ public class NetworkRigidbody2DDynamicTest : NetworkRigidbody2DTestBase
{
public override bool Kinematic => false;
}
- public class NetworkRigidbody2DKinematicTest : NetworkRigidbodyTestBase
+ public class NetworkRigidbody2DKinematicTest : NetworkRigidbody2DTestBase
{
public override bool Kinematic => true;
}
@@ -29,7 +29,7 @@ public override IEnumerator Setup()
{
playerPrefab.AddComponent();
playerPrefab.AddComponent();
- playerPrefab.AddComponent();
+ playerPrefab.AddComponent();
playerPrefab.GetComponent().isKinematic = Kinematic;
});
}
@@ -54,8 +54,7 @@ public IEnumerator TestRigidbodyKinematicEnableDisable()
Assert.IsNotNull(serverPlayer);
Assert.IsNotNull(clientPlayer);
- int waitFor = Time.frameCount + 2;
- yield return new WaitUntil(() => Time.frameCount >= waitFor);
+ yield return NetworkRigidbodyTestBase.WaitForFrames(5);
// server rigidbody has authority and should have a kinematic mode of false
Assert.True(serverPlayer.GetComponent().isKinematic == Kinematic);
@@ -66,12 +65,14 @@ public IEnumerator TestRigidbodyKinematicEnableDisable()
// despawn the server player, (but keep it around on the server)
serverPlayer.GetComponent().Despawn(false);
- yield return null;
+ yield return NetworkRigidbodyTestBase.WaitForFrames(5);
Assert.IsTrue(serverPlayer.GetComponent().isKinematic == Kinematic);
- yield return null;
+ yield return NetworkRigidbodyTestBase.WaitForFrames(5);
+
Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned.
}
+
}
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs
index ad6f9ca10d..0f5a59189f 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs
@@ -54,8 +54,7 @@ public IEnumerator TestRigidbodyKinematicEnableDisable()
Assert.IsNotNull(serverPlayer);
Assert.IsNotNull(clientPlayer);
- int waitFor = Time.frameCount + 2;
- yield return new WaitUntil(() => Time.frameCount >= waitFor);
+ yield return WaitForFrames(5);
// server rigidbody has authority and should have a kinematic mode of false
Assert.True(serverPlayer.GetComponent().isKinematic == Kinematic);
@@ -66,12 +65,19 @@ public IEnumerator TestRigidbodyKinematicEnableDisable()
// despawn the server player (but keep it around on the server)
serverPlayer.GetComponent().Despawn(false);
- yield return null;
+ yield return WaitForFrames(5);
Assert.IsTrue(serverPlayer.GetComponent().isKinematic == Kinematic);
- yield return null;
+ yield return WaitForFrames(5);
+
Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned.
}
+
+ public static IEnumerator WaitForFrames(int count)
+ {
+ int nextFrameNumber = Time.frameCount + count;
+ yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
+ }
}
}
diff --git a/testproject/Assets/Tests/Runtime/Physics.meta b/testproject/Assets/Tests/Runtime/Physics.meta
new file mode 100644
index 0000000000..de0808f1a7
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: efc90b4d4d76f7a48ad1cf726a3a193e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs
new file mode 100644
index 0000000000..6a97112f86
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs
@@ -0,0 +1,95 @@
+// using System.Collections;
+// using NUnit.Framework;
+// using Unity.Netcode.Components;
+// using Unity.Netcode.Samples;
+// using UnityEngine;
+// using UnityEngine.TestTools;
+//
+// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform
+// namespace Unity.Netcode.RuntimeTests.Physics
+// {
+// public class NetworkRigidbody2DDynamicCntChangeOwnershipTest : NetworkRigidbody2DCntChangeOwnershipTestBase
+// {
+// public override bool Kinematic => false;
+// }
+//
+// public class NetworkRigidbody2DKinematicCntChangeOwnershipTest : NetworkRigidbody2DCntChangeOwnershipTestBase
+// {
+// public override bool Kinematic => true;
+// }
+//
+// public abstract class NetworkRigidbody2DCntChangeOwnershipTestBase : BaseMultiInstanceTest
+// {
+// protected override int NbClients => 1;
+//
+// public abstract bool Kinematic { get; }
+//
+// [UnitySetUp]
+// public override IEnumerator Setup()
+// {
+// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
+// {
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.GetComponent().isKinematic = Kinematic;
+// });
+// }
+// ///
+// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly.
+// ///
+// ///
+// [UnityTest]
+// public IEnumerator TestRigidbodyKinematicEnableDisable()
+// {
+// // This is the *SERVER VERSION* of the *CLIENT PLAYER*
+// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
+// var serverPlayer = serverClientPlayerResult.Result.gameObject;
+//
+// // This is the *CLIENT VERSION* of the *CLIENT PLAYER*
+// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
+// var clientPlayer = clientClientPlayerResult.Result.gameObject;
+//
+// Assert.IsNotNull(serverPlayer);
+// Assert.IsNotNull(clientPlayer);
+//
+// int waitFor = Time.frameCount + 2;
+// yield return new WaitUntil(() => Time.frameCount >= waitFor);
+//
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+//
+//
+// // give server ownership over the player
+//
+// serverPlayer.GetComponent().ChangeOwnership(m_ServerNetworkManager.ServerClientId);
+//
+// yield return null;
+// yield return null;
+//
+// // server should now be able to commit to transform
+// TestKinematicSetCorrectly(serverPlayer, clientPlayer);
+//
+// // return ownership to client
+// serverPlayer.GetComponent().ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
+// yield return null;
+// yield return null;
+//
+// // client should again be able to commit
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+// }
+//
+//
+//
+// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer)
+// {
+//
+// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic).
+// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic);
+//
+// // can not commit player has no authority and should have a kinematic mode of true
+// Assert.True(canNotCommitPlayer.GetComponent().isKinematic);
+// }
+// }
+// }
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta
new file mode 100644
index 0000000000..b1c3736256
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a51c7f7b93f04e3499089963d9bbb254
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs
new file mode 100644
index 0000000000..8270bedc20
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs
@@ -0,0 +1,82 @@
+// using System.Collections;
+// using NUnit.Framework;
+// using Unity.Netcode.Components;
+// using Unity.Netcode.Samples;
+// using UnityEngine;
+// using UnityEngine.TestTools;
+//
+// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D. This test is in TestProject because it needs access to ClientNetworkTransform
+// namespace Unity.Netcode.RuntimeTests.Physics
+// {
+// public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase
+// {
+// public override bool Kinematic => false;
+// }
+//
+// public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase
+// {
+// public override bool Kinematic => true;
+// }
+//
+// public abstract class NetworkRigidbody2DCntTestBase : BaseMultiInstanceTest
+// {
+// protected override int NbClients => 1;
+//
+// public abstract bool Kinematic { get; }
+//
+// [UnitySetUp]
+// public override IEnumerator Setup()
+// {
+// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
+// {
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.GetComponent().isKinematic = Kinematic;
+// });
+// }
+//
+// ///
+// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly.
+// ///
+// ///
+// [UnityTest]
+// public IEnumerator TestRigidbodyKinematicEnableDisable()
+// {
+// // This is the *SERVER VERSION* of the *CLIENT PLAYER*
+// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
+// var serverPlayer = serverClientPlayerResult.Result.gameObject;
+//
+// // This is the *CLIENT VERSION* of the *CLIENT PLAYER*
+// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
+// var clientPlayer = clientClientPlayerResult.Result.gameObject;
+//
+// Assert.IsNotNull(serverPlayer);
+// Assert.IsNotNull(clientPlayer);
+//
+// int waitFor = Time.frameCount + 2;
+// yield return new WaitUntil(() => Time.frameCount >= waitFor);
+//
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+//
+// // despawn the server player
+// serverPlayer.GetComponent().Despawn(false);
+//
+// yield return null;
+// yield return null;
+// Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned.
+// }
+//
+// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer)
+// {
+//
+// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic).
+// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic);
+//
+// // can not commit player has no authority and should have a kinematic mode of true
+// Assert.True(canNotCommitPlayer.GetComponent().isKinematic);
+// }
+// }
+// }
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta
new file mode 100644
index 0000000000..f0d4cff600
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5ae5587c06cba7a46b93ee6774741c0d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs
new file mode 100644
index 0000000000..781ed22a9e
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs
@@ -0,0 +1,95 @@
+// using System.Collections;
+// using NUnit.Framework;
+// using Unity.Netcode.Components;
+// using Unity.Netcode.Samples;
+// using UnityEngine;
+// using UnityEngine.TestTools;
+//
+// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform
+// namespace Unity.Netcode.RuntimeTests.Physics
+// {
+// public class NetworkRigidbodyDynamicCntChangeOwnershipTest : NetworkRigidbodyCntChangeOwnershipTestBase
+// {
+// public override bool Kinematic => false;
+// }
+//
+// public class NetworkRigidbodyKinematicCntChangeOwnershipTest : NetworkRigidbodyCntChangeOwnershipTestBase
+// {
+// public override bool Kinematic => true;
+// }
+//
+// public abstract class NetworkRigidbodyCntChangeOwnershipTestBase : BaseMultiInstanceTest
+// {
+// protected override int NbClients => 1;
+//
+// public abstract bool Kinematic { get; }
+//
+// [UnitySetUp]
+// public override IEnumerator Setup()
+// {
+// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
+// {
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.GetComponent().isKinematic = Kinematic;
+// });
+// }
+// ///
+// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly.
+// ///
+// ///
+// [UnityTest]
+// public IEnumerator TestRigidbodyKinematicEnableDisable()
+// {
+// // This is the *SERVER VERSION* of the *CLIENT PLAYER*
+// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
+// var serverPlayer = serverClientPlayerResult.Result.gameObject;
+//
+// // This is the *CLIENT VERSION* of the *CLIENT PLAYER*
+// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
+// var clientPlayer = clientClientPlayerResult.Result.gameObject;
+//
+// Assert.IsNotNull(serverPlayer);
+// Assert.IsNotNull(clientPlayer);
+//
+// int waitFor = Time.frameCount + 2;
+// yield return new WaitUntil(() => Time.frameCount >= waitFor);
+//
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+//
+//
+// // give server ownership over the player
+//
+// serverPlayer.GetComponent().ChangeOwnership(m_ServerNetworkManager.ServerClientId);
+//
+// yield return null;
+// yield return null;
+//
+// // server should now be able to commit to transform
+// TestKinematicSetCorrectly(serverPlayer, clientPlayer);
+//
+// // return ownership to client
+// serverPlayer.GetComponent().ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
+// yield return null;
+// yield return null;
+//
+// // client should again be able to commit
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+// }
+//
+//
+//
+// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer)
+// {
+//
+// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic).
+// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic);
+//
+// // can not commit player has no authority and should have a kinematic mode of true
+// Assert.True(canNotCommitPlayer.GetComponent().isKinematic);
+// }
+// }
+// }
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta
new file mode 100644
index 0000000000..3eb4f88f5b
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 941008c8040f03c44bd835d24b073260
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs
new file mode 100644
index 0000000000..4cfb9faa04
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs
@@ -0,0 +1,82 @@
+// using System.Collections;
+// using NUnit.Framework;
+// using Unity.Netcode.Components;
+// using Unity.Netcode.Samples;
+// using UnityEngine;
+// using UnityEngine.TestTools;
+//
+// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform
+// namespace Unity.Netcode.RuntimeTests.Physics
+// {
+// public class NetworkRigidbodyDynamicCntTest : NetworkRigidbodyCntTestBase
+// {
+// public override bool Kinematic => false;
+// }
+//
+// public class NetworkRigidbodyKinematicCntTest : NetworkRigidbodyCntTestBase
+// {
+// public override bool Kinematic => true;
+// }
+//
+// public abstract class NetworkRigidbodyCntTestBase : BaseMultiInstanceTest
+// {
+// protected override int NbClients => 1;
+//
+// public abstract bool Kinematic { get; }
+//
+// [UnitySetUp]
+// public override IEnumerator Setup()
+// {
+// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab =>
+// {
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.AddComponent();
+// playerPrefab.GetComponent().isKinematic = Kinematic;
+// });
+// }
+// ///
+// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly.
+// ///
+// ///
+// [UnityTest]
+// public IEnumerator TestRigidbodyKinematicEnableDisable()
+// {
+// // This is the *SERVER VERSION* of the *CLIENT PLAYER*
+// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult));
+// var serverPlayer = serverClientPlayerResult.Result.gameObject;
+//
+// // This is the *CLIENT VERSION* of the *CLIENT PLAYER*
+// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper();
+// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult));
+// var clientPlayer = clientClientPlayerResult.Result.gameObject;
+//
+// Assert.IsNotNull(serverPlayer);
+// Assert.IsNotNull(clientPlayer);
+//
+// int waitFor = Time.frameCount + 2;
+// yield return new WaitUntil(() => Time.frameCount >= waitFor);
+//
+// TestKinematicSetCorrectly(clientPlayer, serverPlayer);
+//
+// // despawn the server player
+// serverPlayer.GetComponent().Despawn(false);
+//
+// yield return null;
+// yield return null;
+//
+// Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned.
+// }
+//
+// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer)
+// {
+//
+// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic).
+// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic);
+//
+// // can not commit player has no authority and should have a kinematic mode of true
+// Assert.True(canNotCommitPlayer.GetComponent().isKinematic);
+// }
+// }
+// }
diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta
new file mode 100644
index 0000000000..cea97efc01
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e89712f9406aaa84d85508fa07d97655
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef
index 4325f3c399..5cbf739efa 100644
--- a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef
+++ b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef
@@ -4,13 +4,26 @@
"references": [
"TestProject.ManualTests",
"Unity.Netcode.Runtime",
- "Unity.Netcode.RuntimeTests"
+ "Unity.Netcode.RuntimeTests",
+ "UnityEngine.TestRunner",
+ "UnityEditor.TestRunner",
+ "Unity.Netcode.Components",
+ "Sample",
+ "ClientNetworkTransform"
],
- "optionalUnityReferences": [
- "TestAssemblies"
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": true,
+ "precompiledReferences": [
+ "nunit.framework.dll"
],
+ "autoReferenced": false,
"defineConstraints": [
"UNITY_INCLUDE_TESTS",
- "UNITY_EDITOR"
- ]
+ "UNITY_EDITOR",
+ "UNITY_INCLUDE_TESTS"
+ ],
+ "versionDefines": [],
+ "noEngineReferences": false
}
\ No newline at end of file