diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index f8ca0a1761..e37d1cf57a 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -274,42 +274,55 @@ private void OnValidate() // Check network prefabs and assign to dictionary for quick look up for (int i = 0; i < NetworkConfig.NetworkPrefabs.Count; i++) { - if (NetworkConfig.NetworkPrefabs[i] != null && NetworkConfig.NetworkPrefabs[i].Prefab != null) + var networkPrefab = NetworkConfig.NetworkPrefabs[i]; + if (networkPrefab != null && networkPrefab.Prefab != null) { - var networkObject = NetworkConfig.NetworkPrefabs[i].Prefab.GetComponent(); + var networkObject = networkPrefab.Prefab.GetComponent(); if (networkObject == null) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) { - NetworkLog.LogWarning($"{nameof(NetworkPrefab)} [{i}] does not have a {nameof(NetworkObject)} component"); + NetworkLog.LogError($"Cannot register {nameof(NetworkPrefab)}[{i}], it does not have a {nameof(NetworkObject)} component at its root"); } } else { + { + var childNetworkObjects = new List(); + networkPrefab.Prefab.GetComponentsInChildren(/* includeInactive = */ true, childNetworkObjects); + if (childNetworkObjects.Count > 1) // total count = 1 root NetworkObject + n child NetworkObjects + { + if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)}[{i}] has child {nameof(NetworkObject)}(s) but they will not be spawned across the network (unsupported {nameof(NetworkPrefab)} setup)"); + } + } + } + // Default to the standard NetworkPrefab.Prefab's NetworkObject first var globalObjectIdHash = networkObject.GlobalObjectIdHash; // Now check to see if it has an override - switch (NetworkConfig.NetworkPrefabs[i].Override) + switch (networkPrefab.Override) { case NetworkPrefabOverride.Prefab: { - if (NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride == null && NetworkConfig.NetworkPrefabs[i].Prefab != null) + if (networkPrefab.SourcePrefabToOverride == null && networkPrefab.Prefab != null) { - NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride = NetworkConfig.NetworkPrefabs[i].Prefab; + networkPrefab.SourcePrefabToOverride = networkPrefab.Prefab; } - globalObjectIdHash = NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.GetComponent().GlobalObjectIdHash; + globalObjectIdHash = networkPrefab.SourcePrefabToOverride.GetComponent().GlobalObjectIdHash; } break; case NetworkPrefabOverride.Hash: - globalObjectIdHash = NetworkConfig.NetworkPrefabs[i].SourceHashToOverride; + globalObjectIdHash = networkPrefab.SourceHashToOverride; break; } // Add to the NetworkPrefabOverrideLinks or handle a new (blank) entries if (!NetworkConfig.NetworkPrefabOverrideLinks.ContainsKey(globalObjectIdHash)) { - NetworkConfig.NetworkPrefabOverrideLinks.Add(globalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); + NetworkConfig.NetworkPrefabOverrideLinks.Add(globalObjectIdHash, networkPrefab); } else { @@ -500,7 +513,7 @@ private void Initialize(bool server) // Clear out anything that is invalid or not used (for invalid entries we already logged warnings to the user earlier) // Iterate backwards so indices don't shift as we remove - for (int i = removeEmptyPrefabs.Count-1; i >= 0; i--) + for (int i = removeEmptyPrefabs.Count - 1; i >= 0; i--) { NetworkConfig.NetworkPrefabs.RemoveAt(removeEmptyPrefabs[i]); }