Skip to content

Commit 34a6b8d

Browse files
update
Applying changes based on review discussion.
1 parent 091b502 commit 34a6b8d

4 files changed

Lines changed: 50 additions & 16 deletions

File tree

com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -768,10 +768,7 @@ protected virtual void Awake()
768768
if (!m_Animator)
769769
{
770770
#if !UNITY_EDITOR
771-
if (!m_Animator)
772-
{
773-
Debug.LogWarning($"{nameof(NetworkAnimator)} {name} does not have an {nameof(UnityEngine.Animator)} assigned to it. The {nameof(NetworkAnimator)} will not initialize properly.");
774-
}
771+
Debug.LogWarning($"{nameof(NetworkAnimator)} {name} does not have an {nameof(UnityEngine.Animator)} assigned to it. The {nameof(NetworkAnimator)} will not initialize properly.");
775772
#endif
776773
return;
777774
}

com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,34 @@ public class NetworkPrefabs
4747
[NonSerialized]
4848
private List<NetworkPrefab> m_Prefabs = new List<NetworkPrefab>();
4949

50-
internal List<NetworkPrefab> InternalPrefabs => m_Prefabs;
50+
/// <summary>
51+
/// Returns the last registered prefab.
52+
/// </summary>
53+
internal NetworkPrefab GetLastRegisteredPrefab()
54+
{
55+
if (m_Prefabs.Count == 0)
56+
{
57+
return null;
58+
}
59+
return m_Prefabs[m_Prefabs.Count - 1];
60+
}
61+
62+
/// <summary>
63+
/// Applies a network prefab at a specific index
64+
/// </summary>
65+
/// <param name="index">index to apply</param>
66+
/// <param name="networkPrefab">network prefab to be applied</param>
67+
/// <returns></returns>
68+
internal bool AssignPrefabAtIndex(int index, NetworkPrefab networkPrefab)
69+
{
70+
if (index >= m_Prefabs.Count)
71+
{
72+
NetworkManager.Singleton.Log.Error(new Logging.Context(LogLevel.Normal, $"[{nameof(NetworkPrefabs)}][{nameof(AssignPrefabAtIndex)}] Cannot apply prefab to index {index} when the {nameof(m_Prefabs)} count is only {m_Prefabs.Count}!"));
73+
return false;
74+
}
75+
m_Prefabs[index] = networkPrefab;
76+
return true;
77+
}
5178

5279
[NonSerialized]
5380
private Dictionary<uint, NetworkPrefab> m_PrefabHashIds = new Dictionary<uint, NetworkPrefab>();

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,22 @@ private void CheckForInScenePlaced()
350350

351351
// Default scene migration synchronization to false for in-scene placed NetworkObjects
352352
SceneMigrationSynchronization = false;
353+
354+
// Set our disabled in-scene placed flag for spawning initially disabled in-scene placed objects.
355+
m_InScenePlacedDisabledByDefault = gameObject.activeInHierarchy;
353356
}
354357
}
355358
#endif // UNITY_EDITOR
356359

360+
/// <summary>
361+
/// Used to provide support for initially disabled in-scene placed objects.
362+
/// This is only ever set on in-scene placed objects that are already disabled
363+
/// in the scene asset itself.
364+
/// </summary>
365+
[HideInInspector]
366+
[SerializeField]
367+
private bool m_InScenePlacedDisabledByDefault;
368+
357369
/// <summary>
358370
/// Gets the NetworkManager that owns this NetworkObject instance
359371
/// </summary>
@@ -1887,8 +1899,8 @@ private void SpawnInternal(bool destroyWithScene, ulong ownerClientId, bool play
18871899
// Trap for runtime generated instances as this is not valid
18881900
if (GlobalObjectIdHash == 0)
18891901
{
1890-
NetworkManager.Log.ErrorServer(new Context(LogLevel.Error, $"{name} has a {nameof(GlobalObjectIdHash)} value of {GlobalObjectIdHash}(zero)!" +
1891-
$"This is typically a sign of runtime generated {nameof(NetworkObject)}s which is not supported."));
1902+
NetworkManager.Log.ErrorServer(new Context(LogLevel.Error, $"Detected {nameof(NetworkObject)} {nameof(GlobalObjectIdHash)} value of 0!" +
1903+
$"This is typically a sign of runtime generated network prefab assets which are not supported.").AddNetworkObject(this));
18921904
return;
18931905
}
18941906

@@ -1904,7 +1916,7 @@ private void SpawnInternal(bool destroyWithScene, ulong ownerClientId, bool play
19041916
// If we are marked as in-scene place, have never been spawned, and the root GameObject
19051917
// was not disabled upon being instantiated, then treat this as a dynamically spawned
19061918
// instance.
1907-
if (InScenePlaced && !m_GameObjectWasDisabledWhenInstantiated && !HasBeenSpawned)
1919+
if (InScenePlaced && !m_InScenePlacedDisabledByDefault && !HasBeenSpawned)
19081920
{
19091921
if (NetworkManagerOwner.NetworkConfig.EnableSceneManagement && NetworkManagerOwner.LogLevel <= LogLevel.Developer)
19101922
{
@@ -3717,13 +3729,13 @@ internal void SceneChangedUpdate(Scene scene, bool notify = false)
37173729
}
37183730
}
37193731

3720-
private bool m_GameObjectWasDisabledWhenInstantiated;
3732+
37213733

37223734
private void Awake()
37233735
{
37243736
SetCachedParent(transform.parent);
37253737
SceneOrigin = gameObject.scene;
3726-
m_GameObjectWasDisabledWhenInstantiated = gameObject.activeInHierarchy;
3738+
m_GameObjectWasDisabledWhenInstantiated = true;
37273739
}
37283740

37293741
/// <summary>

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,20 +79,20 @@ public IEnumerator NetworkConfigInvalidNetworkPrefabTest()
7979
// This would be the scenario that a hash would be used (typically when scene management is disabled)
8080
validPrefabForSourceHash.InScenePlaced = true;
8181

82-
var networkPrefab = authority.NetworkConfig.Prefabs.InternalPrefabs[authority.NetworkConfig.Prefabs.InternalPrefabs.Count - 1];
82+
var networkPrefab = authority.NetworkConfig.Prefabs.GetLastRegisteredPrefab();
8383
networkPrefab.SourceHashToOverride = validPrefabForSourceHash.GlobalObjectIdHash;
8484
networkPrefab.OverridingTargetPrefab = validPrefabAsset.gameObject;
8585
networkPrefab.Override = NetworkPrefabOverride.Hash;
86-
authority.NetworkConfig.Prefabs.InternalPrefabs[authority.NetworkConfig.Prefabs.InternalPrefabs.Count - 1] = networkPrefab;
86+
Assert.True(authority.NetworkConfig.Prefabs.AssignPrefabAtIndex(authority.NetworkConfig.Prefabs.Prefabs.Count - 1, networkPrefab), $"Failed to assign network prefab!");
8787

8888
var sourcePrefab = MakeValidNetworkPrefab();
89-
networkPrefab = authority.NetworkConfig.Prefabs.InternalPrefabs[authority.NetworkConfig.Prefabs.InternalPrefabs.Count - 1];
89+
networkPrefab = authority.NetworkConfig.Prefabs.GetLastRegisteredPrefab();
9090
var index = authority.NetworkConfig.Prefabs.Prefabs.Count - 1;
9191
var targetPrefab = MakeValidNetworkPrefab();
9292
networkPrefab.Prefab = sourcePrefab;
9393
networkPrefab.SourcePrefabToOverride = sourcePrefab;
9494
networkPrefab.OverridingTargetPrefab = targetPrefab;
95-
authority.NetworkConfig.Prefabs.InternalPrefabs[index] = networkPrefab;
95+
Assert.True(authority.NetworkConfig.Prefabs.AssignPrefabAtIndex(index, networkPrefab), $"Failed to assign network prefab!");
9696

9797
m_CanStart = true;
9898
yield return StartServerAndClients();
@@ -101,8 +101,6 @@ public IEnumerator NetworkConfigInvalidNetworkPrefabTest()
101101
Assert.AreEqual(5, authority.NetworkConfig.Prefabs.NetworkPrefabOverrideLinks.Count);
102102
}
103103

104-
private const string k_PrefabObjectName = "NetworkPrefabHandlerTestObject";
105-
106104

107105
[UnityTest]
108106
public IEnumerator NetworkPrefabHandlerClass([Values] NetworkTopologyTypes topologyType)

0 commit comments

Comments
 (0)