From ee28f970aed1487e5dac94957de12063c42e20b4 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 13 Jul 2023 11:52:57 -0500 Subject: [PATCH 1/3] fix: Add null check in TrySetParent fixes #2621 --- com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 3643d44a57..cd98c11e20 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -733,6 +733,12 @@ internal void SetNetworkParenting(ulong? latestParent, bool worldPositionStays) /// Whether or not reparenting was successful. public bool TrySetParent(Transform parent, bool worldPositionStays = true) { + // If we are removing ourself from a parent + if (parent == null) + { + return TrySetParent((NetworkObject)null, worldPositionStays); + } + var networkObject = parent.GetComponent(); // If the parent doesn't have a NetworkObjet then return false, otherwise continue trying to parent From 76aa9bb2dbf2d48162c865ce10baa5d43b59f407 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 13 Jul 2023 12:25:51 -0500 Subject: [PATCH 2/3] Added tests --- .../NetworkObjectParentingTests.cs | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/testproject/Assets/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/testproject/Assets/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 65fb476822..1b1257a6c3 100644 --- a/testproject/Assets/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/testproject/Assets/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -309,6 +309,49 @@ public IEnumerator SetParentTryAPI() Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1])); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } + + Transform nullTransform = null; + GameObject nullGameObject = null; + NetworkObject nullNetworkObject = null; + + + Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(nullTransform)); + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null)); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null)); + } + + + Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(nullGameObject)); + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null)); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null)); + } + + + Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(nullNetworkObject)); + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null)); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null)); + } } } } From 63f0369559f6d1ce4cbb2692b7b8682585f3eb71 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 13 Jul 2023 12:27:22 -0500 Subject: [PATCH 3/3] Changelog --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 1a0dfaa2d6..72e40193c0 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -15,6 +15,7 @@ Additional documentation and release notes are available at [Multiplayer Documen - Fixed issue where `NetworkObject.SpawnWithObservers` was not being honored for late joining clients. (#2623) - Fixed issue where invoking `NetworkManager.Shutdown` multiple times, depending upon the timing, could cause an exception. (#2622) +- Fixed a crash when calling TrySetParent with a null Transform (#2625) ## Changed