Skip to content

Commit 7e4efe1

Browse files
fix: Add null check in TrySetParent (#2625)
* fix: Add null check in TrySetParent fixes #2621 * Added tests * Changelog --------- Co-authored-by: Noel Stephens <noel.stephens@unity3d.com>
1 parent 72d6102 commit 7e4efe1

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1212

1313
### Fixed
1414

15+
- Fixed a crash when calling TrySetParent with a null Transform (#2625)
1516
- Fixed issue where a `NetworkTransform` using full precision state updates was losing transform state updates when interpolation was enabled. (#2624)
1617
- Fixed issue where `NetworkObject.SpawnWithObservers` was not being honored for late joining clients. (#2623)
1718
- Fixed issue where invoking `NetworkManager.Shutdown` multiple times, depending upon the timing, could cause an exception. (#2622)

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,12 @@ internal void SetNetworkParenting(ulong? latestParent, bool worldPositionStays)
733733
/// <returns>Whether or not reparenting was successful.</returns>
734734
public bool TrySetParent(Transform parent, bool worldPositionStays = true)
735735
{
736+
// If we are removing ourself from a parent
737+
if (parent == null)
738+
{
739+
return TrySetParent((NetworkObject)null, worldPositionStays);
740+
}
741+
736742
var networkObject = parent.GetComponent<NetworkObject>();
737743

738744
// If the parent doesn't have a NetworkObjet then return false, otherwise continue trying to parent

testproject/Assets/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,49 @@ public IEnumerator SetParentTryAPI()
309309
Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1]));
310310
Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent<NetworkObject>()));
311311
}
312+
313+
Transform nullTransform = null;
314+
GameObject nullGameObject = null;
315+
NetworkObject nullNetworkObject = null;
316+
317+
318+
Assert.That(m_Cube_NetObjs[0].GetComponent<NetworkObject>().TrySetParent(nullTransform));
319+
Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null));
320+
321+
nextFrameNumber = Time.frameCount + 2;
322+
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
323+
324+
for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++)
325+
{
326+
Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null));
327+
Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null));
328+
}
329+
330+
331+
Assert.That(m_Cube_NetObjs[0].GetComponent<NetworkObject>().TrySetParent(nullGameObject));
332+
Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null));
333+
334+
nextFrameNumber = Time.frameCount + 2;
335+
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
336+
337+
for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++)
338+
{
339+
Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null));
340+
Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null));
341+
}
342+
343+
344+
Assert.That(m_Cube_NetObjs[0].GetComponent<NetworkObject>().TrySetParent(nullNetworkObject));
345+
Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null));
346+
347+
nextFrameNumber = Time.frameCount + 2;
348+
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
349+
350+
for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++)
351+
{
352+
Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null));
353+
Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null));
354+
}
312355
}
313356
}
314357
}

0 commit comments

Comments
 (0)