diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 953f1c13f1..19385524fc 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -465,7 +465,10 @@ private void Initialize(bool server) // Build the NetworkPrefabOverrideLinks dictionary for (int i = 0; i < NetworkConfig.NetworkPrefabs.Count; i++) { - if (NetworkConfig.NetworkPrefabs[i] == null || NetworkConfig.NetworkPrefabs[i].Prefab == null) + var sourcePrefabGlobalObjectIdHash = (uint)0; + var targetPrefabGlobalObjectIdHash = (uint)0; + var networkObject = (NetworkObject)null; + if (NetworkConfig.NetworkPrefabs[i] == null || (NetworkConfig.NetworkPrefabs[i].Prefab == null && NetworkConfig.NetworkPrefabs[i].Override == NetworkPrefabOverride.None)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { @@ -474,60 +477,144 @@ private void Initialize(bool server) } removeEmptyPrefabs.Add(i); - continue; } - else if (NetworkConfig.NetworkPrefabs[i].Prefab.GetComponent() == null) + else if (NetworkConfig.NetworkPrefabs[i].Override == NetworkPrefabOverride.None) { - if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + networkObject = NetworkConfig.NetworkPrefabs[i].Prefab.GetComponent(); + if (networkObject == null) { - NetworkLog.LogWarning( - $"{nameof(NetworkPrefab)} (\"{NetworkConfig.NetworkPrefabs[i].Prefab.name}\") is missing a {nameof(NetworkObject)} component"); + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)} (\"{NetworkConfig.NetworkPrefabs[i].Prefab.name}\") is missing " + + $"a {nameof(NetworkObject)} component (entry will be ignored)."); + } + removeEmptyPrefabs.Add(i); + continue; } - // Provide the name of the prefab with issues so the user can more easily find the prefab and fix it - Debug.LogWarning($"{nameof(NetworkPrefab)} (\"{NetworkConfig.NetworkPrefabs[i].Prefab.name}\") will be removed and ignored."); - removeEmptyPrefabs.Add(i); - - continue; + // Otherwise get the GlobalObjectIdHash value + sourcePrefabGlobalObjectIdHash = networkObject.GlobalObjectIdHash; } - - var networkObject = NetworkConfig.NetworkPrefabs[i].Prefab.GetComponent(); - - // Assign the appropriate GlobalObjectIdHash to the appropriate NetworkPrefab - if (!NetworkConfig.NetworkPrefabOverrideLinks.ContainsKey(networkObject.GlobalObjectIdHash)) + else // Validate Overrides { + // Validate source prefab override values first switch (NetworkConfig.NetworkPrefabs[i].Override) { - default: - case NetworkPrefabOverride.None: - NetworkConfig.NetworkPrefabOverrideLinks.Add(networkObject.GlobalObjectIdHash, - NetworkConfig.NetworkPrefabs[i]); - break; - case NetworkPrefabOverride.Prefab: + case NetworkPrefabOverride.Hash: { - var sourcePrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.GetComponent().GlobalObjectIdHash; - NetworkConfig.NetworkPrefabOverrideLinks.Add(sourcePrefabGlobalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); - - var targetPrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].OverridingTargetPrefab.GetComponent().GlobalObjectIdHash; - NetworkConfig.OverrideToNetworkPrefab.Add(targetPrefabGlobalObjectIdHash, sourcePrefabGlobalObjectIdHash); + if (NetworkConfig.NetworkPrefabs[i].SourceHashToOverride == 0) + { + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)} {nameof(NetworkPrefab.SourceHashToOverride)} is zero (entry will be ignored)."); + } + removeEmptyPrefabs.Add(i); + continue; + } + sourcePrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].SourceHashToOverride; + break; } - break; - case NetworkPrefabOverride.Hash: + case NetworkPrefabOverride.Prefab: { - var sourcePrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].SourceHashToOverride; - NetworkConfig.NetworkPrefabOverrideLinks.Add(sourcePrefabGlobalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); + if (NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride == null) + { + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)} {nameof(NetworkPrefab.SourcePrefabToOverride)} is null (entry will be ignored)."); + } + Debug.LogWarning($"{nameof(NetworkPrefab)} override entry {NetworkConfig.NetworkPrefabs[i].SourceHashToOverride} will be removed and ignored."); + removeEmptyPrefabs.Add(i); + continue; + } + else + { + networkObject = NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.GetComponent(); + if (networkObject == null) + { + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)} ({NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.name}) " + + $"is missing a {nameof(NetworkObject)} component (entry will be ignored)."); + } + Debug.LogWarning($"{nameof(NetworkPrefab)} override entry (\"{NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.name}\") will be removed and ignored."); + removeEmptyPrefabs.Add(i); + continue; + } + sourcePrefabGlobalObjectIdHash = networkObject.GlobalObjectIdHash; + } + break; + } + } - var targetPrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].OverridingTargetPrefab.GetComponent().GlobalObjectIdHash; - NetworkConfig.OverrideToNetworkPrefab.Add(targetPrefabGlobalObjectIdHash, sourcePrefabGlobalObjectIdHash); + // Validate target prefab override values next + if (NetworkConfig.NetworkPrefabs[i].OverridingTargetPrefab == null) + { + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogWarning($"{nameof(NetworkPrefab)} {nameof(NetworkPrefab.OverridingTargetPrefab)} is null!"); + } + removeEmptyPrefabs.Add(i); + switch (NetworkConfig.NetworkPrefabs[i].Override) + { + case NetworkPrefabOverride.Hash: + { + Debug.LogWarning($"{nameof(NetworkPrefab)} override entry {NetworkConfig.NetworkPrefabs[i].SourceHashToOverride} will be removed and ignored."); + break; + } + case NetworkPrefabOverride.Prefab: + { + Debug.LogWarning($"{nameof(NetworkPrefab)} override entry ({NetworkConfig.NetworkPrefabs[i].SourcePrefabToOverride.name}) will be removed and ignored."); + break; + } + } + continue; + } + else + { + targetPrefabGlobalObjectIdHash = NetworkConfig.NetworkPrefabs[i].OverridingTargetPrefab.GetComponent().GlobalObjectIdHash; + } + } + + // Assign the appropriate GlobalObjectIdHash to the appropriate NetworkPrefab + if (!NetworkConfig.NetworkPrefabOverrideLinks.ContainsKey(sourcePrefabGlobalObjectIdHash)) + { + if (NetworkConfig.NetworkPrefabs[i].Override == NetworkPrefabOverride.None) + { + NetworkConfig.NetworkPrefabOverrideLinks.Add(sourcePrefabGlobalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); + } + else + { + if (!NetworkConfig.OverrideToNetworkPrefab.ContainsKey(targetPrefabGlobalObjectIdHash)) + { + switch (NetworkConfig.NetworkPrefabs[i].Override) + { + case NetworkPrefabOverride.Prefab: + { + NetworkConfig.NetworkPrefabOverrideLinks.Add(sourcePrefabGlobalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); + NetworkConfig.OverrideToNetworkPrefab.Add(targetPrefabGlobalObjectIdHash, sourcePrefabGlobalObjectIdHash); + } + break; + case NetworkPrefabOverride.Hash: + { + NetworkConfig.NetworkPrefabOverrideLinks.Add(sourcePrefabGlobalObjectIdHash, NetworkConfig.NetworkPrefabs[i]); + NetworkConfig.OverrideToNetworkPrefab.Add(targetPrefabGlobalObjectIdHash, sourcePrefabGlobalObjectIdHash); + } + break; } - break; + } + else + { + // This can happen if a user tries to make several GlobalObjectIdHash values point to the same target + Debug.LogError($"{nameof(NetworkPrefab)} (\"{networkObject.name}\") has a duplicate {nameof(NetworkObject.GlobalObjectIdHash)} target entry value of: {targetPrefabGlobalObjectIdHash}! Removing entry from list!"); + removeEmptyPrefabs.Add(i); + } } } else { // This should never happen, but in the case it somehow does log an error and remove the duplicate entry - Debug.LogError($"{nameof(NetworkPrefab)} (\"{NetworkConfig.NetworkPrefabs[i].Prefab.name}\") has a duplicate {nameof(NetworkObject.GlobalObjectIdHash)} {networkObject.GlobalObjectIdHash} entry! Removing entry from list!"); + Debug.LogError($"{nameof(NetworkPrefab)} ({networkObject.name}) has a duplicate {nameof(NetworkObject.GlobalObjectIdHash)} source entry value of: {sourcePrefabGlobalObjectIdHash}! Removing entry from list!"); removeEmptyPrefabs.Add(i); } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs index 3194feafac..02f5d2392f 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs @@ -15,15 +15,25 @@ namespace Unity.Netcode.RuntimeTests /// public class NetworkPrefabHandlerTests { + + private const string k_TestPrefabObjectName = "NetworkPrefabTestObject"; + private uint m_GlobalObjectIdHashBase = 123456; + private GameObject MakeValidNetworkPrefab() + { + Guid baseObjectID = NetworkManagerHelper.AddGameNetworkObject(k_TestPrefabObjectName + m_GlobalObjectIdHashBase.ToString()); + NetworkObject validPrefab = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID]; + MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(validPrefab, m_GlobalObjectIdHashBase); + m_GlobalObjectIdHashBase++; + return validPrefab.gameObject; + } + /// - /// Tests the NetwokConfig NetworkPrefabs initialization during NetworkManager's Init method + /// Tests the NetwokConfig NetworkPrefabs initialization during NetworkManager's Init method to make sure that + /// it will still initialize but remove the invalid prefabs /// [Test] public void NetworkConfigInvalidNetworkPrefabTest() { - var testPrefabObjectName = "NetworkPrefabHandlerTestObject"; - Guid baseObjectID = NetworkManagerHelper.AddGameNetworkObject(testPrefabObjectName); - NetworkObject baseObject = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID]; // Add null entry NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(null); @@ -31,11 +41,30 @@ public void NetworkConfigInvalidNetworkPrefabTest() // Add a NetworkPrefab with no prefab NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab()); - var validNetworkPrefab = new NetworkPrefab(); - validNetworkPrefab.Prefab = baseObject.gameObject; + // Add a NetworkPrefab override with an invalid hash + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Hash, SourceHashToOverride = 0 }); + + // Add a NetworkPrefab override with a valid hash but an invalid target prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Hash, SourceHashToOverride = 654321, OverridingTargetPrefab = null }); + + // Add a NetworkPrefab override with a valid hash to override but an invalid target prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourceHashToOverride = 654321, OverridingTargetPrefab = null }); + + // Add a NetworkPrefab override with an invalid source prefab to override + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = null }); + + // Add a NetworkPrefab override with a valid source prefab to override but an invalid target prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = MakeValidNetworkPrefab(), OverridingTargetPrefab = null }); + + // Add a valid prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Prefab = MakeValidNetworkPrefab() }); + + // Add a NetworkPrefab override with a valid hash and valid target prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Hash, SourceHashToOverride = 11111111, OverridingTargetPrefab = MakeValidNetworkPrefab() }); + + // Add a NetworkPrefab override with a valid prefab and valid target prefab + NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Override = NetworkPrefabOverride.Prefab, SourcePrefabToOverride = MakeValidNetworkPrefab(), OverridingTargetPrefab = MakeValidNetworkPrefab() }); - //Add a valid prefab - NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabs.Add(validNetworkPrefab); var exceptionOccurred = false; try { @@ -47,6 +76,9 @@ public void NetworkConfigInvalidNetworkPrefabTest() } Assert.False(exceptionOccurred); + + // In the end we should only have 3 valid registered network prefabs + Assert.True(NetworkManagerHelper.NetworkManagerObject.NetworkConfig.NetworkPrefabOverrideLinks.Count == 3); } private const string k_PrefabObjectName = "NetworkPrefabHandlerTestObject"; diff --git a/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab b/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab new file mode 100644 index 0000000000..aeadc1f575 --- /dev/null +++ b/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &280257649504156795 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -5591000292386890817, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: GlobalObjectIdHash + value: 951099334 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360811, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_Name + value: ObjectToOverride-VariantShinyBlueCapsule + objectReference: {fileID: 0} + - target: {fileID: 771575417923360817, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} + - target: {fileID: 771575417923360819, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 5d9678afcf333564dab383a5db660ae3, type: 2} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalScale.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 771575417923360822, guid: 29cabf623d47bb345a9bb4140e4397d7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 29cabf623d47bb345a9bb4140e4397d7, type: 3} diff --git a/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab.meta b/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab.meta new file mode 100644 index 0000000000..81f202f1c7 --- /dev/null +++ b/testproject/Assets/Prefabs/ObjectToOverride-VariantShinyBlueCapsule.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 23a6a208dc8f7b946a001fbfe1968aa9 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab b/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab new file mode 100644 index 0000000000..415558a061 --- /dev/null +++ b/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab @@ -0,0 +1,66 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &9135756850134264021 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9135756850134264011} + - component: {fileID: 9135756850134264010} + - component: {fileID: 9135756850134264020} + m_Layer: 0 + m_Name: PrefabPoolCapsule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9135756850134264011 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9135756850134264021} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &9135756850134264010 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9135756850134264021} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 951099334 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &9135756850134264020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9135756850134264021} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 83e085235981b734bad565d9a60de47a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ObjectToPool: {fileID: 672869341006996560, guid: 23a6a208dc8f7b946a001fbfe1968aa9, + type: 3} + m_ObjectPoolSize: 15 + m_SpawnsPerSecond: 2 diff --git a/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab.meta b/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab.meta new file mode 100644 index 0000000000..4d5d3c4141 --- /dev/null +++ b/testproject/Assets/Prefabs/PrefabPoolCapsule.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b3b9c4132e5721b4baa05aab08b1a0ab +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObject.unity b/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObject.unity index b6f45491da..d278796252 100644 --- a/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObject.unity +++ b/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObject.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641275, b: 0.5748172, a: 1} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -631,6 +631,7 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -726,6 +727,7 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -821,6 +823,7 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -1154,6 +1157,86 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 29.646, y: 0, z: 0} +--- !u!1001 &1149956384 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 9135756850134264010, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: GlobalObjectIdHash + value: 637189631 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalPosition.x + value: -18.2 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.87 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.1 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264011, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9135756850134264020, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_ObjectToPool + value: + objectReference: {fileID: 672869341006996560, guid: 23a6a208dc8f7b946a001fbfe1968aa9, + type: 3} + - target: {fileID: 9135756850134264021, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} + propertyPath: m_Name + value: PrefabPoolCapsule + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b3b9c4132e5721b4baa05aab08b1a0ab, type: 3} --- !u!1001 &1261499201 PrefabInstance: m_ObjectHideFlags: 0 @@ -1234,13 +1317,18 @@ PrefabInstance: - target: {fileID: 3738766586356797253, guid: f65b5e9dbbff79149a4a7d52e7da2565, type: 3} propertyPath: m_Enabled - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 5085754885400786750, guid: f65b5e9dbbff79149a4a7d52e7da2565, type: 3} propertyPath: m_Name value: MyMeshNetworkObject objectReference: {fileID: 0} + - target: {fileID: 5085754885400786750, guid: f65b5e9dbbff79149a4a7d52e7da2565, + type: 3} + propertyPath: m_TagString + value: Boundary + objectReference: {fileID: 0} - target: {fileID: 7830709326079877768, guid: f65b5e9dbbff79149a4a7d52e7da2565, type: 3} propertyPath: m_ActivateObjectButton @@ -1249,7 +1337,7 @@ PrefabInstance: - target: {fileID: 7914308651485899481, guid: f65b5e9dbbff79149a4a7d52e7da2565, type: 3} propertyPath: m_Enabled - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7914308651485899481, guid: f65b5e9dbbff79149a4a7d52e7da2565, type: 3} @@ -1320,6 +1408,7 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -1435,7 +1524,25 @@ MonoBehaviour: AllowRuntimeSceneChanges: 0 PlayerPrefab: {fileID: 4079352819444256614, guid: c16f03336b6104576a565ef79ad643c0, type: 3} - NetworkPrefabs: [] + NetworkPrefabs: + - Override: 0 + Prefab: {fileID: 672869341006996560, guid: 23a6a208dc8f7b946a001fbfe1968aa9, + type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 2 + Prefab: {fileID: 0} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 1187012931 + OverridingTargetPrefab: {fileID: 5085754885400786750, guid: f65b5e9dbbff79149a4a7d52e7da2565, + type: 3} + - Override: 2 + Prefab: {fileID: 0} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 637189631 + OverridingTargetPrefab: {fileID: 9135756850134264021, guid: b3b9c4132e5721b4baa05aab08b1a0ab, + type: 3} TickRate: 30 ClientConnectionBufferTimeout: 10 ConnectionApproval: 0 @@ -1444,7 +1551,7 @@ MonoBehaviour: TimeResyncInterval: 30 EnableNetworkVariable: 1 EnsureNetworkVariableLengthSafety: 0 - EnableSceneManagement: 1 + EnableSceneManagement: 0 ForceSamePrefabs: 1 RecycleNetworkIds: 1 NetworkIdRecycleDelay: 120 @@ -1485,7 +1592,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1706952614} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 15.8, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -1614,6 +1721,7 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 diff --git a/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObjectComponent.cs b/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObjectComponent.cs index 9e96de0a12..7260c3b3e2 100644 --- a/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObjectComponent.cs +++ b/testproject/Assets/Samples/EnableDisableNetworkObject/EnableDisableSceneNetworkObjectComponent.cs @@ -13,35 +13,40 @@ public class EnableDisableSceneNetworkObjectComponent : NetworkBehaviour [SerializeField] private Button m_ActivateObjectButton; - private bool m_CurrentActiveState; + private Text m_ButtonText; + private bool m_CurrentActiveState = true; private void Start() { - //For this example, hide the button until NetworkStart is invoked. - if (m_ActivateObjectButton) + if(m_ActivateObjectButton != null) { + m_ButtonText = m_ActivateObjectButton.GetComponentInChildren(); + if (m_ButtonText != null) + { + m_ButtonText.text = "Hide"; + } + m_ActivateObjectButton.gameObject.SetActive(false); } } public override void OnNetworkSpawn() { - //For this example, the server controls whether the mesh is visible and can collide or not - if (IsServer && IsHost) + if (IsServer) { - if (m_ActivateObjectButton) - { - m_ActivateObjectButton.gameObject.SetActive(true); - } + m_ActivateObjectButton.gameObject.SetActive(true); } base.OnNetworkSpawn(); } public void ButtonActivateToggle() { - m_CurrentActiveState = !m_CurrentActiveState; - StartActivation(m_CurrentActiveState); + if (NetworkManager != null && NetworkManager.IsListening && IsServer) + { + m_CurrentActiveState = !m_CurrentActiveState; + StartActivation(m_CurrentActiveState); + } } public void StartActivation(bool isActive) @@ -64,6 +69,18 @@ private void Activate(bool isActive) { m_MyBoxCollider.enabled = isActive; } + + if (m_ButtonText != null) + { + if (isActive) + { + m_ButtonText.text = "Hide"; + } + else + { + m_ButtonText.text = "Show"; + } + } } diff --git a/testproject/Assets/Samples/EnableDisableNetworkObject/MyMeshNetworkObject.prefab b/testproject/Assets/Samples/EnableDisableNetworkObject/MyMeshNetworkObject.prefab index 2d9a200117..514f8a598f 100644 --- a/testproject/Assets/Samples/EnableDisableNetworkObject/MyMeshNetworkObject.prefab +++ b/testproject/Assets/Samples/EnableDisableNetworkObject/MyMeshNetworkObject.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 3738766586356797253} m_Layer: 0 m_Name: MyMeshNetworkObject - m_TagString: Untagged + m_TagString: Boundary m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -29,8 +29,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5085754885400786750} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalPosition: {x: 0, y: 2.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 60} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 @@ -50,6 +50,7 @@ MonoBehaviour: GlobalObjectIdHash: 951099334 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &7830709326079877768 MonoBehaviour: m_ObjectHideFlags: 0 @@ -80,7 +81,7 @@ MeshRenderer: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5085754885400786750} - m_Enabled: 0 + m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 @@ -93,7 +94,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: 32cd9a9855dc14afc8e589dabe98a40b, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -124,7 +125,7 @@ BoxCollider: m_GameObject: {fileID: 5085754885400786750} m_Material: {fileID: 0} m_IsTrigger: 0 - m_Enabled: 0 + m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} diff --git a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs index af69232035..c3e9b15eb7 100644 --- a/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs +++ b/testproject/Assets/Samples/PrefabPool/NetworkPrefabHandlerObjectPool.cs @@ -76,6 +76,14 @@ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaterni return gameObject.GetComponent(); } + private void OnDisable() + { + if (NetworkManager && NetworkManager.PrefabHandler != null) + { + NetworkManager.PrefabHandler.RemoveHandler(m_ObjectToPool); + } + } + public void Destroy(NetworkObject networkObject) { if (m_ObjectsPool.Contains(networkObject.gameObject))