From 2973bb94723ef9f8a32252e3289b214e33bbbbb4 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com> Date: Thu, 18 May 2023 16:48:17 -0500 Subject: [PATCH 01/99] update Adjusting namespaces to get NGO running with N4E --- com.unity.netcode.gameobjects/Components/AssemblyInfo.cs | 6 +++--- com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs | 2 +- .../Editor/CodeGen/CodeGenHelpers.cs | 2 +- .../Editor/CodeGen/INetworkMessageILPP.cs | 2 +- .../Editor/CodeGen/INetworkSerializableILPP.cs | 2 +- .../Editor/CodeGen/NetworkBehaviourILPP.cs | 2 +- .../Editor/CodeGen/PostProcessorAssemblyResolver.cs | 2 +- .../Editor/CodeGen/PostProcessorReflectionImporter.cs | 2 +- .../CodeGen/PostProcessorReflectionImporterProvider.cs | 2 +- .../Editor/CodeGen/RuntimeAccessModifiersILPP.cs | 2 +- .../Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef | 4 ++-- .../Editor/Configuration/NetcodeForGameObjectsSettings.cs | 2 +- .../Editor/Configuration/NetcodeSettingsProvider.cs | 2 +- .../Editor/Configuration/NetworkPrefabProcessor.cs | 2 +- .../Editor/Configuration/NetworkPrefabsEditor.cs | 2 +- com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs | 2 +- .../Editor/NetworkBehaviourEditor.cs | 4 ++-- .../Editor/NetworkManagerEditor.cs | 4 ++-- .../Editor/NetworkManagerHelper.cs | 4 ++-- com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs | 2 +- .../Editor/NetworkTransformEditor.cs | 2 +- .../Editor/PackageChecker/UTPAdapterChecker.cs | 2 +- .../com.unity.netcode.editor.packagechecker.asmdef | 4 ++-- .../Editor/com.unity.netcode.editor.asmdef | 4 ++-- com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs | 6 +++--- .../Tests/Editor/ArithmeticTests.cs | 2 +- .../Tests/Editor/Build/BuildTests.cs | 2 +- .../Tests/Editor/DisconnectMessageTests.cs | 2 +- .../Tests/Editor/InterpolatorTests.cs | 2 +- .../Tests/Editor/Messaging/DisconnectOnSendTests.cs | 2 +- .../Tests/Editor/Messaging/MessageCorruptionTests.cs | 2 +- .../Tests/Editor/Messaging/MessageReceivingTests.cs | 2 +- .../Tests/Editor/Messaging/MessageRegistrationTests.cs | 2 +- .../Tests/Editor/Messaging/MessageSendingTests.cs | 2 +- .../Tests/Editor/Messaging/MessageVersioningTests.cs | 2 +- .../Tests/Editor/Messaging/NopMessageSender.cs | 2 +- .../Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs | 2 +- .../Tests/Editor/NetworkBehaviourTests.cs | 2 +- .../Tests/Editor/NetworkManagerConfigurationTests.cs | 4 ++-- .../Tests/Editor/NetworkObjectTests.cs | 2 +- .../Tests/Editor/NetworkPrefabProcessorTests.cs | 4 ++-- .../Tests/Editor/NetworkVar/NetworkVarTests.cs | 2 +- .../Editor/Serialization/BaseFastBufferReaderWriterTest.cs | 2 +- .../Tests/Editor/Serialization/BitCounterTests.cs | 2 +- .../Tests/Editor/Serialization/BitReaderTests.cs | 2 +- .../Tests/Editor/Serialization/BitWriterTests.cs | 2 +- .../Tests/Editor/Serialization/BufferSerializerTests.cs | 2 +- .../Tests/Editor/Serialization/BytePackerTests.cs | 2 +- .../Tests/Editor/Serialization/FastBufferReaderTests.cs | 2 +- .../Tests/Editor/Serialization/FastBufferWriterTests.cs | 2 +- .../UserBitReaderAndBitWriterTests_NCCBUG175.cs | 2 +- .../Tests/Editor/Timing/ClientNetworkTimeSystemTests.cs | 2 +- .../Tests/Editor/Timing/NetworkTimeTests.cs | 2 +- .../Tests/Editor/Timing/ServerNetworkTimeSystemTests.cs | 2 +- .../Tests/Editor/Timing/TimingTestHelper.cs | 2 +- .../Tests/Editor/Transports/BatchedReceiveQueueTests.cs | 2 +- .../Tests/Editor/Transports/BatchedSendQueueTests.cs | 2 +- .../Tests/Editor/Transports/UNetTransportTests.cs | 2 +- .../Tests/Editor/Transports/UnityTransportTests.cs | 2 +- com.unity.netcode.gameobjects/Tests/Editor/XXHashTests.cs | 2 +- .../Tests/Editor/com.unity.netcode.editortests.asmdef | 6 +++--- testproject/Assets/Scripts/testproject.asmdef | 2 +- .../Assets/Tests/Editor/testproject.editortests.asmdef | 2 +- .../testproject.multiprocesstests.asmdef | 2 +- 64 files changed, 78 insertions(+), 78 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs index dca734793c..6d73d4467b 100644 --- a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs +++ b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs @@ -1,15 +1,15 @@ using System.Runtime.CompilerServices; #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.Editor")] -[assembly: InternalsVisibleTo("Unity.Netcode.Editor.CodeGen")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor.CodeGen")] #endif // UNITY_EDITOR #if UNITY_INCLUDE_TESTS [assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")] [assembly: InternalsVisibleTo("TestProject.RuntimeTests")] #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.EditorTests")] [assembly: InternalsVisibleTo("TestProject.EditorTests")] #endif // UNITY_EDITOR #endif // UNITY_INCLUDE_TESTS diff --git a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs index f3fd38bc17..c401898b66 100644 --- a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs +++ b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs @@ -2,6 +2,6 @@ #if UNITY_INCLUDE_TESTS #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.EditorTests")] #endif // UNITY_EDITOR #endif // UNITY_INCLUDE_TESTS diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs index 0f28e01783..8cd8752c40 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs @@ -12,7 +12,7 @@ using UnityEngine; using Object = System.Object; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal static class CodeGenHelpers { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs index 0f7149cdc1..6307de653e 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs @@ -10,7 +10,7 @@ using ILPPInterface = Unity.CompilationPipeline.Common.ILPostProcessing.ILPostProcessor; using MethodAttributes = Mono.Cecil.MethodAttributes; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal sealed class INetworkMessageILPP : ILPPInterface { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkSerializableILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkSerializableILPP.cs index abfc9a26ae..c4123d5b88 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkSerializableILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/INetworkSerializableILPP.cs @@ -8,7 +8,7 @@ using Unity.CompilationPipeline.Common.ILPostProcessing; using ILPPInterface = Unity.CompilationPipeline.Common.ILPostProcessing.ILPostProcessor; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal sealed class INetworkSerializableILPP : ILPPInterface { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index baac903d31..400c6f437a 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -13,7 +13,7 @@ using MethodAttributes = Mono.Cecil.MethodAttributes; using ParameterAttributes = Mono.Cecil.ParameterAttributes; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal sealed class NetworkBehaviourILPP : ILPPInterface { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorAssemblyResolver.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorAssemblyResolver.cs index 4adbbfd8ed..369fb04097 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorAssemblyResolver.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorAssemblyResolver.cs @@ -6,7 +6,7 @@ using Mono.Cecil; using Unity.CompilationPipeline.Common.ILPostProcessing; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal class PostProcessorAssemblyResolver : IAssemblyResolver { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporter.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporter.cs index f96ba3396c..7c904750f5 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporter.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporter.cs @@ -2,7 +2,7 @@ using System.Reflection; using Mono.Cecil; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal class PostProcessorReflectionImporter : DefaultReflectionImporter { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporterProvider.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporterProvider.cs index 81f80f04ed..1f7e41c3c8 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporterProvider.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/PostProcessorReflectionImporterProvider.cs @@ -1,6 +1,6 @@ using Mono.Cecil; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal class PostProcessorReflectionImporterProvider : IReflectionImporterProvider { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/RuntimeAccessModifiersILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/RuntimeAccessModifiersILPP.cs index 0d9d2d0230..1536f23571 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/RuntimeAccessModifiersILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/RuntimeAccessModifiersILPP.cs @@ -6,7 +6,7 @@ using Unity.CompilationPipeline.Common.ILPostProcessing; using ILPPInterface = Unity.CompilationPipeline.Common.ILPostProcessing.ILPostProcessor; -namespace Unity.Netcode.Editor.CodeGen +namespace Unity.Netcode.GameObjects.Editor.CodeGen { internal sealed class RuntimeAccessModifiersILPP : ILPPInterface { diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef b/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef index 690cd4bf5e..d30fe67e24 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/com.unity.netcode.editor.codegen.asmdef @@ -1,6 +1,6 @@ { - "name": "Unity.Netcode.Editor.CodeGen", - "rootNamespace": "Unity.Netcode.Editor.CodeGen", + "name": "Unity.Netcode.GameObjects.Editor.CodeGen", + "rootNamespace": "Unity.Netcode.GameObjects.Editor.CodeGen", "references": [ "Unity.Netcode.Runtime", "Unity.Collections" diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsSettings.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsSettings.cs index a057d1e69f..d0a44e688b 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsSettings.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsSettings.cs @@ -3,7 +3,7 @@ using UnityEngine.Serialization; -namespace Unity.Netcode.Editor.Configuration +namespace Unity.Netcode.GameObjects.Editor.Configuration { internal class NetcodeForGameObjectsEditorSettings { diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs index 08bbda7871..69d426200e 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs @@ -1,7 +1,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor.Configuration +namespace Unity.Netcode.GameObjects.Editor.Configuration { internal static class NetcodeSettingsProvider { diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs index 631cee1fae..98d26beb1f 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs @@ -2,7 +2,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor.Configuration +namespace Unity.Netcode.GameObjects.Editor.Configuration { /// /// Updates the default instance when prefabs are updated (created, moved, deleted) in the project. diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabsEditor.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabsEditor.cs index 0845068be7..5864270e4c 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabsEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabsEditor.cs @@ -2,7 +2,7 @@ using UnityEditorInternal; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { [CustomEditor(typeof(NetworkPrefabsList), true)] [CanEditMultipleObjects] diff --git a/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs b/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs index 8e885ead97..b1faa5e527 100644 --- a/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/HiddenScriptEditor.cs @@ -6,7 +6,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { /// /// Internal use. Hides the script field for the given component. diff --git a/com.unity.netcode.gameobjects/Editor/NetworkBehaviourEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkBehaviourEditor.cs index 239d107008..48d9ae0b63 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkBehaviourEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkBehaviourEditor.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; using System.Reflection; -using Unity.Netcode.Editor.Configuration; +using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { /// /// The for diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs index e4acb69ecc..cd4ea143e0 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; using System.IO; -using Unity.Netcode.Editor.Configuration; +using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { /// /// This handles the translation between the and diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs index 19643d40bd..94876ebfbc 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; using System.Linq; -using Unity.Netcode.Editor.Configuration; +using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { #if UNITY_EDITOR /// diff --git a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs index 1b582f88e2..216299cc3a 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs @@ -2,7 +2,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { /// /// The for diff --git a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs index 6a5be7845b..8f2f8a2e1e 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs @@ -2,7 +2,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor +namespace Unity.Netcode.GameObjects.Editor { /// /// The for diff --git a/com.unity.netcode.gameobjects/Editor/PackageChecker/UTPAdapterChecker.cs b/com.unity.netcode.gameobjects/Editor/PackageChecker/UTPAdapterChecker.cs index 0d109a0115..8f6ffd67a6 100644 --- a/com.unity.netcode.gameobjects/Editor/PackageChecker/UTPAdapterChecker.cs +++ b/com.unity.netcode.gameobjects/Editor/PackageChecker/UTPAdapterChecker.cs @@ -5,7 +5,7 @@ using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; -namespace Unity.Netcode.Editor.PackageChecker +namespace Unity.Netcode.GameObjects.Editor.PackageChecker { [InitializeOnLoad] internal class UTPAdapterChecker diff --git a/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef b/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef index 8f860578a1..6d4dc94855 100644 --- a/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef +++ b/com.unity.netcode.gameobjects/Editor/PackageChecker/com.unity.netcode.editor.packagechecker.asmdef @@ -1,6 +1,6 @@ { - "name": "Unity.Netcode.Editor.PackageChecker", - "rootNamespace": "Unity.Netcode.Editor.PackageChecker", + "name": "Unity.Netcode.GameObjects.Editor.PackageChecker", + "rootNamespace": "Unity.Netcode.GameObjects.Editor.PackageChecker", "includePlatforms": [ "Editor" ], diff --git a/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef b/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef index 29b759dc49..9ae2d86cb0 100644 --- a/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef +++ b/com.unity.netcode.gameobjects/Editor/com.unity.netcode.editor.asmdef @@ -1,6 +1,6 @@ { - "name": "Unity.Netcode.Editor", - "rootNamespace": "Unity.Netcode.Editor", + "name": "Unity.Netcode.GameObjects.Editor", + "rootNamespace": "Unity.Netcode.GameObjects.Editor", "references": [ "Unity.Netcode.Runtime", "Unity.Netcode.Components" diff --git a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs index 82e95f556e..d7c923668c 100644 --- a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs +++ b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs @@ -1,8 +1,8 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Unity.Netcode.Components")] #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.Editor")] -[assembly: InternalsVisibleTo("Unity.Netcode.Editor.CodeGen")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor.CodeGen")] #endif // UNITY_EDITOR #if MULTIPLAYER_TOOLS [assembly: InternalsVisibleTo("Unity.Multiplayer.Tools.Adapters.Ngo1WithUtp2")] @@ -16,7 +16,7 @@ [assembly: InternalsVisibleTo("Unity.Netcode.TestHelpers.Runtime")] [assembly: InternalsVisibleTo("TestProject.RuntimeTests")] #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.EditorTests")] [assembly: InternalsVisibleTo("TestProject.EditorTests")] #endif // UNITY_EDITOR #if MULTIPLAYER_TOOLS diff --git a/com.unity.netcode.gameobjects/Tests/Editor/ArithmeticTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/ArithmeticTests.cs index 45baf5a1c4..42ba56fa13 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/ArithmeticTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/ArithmeticTests.cs @@ -1,6 +1,6 @@ using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class ArithmeticTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Build/BuildTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Build/BuildTests.cs index c8cde89618..513e28fb44 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Build/BuildTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Build/BuildTests.cs @@ -5,7 +5,7 @@ using UnityEditor.Build.Reporting; using UnityEngine; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BuildTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/DisconnectMessageTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/DisconnectMessageTests.cs index 644ed70bbd..cbc1d5f846 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/DisconnectMessageTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/DisconnectMessageTests.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Unity.Collections; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class DisconnectMessageTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index 224a25e0f8..a135975ff0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -1,7 +1,7 @@ using System; using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class InterpolatorTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/DisconnectOnSendTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/DisconnectOnSendTests.cs index 9fbf55abd3..e7da47d90d 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/DisconnectOnSendTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/DisconnectOnSendTests.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class DisconnectOnSendTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageCorruptionTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageCorruptionTests.cs index 96544ac4a3..d87a7372a9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageCorruptionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageCorruptionTests.cs @@ -8,7 +8,7 @@ using UnityEngine; using UnityEngine.TestTools; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class MessageCorruptionTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageReceivingTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageReceivingTests.cs index 1a9b3f644b..66b5b4fdf9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageReceivingTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageReceivingTests.cs @@ -5,7 +5,7 @@ using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class MessageReceivingTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageRegistrationTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageRegistrationTests.cs index bb7ab651d7..cf01393688 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageRegistrationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageRegistrationTests.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class MessageRegistrationTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageSendingTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageSendingTests.cs index 75b33c2fa5..47d513602e 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageSendingTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageSendingTests.cs @@ -8,7 +8,7 @@ using UnityEngine.TestTools; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class MessageSendingTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageVersioningTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageVersioningTests.cs index d19c882476..ccd318edd9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageVersioningTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageVersioningTests.cs @@ -3,7 +3,7 @@ using NUnit.Framework; using NUnit.Framework.Internal; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class MessageVersioningTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/NopMessageSender.cs b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/NopMessageSender.cs index 3f5a35b3a3..a22d4c7375 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Messaging/NopMessageSender.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Messaging/NopMessageSender.cs @@ -1,4 +1,4 @@ -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { internal class NopMessageSender : INetworkMessageSender { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs index e962c86eb7..617c613bc0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Metrics/NetworkMetricsRegistrationTests.cs @@ -6,7 +6,7 @@ using Unity.Multiplayer.Tools.MetricTypes; using Unity.Multiplayer.Tools.NetStats; -namespace Unity.Netcode.EditorTests.Metrics +namespace Unity.Netcode.GameObjects.EditorTests.Metrics { public class NetworkMetricsRegistrationTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs index 395aa79d95..875c17c1cd 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkBehaviourTests.cs @@ -2,7 +2,7 @@ using UnityEngine; using Object = UnityEngine.Object; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class NetworkBehaviourTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerConfigurationTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerConfigurationTests.cs index 82668c5744..49ec81af90 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerConfigurationTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerConfigurationTests.cs @@ -1,13 +1,13 @@ using System.Collections.Generic; using NUnit.Framework; -using Unity.Netcode.Editor; +using Unity.Netcode.GameObjects.Editor; using Unity.Netcode.Transports.UTP; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestTools; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class NetworkManagerConfigurationTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs index cb14dbf79f..5cb1e74dc0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs @@ -3,7 +3,7 @@ using UnityEngine; using UnityEngine.TestTools; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class NetworkObjectTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs index 275a83d70d..641b0681ff 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs @@ -1,9 +1,9 @@ using NUnit.Framework; -using Unity.Netcode.Editor.Configuration; +using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class NetworkPrefabProcessorTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkVar/NetworkVarTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkVar/NetworkVarTests.cs index e871b23315..515f0dab50 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkVar/NetworkVarTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkVar/NetworkVarTests.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using UnityEngine; -namespace Unity.Netcode.EditorTests.NetworkVar +namespace Unity.Netcode.GameObjects.EditorTests.NetworkVar { public class NetworkVarTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BaseFastBufferReaderWriterTest.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BaseFastBufferReaderWriterTest.cs index 0f0229b197..84ba03929c 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BaseFastBufferReaderWriterTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BaseFastBufferReaderWriterTest.cs @@ -3,7 +3,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public abstract class BaseFastBufferReaderWriterTest { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitCounterTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitCounterTests.cs index 5e0f4c8a12..d3f6021358 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitCounterTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitCounterTests.cs @@ -1,6 +1,6 @@ using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BitCounterTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitReaderTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitReaderTests.cs index b6e4ef5ff9..a73ec7eff7 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitReaderTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitReaderTests.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Unity.Collections; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BitReaderTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitWriterTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitWriterTests.cs index f35f725250..e8d29b9471 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitWriterTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BitWriterTests.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Unity.Collections; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BitWriterTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BufferSerializerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BufferSerializerTests.cs index c36d738887..1e9d4425b0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BufferSerializerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BufferSerializerTests.cs @@ -3,7 +3,7 @@ using Unity.Collections; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BufferSerializerTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BytePackerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BytePackerTests.cs index 99e8582fba..08870c4124 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BytePackerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/BytePackerTests.cs @@ -6,7 +6,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BytePackerTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferReaderTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferReaderTests.cs index e1dcbbaee8..175029553b 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferReaderTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferReaderTests.cs @@ -5,7 +5,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class FastBufferReaderTests : BaseFastBufferReaderWriterTest { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferWriterTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferWriterTests.cs index ac924c938e..98451cfe10 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferWriterTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/FastBufferWriterTests.cs @@ -5,7 +5,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class FastBufferWriterTests : BaseFastBufferReaderWriterTest { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/UserBitReaderAndBitWriterTests_NCCBUG175.cs b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/UserBitReaderAndBitWriterTests_NCCBUG175.cs index 5db3db1639..031092ff3d 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Serialization/UserBitReaderAndBitWriterTests_NCCBUG175.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Serialization/UserBitReaderAndBitWriterTests_NCCBUG175.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Unity.Collections; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class UserBitReaderAndBitWriterTests_NCCBUG175 { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Timing/ClientNetworkTimeSystemTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Timing/ClientNetworkTimeSystemTests.cs index 8913ebc74a..ec5e1df03e 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Timing/ClientNetworkTimeSystemTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Timing/ClientNetworkTimeSystemTests.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using UnityEngine; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { /// /// Tests for running a as a client. diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs index be53a0df7f..327bc531e2 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs @@ -5,7 +5,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class NetworkTimeTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Timing/ServerNetworkTimeSystemTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Timing/ServerNetworkTimeSystemTests.cs index ea5fe00701..8fdfd5c822 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Timing/ServerNetworkTimeSystemTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Timing/ServerNetworkTimeSystemTests.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using UnityEngine; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class ServerNetworkTimeSystemTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Timing/TimingTestHelper.cs b/com.unity.netcode.gameobjects/Tests/Editor/Timing/TimingTestHelper.cs index 16c840ded1..be76e5d2b8 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Timing/TimingTestHelper.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Timing/TimingTestHelper.cs @@ -2,7 +2,7 @@ using UnityEngine; using Random = System.Random; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { /// /// Helper functions for timing related tests. Allows to get a set of time steps and simulate time advancing without the need of a full playmode test. diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedReceiveQueueTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedReceiveQueueTests.cs index 5470f21656..d9a0b2dba2 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedReceiveQueueTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedReceiveQueueTests.cs @@ -4,7 +4,7 @@ using Unity.Netcode.Transports.UTP; using Unity.Networking.Transport; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BatchedReceiveQueueTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs index 3438c60c1c..238cddb484 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs @@ -4,7 +4,7 @@ using Unity.Netcode.Transports.UTP; using Unity.Networking.Transport; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class BatchedSendQueueTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UNetTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UNetTransportTests.cs index f8d7a46cd4..94d01b4a6f 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UNetTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UNetTransportTests.cs @@ -5,7 +5,7 @@ using UnityEngine; using UnityEngine.TestTools; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class UNetTransportTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs index 95f57f2f1b..437c537ca2 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs @@ -3,7 +3,7 @@ using UnityEngine; using UnityEngine.TestTools; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class UnityTransportTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/XXHashTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/XXHashTests.cs index 342a3739d0..3206257b4e 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/XXHashTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/XXHashTests.cs @@ -1,6 +1,6 @@ using NUnit.Framework; -namespace Unity.Netcode.EditorTests +namespace Unity.Netcode.GameObjects.EditorTests { public class XXHashTests { diff --git a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef index 56d2377536..ad73cebe5d 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef @@ -1,10 +1,10 @@ { - "name": "Unity.Netcode.EditorTests", - "rootNamespace": "Unity.Netcode.EditorTests", + "name": "Unity.Netcode.GameObjects.EditorTests", + "rootNamespace": "Unity.Netcode.GameObjects.EditorTests", "references": [ "Unity.Collections", "Unity.Netcode.Runtime", - "Unity.Netcode.Editor", + "Unity.Netcode.GameObjects.Editor", "Unity.Netcode.Components", "Unity.Multiplayer.MetricTypes", "Unity.Multiplayer.NetStats", diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 391e453cb9..1044e087a3 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -3,7 +3,7 @@ "rootNamespace": "", "references": [ "Unity.Netcode.Runtime", - "Unity.Netcode.Editor", + "Unity.Netcode.GameObjects.Editor", "Unity.Netcode.Components", "Unity.Netcode.Adapter.UTP", "Unity.Services.Authentication", diff --git a/testproject/Assets/Tests/Editor/testproject.editortests.asmdef b/testproject/Assets/Tests/Editor/testproject.editortests.asmdef index 9495d3cc11..58202fbe01 100644 --- a/testproject/Assets/Tests/Editor/testproject.editortests.asmdef +++ b/testproject/Assets/Tests/Editor/testproject.editortests.asmdef @@ -3,7 +3,7 @@ "rootNamespace": "TestProject.EditorTests", "references": [ "Unity.Netcode.Runtime", - "Unity.Netcode.Editor" + "Unity.Netcode.GameObjects.Editor" ], "optionalUnityReferences": [ "TestAssemblies" diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/testproject.multiprocesstests.asmdef b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/testproject.multiprocesstests.asmdef index 40dcb7e30c..8efc923104 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/testproject.multiprocesstests.asmdef +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/testproject.multiprocesstests.asmdef @@ -4,7 +4,7 @@ "references": [ "Unity.Netcode.Runtime", "TestProject", - "Unity.Netcode.Editor", + "Unity.Netcode.GameObjects.Editor", "Unity.Netcode.Components", "ScriptsForAutomatedTesting", "Unity.PerformanceTesting", From 2eeb2c7a2f199fbbc561dccce5727f15206c2079 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sun, 7 Dec 2025 15:43:59 -0600 Subject: [PATCH 02/99] update - wip This is a "still messy" version that is working but needs more thought on the namespace collision fixes. --- com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs | 2 ++ .../Editor/Configuration/NetcodeSettingsProvider.cs | 1 + .../Editor/Configuration/NetworkPrefabProcessor.cs | 1 + .../Editor/NetworkManagerEditor.cs | 1 + .../Editor/NetworkManagerHelper.cs | 2 ++ .../Editor/NetworkTransformEditor.cs | 1 + com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs | 2 +- .../Tests/Editor/NetworkObjectTests.cs | 2 +- .../Tests/Editor/NetworkPrefabProcessorTests.cs | 1 + .../Tests/Editor/Unity.Netcode.Editor.Tests.asmdef | 11 ++++++----- 10 files changed, 17 insertions(+), 7 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs index 450bce9552..6dd01c138e 100644 --- a/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs +++ b/com.unity.netcode.gameobjects/Editor/AssemblyInfo.cs @@ -2,7 +2,9 @@ #if UNITY_INCLUDE_TESTS #if UNITY_EDITOR +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor.Tests")] [assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.EditorTests")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor")] [assembly: InternalsVisibleTo("Unity.Netcode.Editor.Tests")] [assembly: InternalsVisibleTo("TestProject.Runtime.Tests")] #endif // UNITY_EDITOR diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs index a8b521117c..826a5d58de 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using Unity.Netcode.Editor.Configuration; using UnityEditor; using UnityEngine; using Directory = UnityEngine.Windows.Directory; diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs index cab11b3be1..99f6b33c4b 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Unity.Netcode.Editor.Configuration; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs index e2b443cedf..5f04506eec 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using Unity.Netcode.Editor; using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs index 1e0ed93932..3a8729a7cf 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerHelper.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; using System.Linq; +using Unity.Netcode.Editor; +using Unity.Netcode.Editor.Configuration; using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs index caa4540a3a..9f79b51f26 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs @@ -1,4 +1,5 @@ using Unity.Netcode.Components; +using Unity.Netcode.Editor; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs index 2cd1277033..0468e67d0e 100644 --- a/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs +++ b/com.unity.netcode.gameobjects/Runtime/AssemblyInfo.cs @@ -14,7 +14,7 @@ [assembly: InternalsVisibleTo("Unity.Netcode.TestHelpers.Runtime")] [assembly: InternalsVisibleTo("TestProject.Runtime.Tests")] #if UNITY_EDITOR -[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.EditorTests")] +[assembly: InternalsVisibleTo("Unity.Netcode.GameObjects.Editor.Tests")] [assembly: InternalsVisibleTo("TestProject.EditorTests")] [assembly: InternalsVisibleTo("Unity.Netcode.Editor.Tests")] [assembly: InternalsVisibleTo("TestProject.Editor.Tests")] diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs index c1e44bfcbb..a889fee831 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkObjectTests.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; using NUnit.Framework; -using Unity.Netcode.Editor; +using Unity.Netcode.GameObjects.Editor; using UnityEngine; using UnityEngine.TestTools; diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs index 0cd1ae134f..6d6bf1d6cf 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs @@ -1,4 +1,5 @@ using NUnit.Framework; +using Unity.Netcode.Editor.Configuration; using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef b/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef index 85c9842bed..20be2d58f0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Editor/Unity.Netcode.Editor.Tests.asmdef @@ -1,5 +1,5 @@ { - "name": "Unity.Netcode.Editor.Tests", + "name": "Unity.Netcode.GameObjects.Editor.Tests", "rootNamespace": "Unity.Netcode.GameObjects.EditorTests", "references": [ "Unity.Collections", @@ -13,7 +13,8 @@ "Unity.Mathematics", "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "Unity.Netcode.Runtime.Tests" + "Unity.Netcode.Runtime.Tests", + "Unity.Netcode.GameObjects.Editor" ], "includePlatforms": [ "Editor" @@ -45,9 +46,9 @@ "define": "SCENE_MANAGEMENT_SCENE_HANDLE_NO_INT_CONVERSION" }, { - "name": "Unity", - "expression": "6000.5.0a1", - "define": "SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG" + "name": "Unity", + "expression": "6000.5.0a1", + "define": "SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG" } ], "noEngineReferences": false From fb7d11a8aa7802814f2b49e8079c21613fcd17cb Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 10 Dec 2025 17:59:44 -0600 Subject: [PATCH 03/99] update Some additions and modifications to finalize the hybrid prefab concept. --- .../Runtime/Components/NetworkObjectBridge.cs | 31 +++ .../Components/NetworkObjectBridge.cs.meta | 2 + .../Runtime/Core/NetworkObject.cs | 177 +++++++++++++++++- .../IDeferredNetworkMessageManager.cs | 3 + .../Messaging/Messages/CreateObjectMessage.cs | 11 ++ .../Runtime/Spawning/NetworkSpawnManager.cs | 78 ++++++-- .../Runtime/Unity.Netcode.Runtime.asmdef | 9 +- 7 files changed, 293 insertions(+), 18 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs new file mode 100644 index 0000000000..d70902ab07 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs @@ -0,0 +1,31 @@ +#if UNIFIED_NETCODE +using System; +using Unity.NetCode; + +namespace Unity.Netcode +{ + // Temporarily making this public + // TODO: Make this internal when complete (if used) + public partial class NetworkObjectBridge : GhostBehaviour + { + public Action NetworkObjectIdChanged; + + internal GhostField NetworkObjectId = new GhostField(); + + public void SetNetworkObjectId(ulong value) + { + NetworkObjectId.Value = value; + } + public override void Awake() + { + base.Awake(); + NetworkObjectId.ValueChanged += OnNetworkObjectIdChanged; + } + + private void OnNetworkObjectIdChanged(ulong value) + { + NetworkObjectIdChanged?.Invoke(value); + } + } +} +#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta new file mode 100644 index 0000000000..830a7b71d8 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 510c5bb08d2f5724e85aa4fb66a8a4ff \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 953781d008..2499daafba 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -5,6 +5,10 @@ using System.Text; using Unity.Netcode.Components; using Unity.Netcode.Runtime; +#if UNIFIED_NETCODE +using Unity.NetCode; +#endif + #if UNITY_EDITOR using UnityEditor; #if UNITY_2021_2_OR_NEWER @@ -243,6 +247,10 @@ private static void CheckPrefabStage(PrefabStage prefabStage) /// internal void OnValidate() { +#if UNIFIED_NETCODE + UnifiedValidation(); +#endif + // Always exit early if we are in prefab edit mode and this instance is the // prefab instance within the InContext or InIsolation edit scene. if (s_PrefabInstance == this) @@ -338,6 +346,27 @@ private void CheckForInScenePlaced() } #endif // UNITY_EDITOR +#if UNIFIED_NETCODE + [HideInInspector] + [SerializeField] + internal GhostAdapter GhostAdapter; + + [HideInInspector] + [SerializeField] + internal bool HasGhost; + + private void UnifiedValidation() + { + NetworkObjectBridge = GetComponent(); + GhostAdapter = GetComponent(); + HasGhost = GhostAdapter != null; + if (HasGhost && NetworkObjectBridge == null) + { + NetworkObjectBridge = gameObject.AddComponent(); + } + } +#endif + internal bool HasParentNetworkObject(Transform transform) { if (transform.parent != null) @@ -2836,6 +2865,10 @@ internal struct SceneObject public ulong OwnerClientId; public ushort OwnershipFlags; +#if UNIFIED_NETCODE + public int GhostId; +#endif + public bool IsPlayerObject { get => ByteUtility.GetBit(m_BitField, 0); @@ -2911,6 +2944,14 @@ public bool HasInstantiationData set => ByteUtility.SetBit(ref m_BitField, 11, value); } +#if UNIFIED_NETCODE + public bool HasGhost + { + get => ByteUtility.GetBit(m_BitField, 12); + set => ByteUtility.SetBit(ref m_BitField, 12, value); + } +#endif + // When handling the initial synchronization of NetworkObjects, // this will be populated with the known observers. public ulong[] Observers; @@ -3000,6 +3041,13 @@ public void Serialize(FastBufferWriter writer) writer.WriteValue(OwnerObject.GetSceneOriginHandle()); } +#if UNIFIED_NETCODE + if (HasGhost) + { + writer.WriteValueSafe(GhostId); + } +#endif + // write placeholder for serialized data size. // Can't be bitpacked because we don't know the value until we calculate it later var positionBeforeSynchronizing = writer.Position; @@ -3079,6 +3127,13 @@ public void Deserialize(FastBufferReader reader) // scene handle that the NetworkObject resides in. reader.ReadValue(out NetworkSceneHandle); +#if UNIFIED_NETCODE + if (HasGhost) + { + reader.ReadValueSafe(out GhostId); + } +#endif + // Read the size of the remaining synchronization data // This data will be read in AddSceneObject() reader.ReadValueSafe(out SynchronizationDataSize); @@ -3175,7 +3230,11 @@ internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager Hash = CheckForGlobalObjectIdHashOverride(), OwnerObject = this, TargetClientId = targetClientId, - HasInstantiationData = InstantiationData != null && InstantiationData.Length > 0 + HasInstantiationData = InstantiationData != null && InstantiationData.Length > 0, +#if UNIFIED_NETCODE + HasGhost = HasGhost, + GhostId = HasGhost ? GhostInstance.ghostId : 0, +#endif }; // Handle Parenting @@ -3248,11 +3307,9 @@ internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBuf reader.ReadValueSafe(out instantiationData); } - // Attempt to create a local NetworkObject var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(sceneObject, instantiationData); - if (networkObject == null) { // Log the error that the NetworkObject failed to construct @@ -3490,7 +3547,121 @@ private void Awake() #endif SetCachedParent(transform.parent); SceneOrigin = gameObject.scene; +#if UNIFIED_NETCODE + InitGhost(); +#endif + + } + + private void OnEnable() + { + Debug.Log("Enabled!"); + } + + private void OnDisable() + { + Debug.Log("Disabled!"); + } + +#if UNIFIED_NETCODE + + private void Start() + { + enabled = true; } + internal GhostInstance GhostInstance; + [SerializeField] + [HideInInspector] + internal NetworkObjectBridge NetworkObjectBridge; + + private void InitGhost() + { + enabled = true; + // All instances with Ghosts are automatically registered + if (HasGhost && NetworkObjectBridge) + { + Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); + NetworkObjectBridge.NetworkObjectIdChanged += OnNetworkObjectIdChanged; + if (NetworkObjectBridge.NetworkObjectId.Value != 0) + { + RegisterGhostBridge(); + } + //var networkObjectRegistration = (false, (ulong)0); + //NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId); + //try + //{ + // networkObjectRegistration = GhostAdapter.GetNetworkObjectId(); + //} + //catch (Exception ex) + //{ + // Debug.LogException(ex); + //} + + //if (networkObjectRegistration.Item1) + //{ + // // Authority and Non-Authority: + // // Upon instantiation it will always register itself as a Ghost that is pending NGO spawn. + + // // Non-Authority: + // // - If registered prior to the CreateObjectMessage, then upon receiving the CreateObjectMessag it will be processed immediately using this instance. + // // - If registered after receiving the CreateObjectMessage, then upon registering it will also process any deferred CreateObjectMessages + // // If this happens prior to receiving the is received, + // // Authority: + // // Upon spawning locally, this entry is removed from the ghost pending spawn table. + + + + //} + //else if (!NetworkManager.IsServer) + //{ + // StartCoroutine(WaitForGhostData()); + //} + //else + //{ + // Debug.LogError($"[{name}] Failed to get ghost instance or GhostId is zero!"); + //} + } + } + + private void RegisterGhostBridge() + { + Debug.Log($"[{nameof(NetworkObject)}][{nameof(NetworkObjectId)}] NetworkObjectBridge notified instance exists with assigned ID of: {NetworkObjectBridge.NetworkObjectId.Value}"); + NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); + } + + private void OnNetworkObjectIdChanged(ulong networkObjectId) + { + RegisterGhostBridge(); + } + + //private System.Collections.IEnumerator WaitForGhostData() + //{ + // var waitPeriod = new WaitForSeconds(0.1f); + // var timeout = Time.realtimeSinceStartup + 5.0f; + // while (timeout > Time.realtimeSinceStartup) + // { + // enabled = true; + // var networkObjectRegistration = (false, (ulong)0); + // try + // { + // networkObjectRegistration = GhostAdapter.GetNetworkObjectId(); + // } + // catch (Exception ex) + // { + // Debug.LogException(ex); + // } + // if (networkObjectRegistration.Item1) + // { + // NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, networkObjectRegistration.Item2); + // yield break; + // } + // yield return waitPeriod; + // } + + // Debug.Log("Timed out waiting for Ghost to be registered!"); + + //} +#endif /// /// Update diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/IDeferredNetworkMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/IDeferredNetworkMessageManager.cs index 0f55de95c2..82bfdc3c38 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/IDeferredNetworkMessageManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/IDeferredNetworkMessageManager.cs @@ -8,6 +8,9 @@ internal enum TriggerType OnSpawn, OnAddPrefab, OnNextFrame, +#if UNIFIED_NETCODE + OnGhostSpawned, +#endif } /// diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 4ced00b51c..73d31aedbb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -120,6 +120,17 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int ByteUnpacker.ReadValuePacked(reader, out NetworkObjectId); } +#if UNIFIED_NETCODE + UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); + // For now, we will defer the create object message until the associated Ghost is spawned + if (ObjectInfo.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(ObjectInfo.NetworkObjectId)) + { + UnityEngine.Debug.Log($"Deferring {nameof(CreateObjectMessage)} to wait for Ghost."); + networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, (ulong)ObjectInfo.GhostId, reader, ref context, k_Name); + return false; + } +#endif + if (!networkManager.NetworkConfig.ForceSamePrefabs && !networkManager.SpawnManager.HasPrefab(ObjectInfo)) { networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnAddPrefab, ObjectInfo.Hash, reader, ref context, k_Name); diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 14ea2bc41d..2ec1fbdd56 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -30,6 +30,30 @@ public class NetworkSpawnManager /// public readonly HashSet SpawnedObjectsList = new HashSet(); +#if UNIFIED_NETCODE + + internal readonly Dictionary GhostsPendingSpawn = new Dictionary(); + + public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) + { + Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); + GhostsPendingSpawn.TryAdd(networkObjectId, networkObject); + NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, (ulong)networkObject.GhostInstance.ghostId); + } + + internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) + { + if (!GhostsPendingSpawn.ContainsKey(networkObjectId)) + { + Debug.LogError($"[{nameof(GetGhostNetworkObjectForSpawn)}] Attempting to spawn NetworkObject-{networkObjectId} with no instance to spawn!"); + return null; + } + var networkObject = GhostsPendingSpawn[networkObjectId]; + GhostsPendingSpawn.Remove(networkObjectId); + return networkObject; + } +#endif + /// /// Use to get all NetworkObjects owned by a client /// Ownership to Objects Table Format: @@ -901,27 +925,45 @@ internal NetworkObject CreateLocalNetworkObject(NetworkObject.SceneObject sceneO var parentNetworkId = sceneObject.HasParent ? sceneObject.ParentObjectId : default; var worldPositionStays = (!sceneObject.HasParent) || sceneObject.WorldPositionStays; - // If scene management is disabled or the NetworkObject was dynamically spawned - if (!NetworkManager.NetworkConfig.EnableSceneManagement || !sceneObject.IsSceneObject) +#if UNIFIED_NETCODE + if (sceneObject.HasGhost) { - networkObject = GetNetworkObjectToSpawn(sceneObject.Hash, sceneObject.OwnerClientId, position, rotation, sceneObject.IsSceneObject, instantiationData); + // TODO-UNIFIED: Get this working somehow (or if not possible prevent this from happening prior to getting to this point) + if (sceneObject.HasInstantiationData) + { + Debug.LogError($"[{nameof(NetworkObject)}] Pre-spawn instantiation data does not work in this version!"); + } + networkObject = GetGhostNetworkObjectForSpawn(sceneObject.NetworkObjectId); + if (networkObject == null) + { + + } } - else // Get the in-scene placed NetworkObject + else +#endif { - networkObject = NetworkManager.SceneManager.GetSceneRelativeInSceneNetworkObject(globalObjectIdHash, sceneObject.NetworkSceneHandle); - if (networkObject == null) + // If scene management is disabled or the NetworkObject was dynamically spawned + if (!NetworkManager.NetworkConfig.EnableSceneManagement || !sceneObject.IsSceneObject) { - if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + networkObject = GetNetworkObjectToSpawn(sceneObject.Hash, sceneObject.OwnerClientId, position, rotation, sceneObject.IsSceneObject, instantiationData); + } + else // Get the in-scene placed NetworkObject + { + networkObject = NetworkManager.SceneManager.GetSceneRelativeInSceneNetworkObject(globalObjectIdHash, sceneObject.NetworkSceneHandle); + if (networkObject == null) { - NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {globalObjectIdHash}!"); + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {globalObjectIdHash}!"); + } } - } - // Since this NetworkObject is an in-scene placed NetworkObject, if it is disabled then enable it so - // NetworkBehaviours will have their OnNetworkSpawn method invoked - if (networkObject != null && !networkObject.gameObject.activeInHierarchy) - { - networkObject.gameObject.SetActive(true); + // Since this NetworkObject is an in-scene placed NetworkObject, if it is disabled then enable it so + // NetworkBehaviours will have their OnNetworkSpawn method invoked + if (networkObject != null && !networkObject.gameObject.activeInHierarchy) + { + networkObject.gameObject.SetActive(true); + } } } @@ -1092,6 +1134,14 @@ internal void AuthorityLocalSpawn([NotNull] NetworkObject networkObject, ulong n SpawnNetworkObjectLocallyCommon(networkObject, networkId, sceneObject, playerObject, ownerClientId, destroyWithScene); +#if UNIFIED_NETCODE + if (networkObject.HasGhost) + { + networkObject.NetworkObjectBridge.NetworkObjectId.Value = networkObject.NetworkObjectId; + //networkObject.GhostAdapter.RegisterNetworkObjectId(networkObject.NetworkObjectId); + } +#endif + // When done spawning invoke post spawn networkObject.InvokeBehaviourNetworkPostSpawn(); diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index c43f102051..03bfa25e8d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -13,7 +13,9 @@ "Unity.Networking.Transport", "Unity.Collections", "Unity.Burst", - "Unity.Mathematics" + "Unity.Mathematics", + "Unity.NetCode", + "Unity.Entities" ], "includePlatforms": [], "excludePlatforms": [], @@ -87,6 +89,11 @@ "name": "Unity", "expression": "6000.5.0a1", "define": "SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG" + }, + { + "name": "com.unity.netcode", + "expression": "1.10.1", + "define": "UNIFIED_NETCODE" } ], "noEngineReferences": false From c15498c3b084a8374bccf1011a04894f672bec47 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 10 Dec 2025 19:43:02 -0600 Subject: [PATCH 04/99] update cleaning up some of the POC adjustments. wrapping some debug within loglevel developer. --- .../Runtime/Core/NetworkObject.cs | 107 +++--------------- .../Messaging/Messages/CreateObjectMessage.cs | 13 ++- .../Runtime/Spawning/NetworkSpawnManager.cs | 6 +- 3 files changed, 30 insertions(+), 96 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 2499daafba..18a6308a63 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -2865,10 +2865,6 @@ internal struct SceneObject public ulong OwnerClientId; public ushort OwnershipFlags; -#if UNIFIED_NETCODE - public int GhostId; -#endif - public bool IsPlayerObject { get => ByteUtility.GetBit(m_BitField, 0); @@ -3041,13 +3037,6 @@ public void Serialize(FastBufferWriter writer) writer.WriteValue(OwnerObject.GetSceneOriginHandle()); } -#if UNIFIED_NETCODE - if (HasGhost) - { - writer.WriteValueSafe(GhostId); - } -#endif - // write placeholder for serialized data size. // Can't be bitpacked because we don't know the value until we calculate it later var positionBeforeSynchronizing = writer.Position; @@ -3127,13 +3116,6 @@ public void Deserialize(FastBufferReader reader) // scene handle that the NetworkObject resides in. reader.ReadValue(out NetworkSceneHandle); -#if UNIFIED_NETCODE - if (HasGhost) - { - reader.ReadValueSafe(out GhostId); - } -#endif - // Read the size of the remaining synchronization data // This data will be read in AddSceneObject() reader.ReadValueSafe(out SynchronizationDataSize); @@ -3233,7 +3215,6 @@ internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager HasInstantiationData = InstantiationData != null && InstantiationData.Length > 0, #if UNIFIED_NETCODE HasGhost = HasGhost, - GhostId = HasGhost ? GhostInstance.ghostId : 0, #endif }; @@ -3553,15 +3534,15 @@ private void Awake() } - private void OnEnable() - { - Debug.Log("Enabled!"); - } + //private void OnEnable() + //{ + // Debug.Log("Enabled!"); + //} - private void OnDisable() - { - Debug.Log("Disabled!"); - } + //private void OnDisable() + //{ + // Debug.Log("Disabled!"); + //} #if UNIFIED_NETCODE @@ -3580,52 +3561,24 @@ private void InitGhost() // All instances with Ghosts are automatically registered if (HasGhost && NetworkObjectBridge) { - Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); + } NetworkObjectBridge.NetworkObjectIdChanged += OnNetworkObjectIdChanged; if (NetworkObjectBridge.NetworkObjectId.Value != 0) { RegisterGhostBridge(); } - //var networkObjectRegistration = (false, (ulong)0); - //NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId); - //try - //{ - // networkObjectRegistration = GhostAdapter.GetNetworkObjectId(); - //} - //catch (Exception ex) - //{ - // Debug.LogException(ex); - //} - - //if (networkObjectRegistration.Item1) - //{ - // // Authority and Non-Authority: - // // Upon instantiation it will always register itself as a Ghost that is pending NGO spawn. - - // // Non-Authority: - // // - If registered prior to the CreateObjectMessage, then upon receiving the CreateObjectMessag it will be processed immediately using this instance. - // // - If registered after receiving the CreateObjectMessage, then upon registering it will also process any deferred CreateObjectMessages - // // If this happens prior to receiving the is received, - // // Authority: - // // Upon spawning locally, this entry is removed from the ghost pending spawn table. - - - - //} - //else if (!NetworkManager.IsServer) - //{ - // StartCoroutine(WaitForGhostData()); - //} - //else - //{ - // Debug.LogError($"[{name}] Failed to get ghost instance or GhostId is zero!"); - //} } } private void RegisterGhostBridge() { - Debug.Log($"[{nameof(NetworkObject)}][{nameof(NetworkObjectId)}] NetworkObjectBridge notified instance exists with assigned ID of: {NetworkObjectBridge.NetworkObjectId.Value}"); + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(NetworkObject)}][{nameof(NetworkObjectId)}] NetworkObjectBridge notified instance exists with assigned ID of: {NetworkObjectBridge.NetworkObjectId.Value}"); + } NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); } @@ -3633,34 +3586,6 @@ private void OnNetworkObjectIdChanged(ulong networkObjectId) { RegisterGhostBridge(); } - - //private System.Collections.IEnumerator WaitForGhostData() - //{ - // var waitPeriod = new WaitForSeconds(0.1f); - // var timeout = Time.realtimeSinceStartup + 5.0f; - // while (timeout > Time.realtimeSinceStartup) - // { - // enabled = true; - // var networkObjectRegistration = (false, (ulong)0); - // try - // { - // networkObjectRegistration = GhostAdapter.GetNetworkObjectId(); - // } - // catch (Exception ex) - // { - // Debug.LogException(ex); - // } - // if (networkObjectRegistration.Item1) - // { - // NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, networkObjectRegistration.Item2); - // yield break; - // } - // yield return waitPeriod; - // } - - // Debug.Log("Timed out waiting for Ghost to be registered!"); - - //} #endif /// diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 73d31aedbb..ba4fb76ae8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -121,12 +121,19 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int } #if UNIFIED_NETCODE - UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); + if (networkManager.LogLevel == LogLevel.Developer) + { + UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); + } + // For now, we will defer the create object message until the associated Ghost is spawned if (ObjectInfo.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(ObjectInfo.NetworkObjectId)) { - UnityEngine.Debug.Log($"Deferring {nameof(CreateObjectMessage)} to wait for Ghost."); - networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, (ulong)ObjectInfo.GhostId, reader, ref context, k_Name); + if (networkManager.LogLevel == LogLevel.Developer) + { + UnityEngine.Debug.Log($"Deferring {nameof(CreateObjectMessage)} to wait for Ghost."); + } + networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, ObjectInfo.NetworkObjectId, reader, ref context, k_Name); return false; } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 2ec1fbdd56..f5d40677c8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -36,7 +36,10 @@ public class NetworkSpawnManager public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) { - Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); + } GhostsPendingSpawn.TryAdd(networkObjectId, networkObject); NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, (ulong)networkObject.GhostInstance.ghostId); } @@ -1138,7 +1141,6 @@ internal void AuthorityLocalSpawn([NotNull] NetworkObject networkObject, ulong n if (networkObject.HasGhost) { networkObject.NetworkObjectBridge.NetworkObjectId.Value = networkObject.NetworkObjectId; - //networkObject.GhostAdapter.RegisterNetworkObjectId(networkObject.NetworkObjectId); } #endif From 83e3c62ab0948bbcc6ccf6674e94408600160334 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 11 Dec 2025 16:21:52 -0600 Subject: [PATCH 05/99] update Getting unified working with the initial synchronization when scene management is enabled. --- .../Runtime/Components/NetworkObjectBridge.cs | 59 +++++++++- .../Runtime/Core/NetworkObject.cs | 3 +- .../Runtime/SceneManagement/SceneEventData.cs | 38 +++++++ .../Runtime/Spawning/NetworkSpawnManager.cs | 101 +++++++++++++++++- 4 files changed, 194 insertions(+), 7 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs index d70902ab07..9f52cbb803 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs @@ -18,14 +18,67 @@ public void SetNetworkObjectId(ulong value) } public override void Awake() { - base.Awake(); - NetworkObjectId.ValueChanged += OnNetworkObjectIdChanged; - } + if (UnifiedBootStrap.Instance != null) + { + Initialize(true); + } + else + { + UnifiedBootStrap.OnInitialized += Initialize; + } + } + + private void Initialize(bool initialized) + { + UnifiedBootStrap.OnInitialized -= Initialize; + if (gameObject != null) + { + base.Awake(); + NetworkObjectId.ValueChanged += OnNetworkObjectIdChanged; + } + } private void OnNetworkObjectIdChanged(ulong value) { NetworkObjectIdChanged?.Invoke(value); } + + internal void OnDespawn(bool shouldDestroy) + { + if (shouldDestroy) + { + UnifiedBootStrap.OnInitialized -= Initialize; + } + } + + public override void OnDestroy() + { + UnifiedBootStrap.OnInitialized -= Initialize; + base.OnDestroy(); + } + } + + internal class UnifiedBootStrap : ClientServerBootstrap + { + public static UnifiedBootStrap Instance { get; private set; } + public static Action OnInitialized; + public static ushort Port = 7979; + + public override bool Initialize(string defaultWorldName) + { + Instance = this; + AutoConnectPort = Port; + CreateDefaultClientServerWorlds(); + + var initialized = base.Initialize(defaultWorldName); + OnInitialized?.Invoke(initialized); + return initialized; + } + + ~UnifiedBootStrap() + { + Instance = null; + } } } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 18a6308a63..c90ef907f7 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3549,8 +3549,7 @@ private void Awake() private void Start() { enabled = true; - } - internal GhostInstance GhostInstance; + } [SerializeField] [HideInInspector] internal NetworkObjectBridge NetworkObjectBridge; diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 0a91e583c7..cc7c10b4ee 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -5,6 +5,7 @@ using Unity.Collections; using UnityEngine.SceneManagement; + namespace Unity.Netcode { /// @@ -1132,6 +1133,10 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) { builder.AppendLine($"[Read][Synchronize Objects][WPos: {InternalBuffer.Position}][NO-Count: {newObjectsCount}] Begin:"); } +#if UNIFIED_NETCODE + // TODO-UNIFIED: This is a temporary POC fix to handle hybrid spawning where the Ghost instance might not yet exist. + var spawnManager = m_NetworkManager.SpawnManager; +#endif for (int i = 0; i < newObjectsCount; i++) { @@ -1139,6 +1144,29 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) var sceneObject = new NetworkObject.SceneObject(); sceneObject.Deserialize(InternalBuffer); +#if UNIFIED_NETCODE + // TODO-UNIFIED: This is a temporary POC fix to handle synchronizing hybrid spawned objects where the Ghost instance might not yet exist. + if (sceneObject.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(sceneObject.NetworkObjectId)) + { + if (networkManager.LogLevel == LogLevel.Developer) + { + UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Deferring creation of NetworkObjectId-{sceneObject.NetworkObjectId} to wait for Ghost."); + } + + var newEntry = new PendingGhostSpawnEntry() + { + RegistrationTime = UnityEngine.Time.realtimeSinceStartup, + SceneObject = sceneObject, + Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, sceneObject.SynchronizationDataSize) + }; + + spawnManager.RegisterGhostPendingSynchronization(newEntry); + + InternalBuffer.Seek(InternalBuffer.Position + sceneObject.SynchronizationDataSize); + continue; + } +#endif + // If the sceneObject is in-scene placed, then set the scene being synchronized if (sceneObject.IsSceneObject) { @@ -1425,4 +1453,14 @@ internal SceneEventData(NetworkManager networkManager) SceneEventId = XXHash.Hash32(Guid.NewGuid().ToString()); } } + +#if UNIFIED_NETCODE + internal struct PendingGhostSpawnEntry + { + public float RegistrationTime; + public FastBufferReader Buffer; + public NetworkObject.SceneObject SceneObject; + + } +#endif } diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index f5d40677c8..750bd8e593 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -41,7 +41,12 @@ public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong network Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); } GhostsPendingSpawn.TryAdd(networkObjectId, networkObject); - NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, (ulong)networkObject.GhostInstance.ghostId); + NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); + if (GhostsArePendingSynchronization && GhostsPendingSynchronization.ContainsKey(networkObjectId)) + { + // When the object is spawned, it will invoke GetGhostNetworkObjectForSpawn below which removes the entry from GhostsPendingSpawn + ProcessGhostPendingSynchronization(networkObjectId); + } } internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) @@ -55,6 +60,90 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) GhostsPendingSpawn.Remove(networkObjectId); return networkObject; } + + internal bool GhostsArePendingSynchronization; + internal readonly Dictionary GhostsPendingSynchronization = new Dictionary(); + internal void RegisterGhostPendingSynchronization(PendingGhostSpawnEntry pendingGhostSpawnEntry) + { + var networkObjectId = pendingGhostSpawnEntry.SceneObject.NetworkObjectId; + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {nameof(NetworkObject)}-{networkObjectId} for pending synchronization."); + } + GhostsPendingSynchronization.TryAdd(networkObjectId, pendingGhostSpawnEntry); + GhostsArePendingSynchronization = true; + } + + internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool removeUponSpawn = true) + { + var ghostPendingSynch = GhostsPendingSynchronization[networkObjectId]; + var sceneObject = ghostPendingSynch.SceneObject; + var reader = ghostPendingSynch.Buffer; + if (removeUponSpawn) + { + GhostsPendingSynchronization.Remove(networkObjectId); + } + + if (sceneObject.IsSceneObject) + { + NetworkManager.SceneManager.SetTheSceneBeingSynchronized(sceneObject.NetworkSceneHandle); + } + var networkObject = NetworkObject.AddSceneObject(sceneObject, reader, NetworkManager); + // TODO-UNIFIED: How do we handle the "all in-scene placed objects are spawned notification"? + //if (sceneObject.IsSceneObject) + //{ + // networkObject.InternalInSceneNetworkObjectsSpawned(); + //} + + if (removeUponSpawn) + { + GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; + ghostPendingSynch.Buffer.Dispose(); + } + } + + + private HashSet m_GhostSynchronizationPendingRemoval = new HashSet(); + + internal void ProcessAllGhostsPendingSynchronization() + { + var spawnTimeout = NetworkManager.NetworkConfig.SpawnTimeout; + var logLevel = NetworkManager.LogLevel; + if (!GhostsArePendingSynchronization) + { + return; + } + foreach (var ghost in GhostsPendingSynchronization) + { + var networkObjectId = ghost.Value.SceneObject.NetworkObjectId; + if (GhostsPendingSpawn.ContainsKey(networkObjectId)) + { + // Process it, but don't remove it as we handle that a little later + ProcessGhostPendingSynchronization(ghost.Value.SceneObject.NetworkObjectId, false); + m_GhostSynchronizationPendingRemoval.Add(networkObjectId); + } + else + if ((ghost.Value.RegistrationTime + spawnTimeout) < Time.realtimeSinceStartup) + { + if (logLevel == LogLevel.Developer) + { + Debug.LogWarning($"[{nameof(NetworkSpawnManager)}][{nameof(ProcessAllGhostsPendingSynchronization)}] NetworkObject-{networkObjectId} pending Ghost spawn timed out wiating for the Ghost instance to spawn!"); + } + // Timed out entries are removed too + m_GhostSynchronizationPendingRemoval.Add(ghost.Key); + } + } + + foreach(var networkObjectId in m_GhostSynchronizationPendingRemoval) + { + var entry = GhostsPendingSynchronization[networkObjectId]; + GhostsPendingSynchronization.Remove(networkObjectId); + entry.Buffer.Dispose(); + } + m_GhostSynchronizationPendingRemoval.Clear(); + GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; + } + #endif /// @@ -1757,7 +1846,15 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec { RemovePlayerObject(networkObject, destroyGameObject); } - +#if UNIFIED_NETCODE + // Let unified netcode handle destroying + if (destroyGameObject && networkObject.HasGhost && !NetworkManager.IsServer) + { + networkObject.NetworkObjectBridge.OnDespawn(destroyGameObject); + // exit early + return; + } +#endif var gobj = networkObject.gameObject; if (destroyGameObject && gobj != null) { From dd4a95c5dd2f9bf9040308590480f331e0511c39 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 11 Dec 2025 19:20:22 -0600 Subject: [PATCH 06/99] update Providing a temporary way to remove the NetworkObjectBridge. --- .../Runtime/Core/NetworkObject.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index c90ef907f7..517d93e0ce 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -355,6 +355,8 @@ private void CheckForInScenePlaced() [SerializeField] internal bool HasGhost; + internal bool HadBridge; + private void UnifiedValidation() { NetworkObjectBridge = GetComponent(); @@ -362,7 +364,11 @@ private void UnifiedValidation() HasGhost = GhostAdapter != null; if (HasGhost && NetworkObjectBridge == null) { - NetworkObjectBridge = gameObject.AddComponent(); + if (!HadBridge) + { + NetworkObjectBridge = gameObject.AddComponent(); + HadBridge = true; + } } } #endif @@ -3549,7 +3555,7 @@ private void Awake() private void Start() { enabled = true; - } + } [SerializeField] [HideInInspector] internal NetworkObjectBridge NetworkObjectBridge; From d759121a417e53647ef7deb3622bdb2b2498cda4 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sat, 13 Dec 2025 16:31:58 -0600 Subject: [PATCH 07/99] update Adding support within NetworkPrefabs and NetworkPrefab to handle the registration of hybrid spawned objects (i.e. no more hacky-way of registering). Moving the hybrid spawn registration into the Start method of the NetworkObject to provide time for everything to run through Awake. Added some script (defined out) that was helping to debug why NetworkObject was being disabled sometimes (moving the initialization to Start resolved the issue). --- .../Runtime/Configuration/NetworkPrefab.cs | 14 +++++- .../Runtime/Configuration/NetworkPrefabs.cs | 50 +++++++++++++++++++ .../Runtime/Core/NetworkBehaviour.cs | 1 - .../Runtime/Core/NetworkManager.cs | 9 ++++ .../Runtime/Core/NetworkObject.cs | 46 +++++++++++------ 5 files changed, 104 insertions(+), 16 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefab.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefab.cs index c6f30d2835..25d75adf26 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefab.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefab.cs @@ -57,6 +57,14 @@ public class NetworkPrefab /// public GameObject OverridingTargetPrefab; +#if UNIFIED_NETCODE + /// + /// Used to determine if this prefab needs to be registered + /// via the unified API. + /// + internal bool HasGhost { get; private set; } +#endif + /// /// Compares this NetworkPrefab with another to determine equality /// @@ -166,6 +174,11 @@ public bool Validate(int index = -1) return false; } +#if UNIFIED_NETCODE + // Mark this network prefab as having to be registered via the unified API + HasGhost = networkObject.HasGhost; +#endif + return true; } @@ -183,7 +196,6 @@ public bool Validate(int index = -1) return false; } - break; } case NetworkPrefabOverride.Prefab: diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs index 45d93ad9d7..8ca20e152f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs @@ -277,6 +277,48 @@ public bool Contains(NetworkPrefab prefab) return false; } +#if UNIFIED_NETCODE + internal bool HasPendingGhostPrefabs { get; private set; } + private List m_PendingGhostRegistration = new List(); + + /// + /// UNIFIED-POC
+ /// Hybrid NetworkObject-Ghost Prefab Registration
+ ///
+ /// + /// When is true, s + /// will mark themselves as having a ghost during . + /// After validation, if a network prefab's value is + /// set, then it is added to . + /// Within during the , + /// if is true then will be invoked. + /// This will repeat until the hosted single world instance is created. + /// + /// + internal void RegisterGhostPrefabs(NetworkManager networkManager) + { + if (!HasPendingGhostPrefabs) + { + Debug.LogWarning($"Should not be invoking!"); + return; + } + var isHost = networkManager.IsHost; + for (int i = m_PendingGhostRegistration.Count - 1; i >= 0; i--) + { + var networkPrefab = m_PendingGhostRegistration[i]; + + // Returns false if the single world is not available yet + if (NetCode.Netcode.RegisterPrefabSingleWorld(networkPrefab.Prefab, isHost)) + { + Debug.Log($"[{nameof(NetworkPrefabs)}][{nameof(RegisterGhostPrefabs)}] Registered hybrid spawned object: {networkPrefab.Prefab.name}"); + m_PendingGhostRegistration.RemoveAt(i); + } + } + HasPendingGhostPrefabs = m_PendingGhostRegistration.Count > 0; + } +#endif + + /// /// Configures for the given /// @@ -295,6 +337,14 @@ private bool AddPrefabRegistration(NetworkPrefab networkPrefab) uint source = networkPrefab.SourcePrefabGlobalObjectIdHash; uint target = networkPrefab.TargetPrefabGlobalObjectIdHash; +#if UNIFIED_NETCODE + if (networkPrefab.HasGhost) + { + HasPendingGhostPrefabs = true; + m_PendingGhostRegistration.Add(networkPrefab); + } +#endif + // Make sure the prefab isn't already registered. if (NetworkPrefabOverrideLinks.ContainsKey(source)) { diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index af911b4385..b1bdf1db8e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Runtime.CompilerServices; using Unity.Collections; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index dee822ec4f..e95c3a45c3 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -333,6 +333,15 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) { case NetworkUpdateStage.EarlyUpdate: { +#if UNIFIED_NETCODE + // Temporary work around for handling the registration + // of hybrid spawned objects. + if (NetworkConfig.Prefabs.HasPendingGhostPrefabs) + { + NetworkConfig.Prefabs.RegisterGhostPrefabs(this); + } +#endif + UpdateTopology(); // Handle processing any new connections or transport events diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 517d93e0ce..faed783d73 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3534,27 +3534,46 @@ private void Awake() #endif SetCachedParent(transform.parent); SceneOrigin = gameObject.scene; -#if UNIFIED_NETCODE - InitGhost(); -#endif } - //private void OnEnable() - //{ - // Debug.Log("Enabled!"); - //} +#if UNIFIED_NETCODE - //private void OnDisable() - //{ - // Debug.Log("Disabled!"); - //} +#if DEBUG_ENABLE_DISABLE + private void OnEnable() + { + Debug.Log("Enabled!"); + } -#if UNIFIED_NETCODE + private void OnDisable() + { + Debug.Log("Disabled!"); + if (IsSpawned) + { + enabled = true; + } + + try + { + throw new Exception("Disabled trap!"); + } + catch (Exception ex) + { + Debug.LogWarning($"[{name}][{ex.Message}] Callstack:\n{ex.StackTrace}"); + } + } +#endif private void Start() { - enabled = true; + // TODO-UNIFIED: Remove once the prefab registration is in place. + if (!enabled) + { + Debug.LogWarning($"[{nameof(NetworkObject)}][{name}] Was not enabled on start! Enabling."); + enabled = true; + } + + InitGhost(); } [SerializeField] [HideInInspector] @@ -3562,7 +3581,6 @@ private void Start() private void InitGhost() { - enabled = true; // All instances with Ghosts are automatically registered if (HasGhost && NetworkObjectBridge) { From ba19e82a7eebe9daf7c706a4a9f7d351ab3aec80 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sun, 14 Dec 2025 16:14:25 -0600 Subject: [PATCH 08/99] update NetworkRigidbodyBase and NetworkTransform classes are destroyed during runtime initialization of a prefab instance if they still remain and the instance is a hybrid prefab instance (i.e. unified handles transform synchronization and physics related stuff). --- .../Components/NetworkRigidBodyBase.cs | 27 +++++++ .../Runtime/Core/NetworkObject.cs | 77 +++++++++++++++---- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs index 9fbf8a26c9..20bff784dc 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs @@ -193,6 +193,11 @@ protected void Initialize(RigidbodyTypes rigidbodyType, NetworkTransform network #endif #if COM_UNITY_MODULES_PHYSICS && COM_UNITY_MODULES_PHYSICS2D +#if UNIFIED_NETCODE + // Used to keep track of the original kinematic state upon awake. + // (see OnDestroy below) + private bool m_OriginalKinematicState; +#endif /// /// Initializes the networked Rigidbody based on the /// passed in as a parameter. @@ -246,9 +251,31 @@ protected void Initialize(RigidbodyTypes rigidbodyType, NetworkTransform network if (AutoUpdateKinematicState) { +#if UNIFIED_NETCODE + // Keep track of the original kinematic state. (see OnDestroy) + m_OriginalKinematicState = IsKinematic(); +#endif SetIsKinematic(true); } } + +#if UNIFIED_NETCODE + public override void OnDestroy() + { + base.OnDestroy(); + // If the user has left this component on their prefab and this is a hybrid prefab, + // then we want to set the rigid body back to its original kinematic settings since + // we are automatically destroying these components at runtime when it is a hybrid + // prefab that is spawned. + if (NetworkObject && NetworkObject.HasGhost) + { + if (m_InternalRigidbody || m_InternalRigidbody2D) + { + SetIsKinematic(m_OriginalKinematicState); + } + } + } +#endif #endif internal Vector3 GetAdjustedPositionThreshold() { diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index faed783d73..2543caa99e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -368,6 +368,8 @@ private void UnifiedValidation() { NetworkObjectBridge = gameObject.AddComponent(); HadBridge = true; + // Transform synchronization is handled by unified netcode + SynchronizeTransform = false; } } } @@ -2696,35 +2698,78 @@ internal List ChildNetworkBehaviours { continue; } - - // Set ourselves as the NetworkObject that this behaviour belongs to and add it to the child list - var nextIndex = (ushort)m_ChildNetworkBehaviours.Count; - networkBehaviours[i].SetNetworkObject(this, nextIndex); - m_ChildNetworkBehaviours.Add(networkBehaviours[i]); - var type = networkBehaviours[i].GetType(); +#if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D + if (type.IsSubclassOf(typeof(NetworkRigidbodyBase))) + { + var networkRigidbody = networkBehaviours[i] as NetworkRigidbodyBase; + + if (NetworkRigidbodies == null) + { + NetworkRigidbodies = new List(); + } + NetworkRigidbodies.Add(networkRigidbody); +#if UNIFIED_NETCODE + // For now, we will just destroy these components during runtime since they will not + // be supported in hybrid mode (don't add to the children). + if (HasGhost) + { + continue; + } +#endif + } + else +#endif if (type == typeof(NetworkTransform) || type.IsInstanceOfType(typeof(NetworkTransform)) || type.IsSubclassOf(typeof(NetworkTransform))) { + var networkTransform = networkBehaviours[i] as NetworkTransform; + if (NetworkTransforms == null) { NetworkTransforms = new List(); } - var networkTransform = networkBehaviours[i] as NetworkTransform; + networkTransform.IsNested = i != 0 && networkTransform.gameObject != gameObject; NetworkTransforms.Add(networkTransform); - } -#if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D - else if (type.IsSubclassOf(typeof(NetworkRigidbodyBase))) - { - if (NetworkRigidbodies == null) +#if UNIFIED_NETCODE + // For now, we will just destroy these components during runtime since they will not + // be supported in hybrid mode (don't add to the children). + if (HasGhost) { - NetworkRigidbodies = new List(); + continue; } - NetworkRigidbodies.Add(networkBehaviours[i] as NetworkRigidbodyBase); - } #endif + } + + // Set ourselves as the NetworkObject that this behaviour belongs to and add it to the child list + var nextIndex = (ushort)m_ChildNetworkBehaviours.Count; + networkBehaviours[i].SetNetworkObject(this, nextIndex); + + // Finally, add the NetworkBehaviour to the list of child NetworkBehaviours + m_ChildNetworkBehaviours.Add(networkBehaviours[i]); } +#if UNIFIED_NETCODE + // For now, cycle through all known NetworkTransform and NetworkRigidbodyBase derived components + // and destroy them all if this is a hybrid prefab instance. + // This allows a user to not have to make direct adjustments until trying out their NGO prefab + // as a hybrid spawned prefab (optional to completely remove, will eventually become obsolete and + // automatically removed later). + if (HasGhost) + { + for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) + { + Destroy(NetworkRigidbodies[i]); + } + for (int i = NetworkTransforms.Count - 1; i >= 0; i--) + { + Destroy(NetworkTransforms[i]); + } + NetworkRigidbodies.Clear(); + NetworkTransforms.Clear(); + } +#endif + return m_ChildNetworkBehaviours; } } @@ -3572,7 +3617,7 @@ private void Start() Debug.LogWarning($"[{nameof(NetworkObject)}][{name}] Was not enabled on start! Enabling."); enabled = true; } - + InitGhost(); } [SerializeField] From c6e2fd98c81bafc312472baeb1542abcb8a673f6 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 15 Dec 2025 11:47:04 -0600 Subject: [PATCH 09/99] fix Fixing issue where there are no NetworkTransforms or NetworkRigidbodyBase derived components. --- .../Runtime/Core/NetworkObject.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 2543caa99e..a7aeeead57 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -2700,14 +2700,13 @@ internal List ChildNetworkBehaviours } var type = networkBehaviours[i].GetType(); #if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D + if (NetworkRigidbodies == null) + { + NetworkRigidbodies = new List(); + } if (type.IsSubclassOf(typeof(NetworkRigidbodyBase))) { var networkRigidbody = networkBehaviours[i] as NetworkRigidbodyBase; - - if (NetworkRigidbodies == null) - { - NetworkRigidbodies = new List(); - } NetworkRigidbodies.Add(networkRigidbody); #if UNIFIED_NETCODE // For now, we will just destroy these components during runtime since they will not @@ -2757,16 +2756,22 @@ internal List ChildNetworkBehaviours // automatically removed later). if (HasGhost) { - for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) + if (NetworkRigidbodies != null) { - Destroy(NetworkRigidbodies[i]); + for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) + { + Destroy(NetworkRigidbodies[i]); + } + NetworkRigidbodies.Clear(); } - for (int i = NetworkTransforms.Count - 1; i >= 0; i--) + if (NetworkTransforms != null) { - Destroy(NetworkTransforms[i]); + for (int i = NetworkTransforms.Count - 1; i >= 0; i--) + { + Destroy(NetworkTransforms[i]); + } + NetworkTransforms.Clear(); } - NetworkRigidbodies.Clear(); - NetworkTransforms.Clear(); } #endif From a97064b25e48f65623f5833f921425054cc437b6 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 16 Dec 2025 18:41:50 -0600 Subject: [PATCH 10/99] fix Issue with AnimatorOverrideController not being handled which could cause improper processing of the animator's layers and parameters. Issue with clients sending state changes from the NetworkAnimatorStateChangeHandler due to added HasAuthority check. When using a server authoritative animation model, owner Clients should still be able to send trigger updates to the server. --- .../Runtime/Components/NetworkAnimator.cs | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs index db2edff3df..2cde6a1be6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs @@ -78,7 +78,7 @@ private void FlushMessages() private bool HasAuthority() { var isServerAuthority = m_NetworkAnimator.IsServerAuthoritative(); - return (!isServerAuthority && m_NetworkAnimator.IsOwner) || (isServerAuthority && (m_NetworkAnimator.IsServer || m_NetworkAnimator.IsOwner)); + return (!isServerAuthority && m_NetworkAnimator.IsOwner) || (isServerAuthority && (m_NetworkAnimator.IsServer)); } /// @@ -95,7 +95,8 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) var hasAuthority = HasAuthority(); // Only the authority or the server will send messages - if (hasAuthority || m_IsServer) + // The only exception is server authoritative and owners that are sending animation triggers. + if (hasAuthority || m_IsServer || (m_NetworkAnimator.IsServerAuthoritative() && m_NetworkAnimator.IsOwner)) { // Flush any pending messages FlushMessages(); @@ -408,7 +409,18 @@ private void BuildTransitionStateInfoList() } TransitionStateInfoList = new List(); - var animatorController = m_Animator.runtimeAnimatorController as AnimatorController; + var animControllerType = m_Animator.runtimeAnimatorController.GetType(); + var animatorController = (AnimatorController)null; + + if (animControllerType == typeof(AnimatorOverrideController)) + { + animatorController = ((AnimatorOverrideController)m_Animator.runtimeAnimatorController).runtimeAnimatorController as AnimatorController; + } + else if (animControllerType == typeof(AnimatorController)) + { + animatorController = m_Animator.runtimeAnimatorController as AnimatorController; + } + if (animatorController == null) { return; @@ -432,7 +444,22 @@ internal void ProcessParameterEntries() return; } - var parameters = Animator.parameters; + var animControllerType = m_Animator.runtimeAnimatorController.GetType(); + var animatorController = (AnimatorController)null; + + if (animControllerType == typeof(AnimatorOverrideController)) + { + animatorController = ((AnimatorOverrideController)m_Animator.runtimeAnimatorController).runtimeAnimatorController as AnimatorController; + } + else if (animControllerType == typeof(AnimatorController)) + { + animatorController = m_Animator.runtimeAnimatorController as AnimatorController; + } + if (animatorController == null) + { + return; + } + var parameters = animatorController.parameters; var parametersToRemove = new List(); ParameterToNameLookup.Clear(); From 9deb6ecf9617981fabfe138582381d23f7f2c3ae Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sun, 21 Dec 2025 18:36:16 -0600 Subject: [PATCH 11/99] update Migrated the unique world setup into this branch. The world is created prior to starting NetworkManager completely. When using hybrid prefabs (i.e. mixed mode), the final portion of the NetworkManager's start logic (i.e. endpoint connection, etc.) is not invoked until the hybrid prefabs have been registered. Hybrid prefabs wait until the World is finished starting/being initialized. --- .../Helpers/UnifiedUpdateConnections.cs | 82 +++++++++ .../Helpers/UnifiedUpdateConnections.cs.meta | 2 + .../Runtime/Components/NetworkObjectBridge.cs | 14 +- .../Runtime/Configuration/NetworkPrefabs.cs | 2 + .../Runtime/Core/NetworkBehaviour.cs | 3 + .../Runtime/Core/NetworkManager.cs | 160 +++++++++++++++++- .../Runtime/Unity.Netcode.Runtime.asmdef | 5 + 7 files changed, 264 insertions(+), 4 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs new file mode 100644 index 0000000000..93918a66b4 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -0,0 +1,82 @@ +#if UNIFIED_NETCODE +using System.Collections.Generic; +using Unity.Collections; +using Unity.Entities; +using Unity.NetCode; + +namespace Unity.Netcode.Components +{ + + public struct NetcodeConnection + { + internal World World; + internal Entity Entity; + public int NetworkId; + + public bool IsServer => World.IsServer(); + public void GoInGame() + { + World.EntityManager.AddComponentData(Entity, default(NetworkStreamInGame)); + } + public void SendMessage(T message) where T : unmanaged, IRpcCommand + { + var req = World.EntityManager.CreateEntity(); + World.EntityManager.AddComponentData(req, new SendRpcCommandRequest { TargetConnection = Entity }); + World.EntityManager.AddComponentData(req, message); + } + } + + internal partial class UnifiedUpdateConnections : SystemBase + { + private List m_TempConnections = new List(); + protected override void OnUpdate() + { + var commandBuffer = new EntityCommandBuffer(Allocator.Temp); + foreach (var (networkId, connectionState, entity) in SystemAPI.Query().WithNone().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + } + foreach (var con in m_TempConnections) + { + NetworkManager.OnNetCodeDisconnect?.Invoke(con); + } + + m_TempConnections.Clear(); + + foreach (var (networkId, entity) in SystemAPI.Query().WithAll().WithNone().WithEntityAccess()) + { + commandBuffer.AddComponent(entity); + commandBuffer.AddComponent(entity, default(ConnectionState)); + m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + } + + foreach (var con in m_TempConnections) + { + NetworkManager.OnNetCodeConnect?.Invoke(con); + } + + m_TempConnections.Clear(); + + commandBuffer.Playback(EntityManager); + } + + protected override void OnDestroy() + { + var commandBuffer = new EntityCommandBuffer(Allocator.Temp); + foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + // TODO: maybe disconnect reason? + m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + } + foreach (var con in m_TempConnections) + { + NetworkManager.OnNetCodeDisconnect?.Invoke(con); + } + commandBuffer.Playback(EntityManager); + base.OnDestroy(); + } + } +} +#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs.meta new file mode 100644 index 0000000000..01feb655c4 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d5f2f5fd179c39f43b68ec502cdec9c4 diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs index 9f52cbb803..f08594d1de 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs @@ -4,8 +4,13 @@ namespace Unity.Netcode { - // Temporarily making this public - // TODO: Make this internal when complete (if used) + + /// + /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. + /// + /// + /// If used, we most likely would make this internal + /// public partial class NetworkObjectBridge : GhostBehaviour { public Action NetworkObjectIdChanged; @@ -58,6 +63,11 @@ public override void OnDestroy() } } + /// + /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. + /// Creates the hosted world and provides a means to configuring + /// the 2nd port for unified netcode connection. + /// internal class UnifiedBootStrap : ClientServerBootstrap { public static UnifiedBootStrap Instance { get; private set; } diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs index 8ca20e152f..0f64e24eca 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs @@ -279,6 +279,7 @@ public bool Contains(NetworkPrefab prefab) #if UNIFIED_NETCODE internal bool HasPendingGhostPrefabs { get; private set; } + internal bool HasGhostPrefabs { get; private set; } private List m_PendingGhostRegistration = new List(); /// @@ -341,6 +342,7 @@ private bool AddPrefabRegistration(NetworkPrefab networkPrefab) if (networkPrefab.HasGhost) { HasPendingGhostPrefabs = true; + HasGhostPrefabs = true; m_PendingGhostRegistration.Add(networkPrefab); } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index b1bdf1db8e..8d85953ffb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; using Unity.Collections; +#if MULTIPLAYER_TOOLS && (DEVELOPMENT_BUILD || UNITY_EDITOR || UNITY_MP_TOOLS_NET_STATS_MONITOR_ENABLED_IN_RELEASE) +using System.Runtime.CompilerServices; +#endif using UnityEngine; namespace Unity.Netcode diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index e95c3a45c3..e42a95626e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; -using Unity.Collections; using System.Linq; +using Unity.Collections; +#if UNIFIED_NETCODE +using Unity.Entities; +#endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; using UnityEngine; @@ -12,6 +15,7 @@ using UnityEngine.SceneManagement; using Debug = UnityEngine.Debug; + namespace Unity.Netcode { /// @@ -1045,6 +1049,10 @@ private void Awake() #endif // Notify we have instantiated a new instance of NetworkManager. OnInstantiated?.Invoke(this); + +#if UNIFIED_NETCODE && UNITY_MULTIPLAYER_PLAYMODE + MPPMCheckInternal.Initialize(); +#endif } private void OnEnable() @@ -1307,6 +1315,35 @@ private bool CanStart(StartType type) return true; } +#if UNIFIED_NETCODE + private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) + { + while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) + { + yield return null; + } + + switch (startType) + { + case StartType.Server: + { + InternalStartServer(); + break; + } + case StartType.Host: + { + InternalStartHost(); + break; + } + case StartType.Client: + { + InternalStartClient(); + break; + } + } + } +#endif + /// /// Starts a server /// @@ -1331,6 +1368,25 @@ public bool StartServer() Initialize(true); +#if UNIFIED_NETCODE + // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. + if (NetworkConfig.Prefabs.HasGhostPrefabs) + { + DefaultWorldInitialization.Initialize("Default World", false); + StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); + return true; + } + else + { + return InternalStartServer(); + } +#else + return InternalStartServer(); +#endif + } + + internal bool InternalStartServer() + { try { IsListening = NetworkConfig.NetworkTransport.StartServer(); @@ -1354,7 +1410,6 @@ public bool StartServer() IsListening = false; throw; } - return IsListening; } @@ -1381,6 +1436,27 @@ public bool StartClient() Initialize(false); +#if UNIFIED_NETCODE + // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. + if (NetworkConfig.Prefabs.HasGhostPrefabs) + { + DefaultWorldInitialization.Initialize("Default World", false); + StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); + // TODO-UNIFIED: Need a way to signal everything completed. + return true; + } + else + { + return InternalStartClient(); + } +#else + return InternalStartClient(); +#endif + + } + + internal bool InternalStartClient() + { try { IsListening = NetworkConfig.NetworkTransport.StartClient(); @@ -1404,6 +1480,7 @@ public bool StartClient() return IsListening; } + /// /// Starts a Host /// @@ -1426,6 +1503,28 @@ public bool StartHost() } Initialize(true); + +#if UNIFIED_NETCODE + // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. + if (NetworkConfig.Prefabs.HasGhostPrefabs) + { + DefaultWorldInitialization.Initialize("Default World", false); + StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); + // TODO-UNIFIED: Need a way to signal everything completed. + return true; + } + else + { + return InternalStartHost(); + } +#else + return InternalStartHost(); +#endif + + } + + internal bool InternalStartHost() + { try { IsListening = NetworkConfig.NetworkTransport.StartServer(); @@ -1645,6 +1744,23 @@ internal void ShutdownInternal() IsListening = false; m_ShuttingDown = false; + +#if UNIFIED_NETCODE + // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. + if (NetworkConfig.Prefabs.HasGhostPrefabs) + { + try + { + // Dispose of all worlds + World.DisposeAllWorlds(); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } +#endif + // Generate a local notification that the host client is disconnected if (IsHost) { @@ -1683,6 +1799,7 @@ internal void ShutdownInternal() // can unsubscribe from tick updates and such. NetworkTimeSystem?.Shutdown(); NetworkTickSystem = null; + } // Ensures that the NetworkManager is cleaned up before OnDestroy is run on NetworkObjects and NetworkBehaviours when quitting the application. @@ -1948,5 +2065,44 @@ internal static void OnOneTimeTearDown() } #endif +#if UNIFIED_NETCODE + // TODO-UNIFIED: We might not need all of this (i.e. UnifiedUpdateConnections might be handled differently in unified) + public delegate void OnConnectDelegate(NetcodeConnection connection); + public delegate void OnDisconnectDelegate(NetcodeConnection connection); + public static OnConnectDelegate OnNetCodeConnect; + public static OnDisconnectDelegate OnNetCodeDisconnect; + +#if UNITY_EDITOR + // TODO-UNIFIED: For POC only (centralizing) + public static MPPMCheckInfo MPPMCheck => MPPMCheckInternal; + internal static MPPMCheckInfo MPPMCheckInternal = new MPPMCheckInfo(); + public class MPPMCheckInfo + { + public bool Installed { get; private set; } + public bool HasServerTag; + public bool HasClientTag; + internal void Initialize() + { +#if UNITY_MULTIPLAYER_PLAYMODE + Installed = true; + var tags = Multiplayer.PlayMode.CurrentPlayer.Tags; + foreach (var tag in tags) + { + if (tag == "Server") + { + HasServerTag = true; + } + else if (tag == "Client") + { + HasClientTag = true; + } + } +#else + Installed = false; +#endif + } + } +#endif +#endif } } diff --git a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef index 03bfa25e8d..056321a620 100644 --- a/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/Unity.Netcode.Runtime.asmdef @@ -94,6 +94,11 @@ "name": "com.unity.netcode", "expression": "1.10.1", "define": "UNIFIED_NETCODE" + }, + { + "name": "com.unity.multiplayer.playmode", + "expression": "0.1.0", + "define": "UNITY_MULTIPLAYER_PLAYMODE" } ], "noEngineReferences": false From b9446a4e889b80894adfe4eb7853a8f384ede9c6 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sun, 21 Dec 2025 18:39:07 -0600 Subject: [PATCH 12/99] update Migrating unified things into helpers --- .../Runtime/Components/{ => Helpers}/NetworkObjectBridge.cs | 0 .../Runtime/Components/{ => Helpers}/NetworkObjectBridge.cs.meta | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename com.unity.netcode.gameobjects/Runtime/Components/{ => Helpers}/NetworkObjectBridge.cs (100%) rename com.unity.netcode.gameobjects/Runtime/Components/{ => Helpers}/NetworkObjectBridge.cs.meta (100%) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs similarity index 100% rename from com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs rename to com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta similarity index 100% rename from com.unity.netcode.gameobjects/Runtime/Components/NetworkObjectBridge.cs.meta rename to com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta From 187d6ea6c6056bbd78669e6b9f9f8c6f3566e96e Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sat, 27 Dec 2025 15:53:05 -0600 Subject: [PATCH 13/99] update Exit early if trying to start in hybrid mode but not configured for a single world. --- .../Runtime/Core/NetworkManager.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index e42a95626e..5bb38af22f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -14,6 +14,7 @@ #endif using UnityEngine.SceneManagement; using Debug = UnityEngine.Debug; +using Unity.NetCode; namespace Unity.Netcode @@ -1342,6 +1343,22 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType } } } + + private bool UnifiedIsConfiguredCorrectly() + { + if (NetCodeConfig.Global == null) + { + Debug.LogError($"[{nameof(NetworkManager)}][Unified] You must create a {nameof(NetCodeConfig)} and set it to a single world in order to run in hybrid mode!"); + return false; + } + if (NetCodeConfig.Global.HostWorldModeSelection != NetCodeConfig.HostWorldMode.SingleWorld) + { + Debug.LogError($"[{nameof(NetworkManager)}][Unified] You must configure {nameof(NetCodeConfig)} to only use a single world in order to run in hybrid mode!"); + return false; + } + return true; + } + #endif /// @@ -1372,6 +1389,13 @@ public bool StartServer() // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. if (NetworkConfig.Prefabs.HasGhostPrefabs) { + if (!UnifiedIsConfiguredCorrectly()) + { + m_ShuttingDown = true; + ShutdownInternal(); + return false; + } + NetCodeConfig.Global.HostWorldModeSelection = NetCodeConfig.HostWorldMode.SingleWorld; DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); return true; @@ -1440,6 +1464,13 @@ public bool StartClient() // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. if (NetworkConfig.Prefabs.HasGhostPrefabs) { + if (!UnifiedIsConfiguredCorrectly()) + { + m_ShuttingDown = true; + ShutdownInternal(); + return false; + } + DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); // TODO-UNIFIED: Need a way to signal everything completed. @@ -1508,6 +1539,13 @@ public bool StartHost() // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. if (NetworkConfig.Prefabs.HasGhostPrefabs) { + if (!UnifiedIsConfiguredCorrectly()) + { + m_ShuttingDown = true; + ShutdownInternal(); + return false; + } + DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); // TODO-UNIFIED: Need a way to signal everything completed. From cc5c3a662388eab6f108f2f90f4e410cf6d6cd4c Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sun, 4 Jan 2026 21:11:56 -0600 Subject: [PATCH 14/99] update Added an experimental "NetworkObjectBridge" icon (programmer art alert). Added some additional script to handle moving the GhostAdapter and NetworkObject bridge to the top of the GameObject's components where GhostAdapter is first and then NetworkObjectBridge is 2nd. Removed silly code to get the root transform. --- .../Editor/Icons.meta | 8 + .../Editor/Icons/NOBridgeIcon.png | Bin 0 -> 16671 bytes .../Editor/Icons/NOBridgeIcon.png.meta | 156 ++++++++++++++++++ .../Editor/NetworkBehaviourEditor.cs | 16 +- .../Helpers/NetworkObjectBridge.cs.meta | 11 +- .../Runtime/Core/NetworkObject.cs | 22 ++- 6 files changed, 196 insertions(+), 17 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Editor/Icons.meta create mode 100644 com.unity.netcode.gameobjects/Editor/Icons/NOBridgeIcon.png create mode 100644 com.unity.netcode.gameobjects/Editor/Icons/NOBridgeIcon.png.meta diff --git a/com.unity.netcode.gameobjects/Editor/Icons.meta b/com.unity.netcode.gameobjects/Editor/Icons.meta new file mode 100644 index 0000000000..47f083a506 --- /dev/null +++ b/com.unity.netcode.gameobjects/Editor/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 09ac49ca8d1df6347814a8a4760eb02c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Editor/Icons/NOBridgeIcon.png b/com.unity.netcode.gameobjects/Editor/Icons/NOBridgeIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..c94cfb2e9b8d0fb05daa29f8d6f83293edf73265 GIT binary patch literal 16671 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 f{C@#7h>cb+t9$6m@|8uw - /// Recursively finds the root parent of a - /// - /// The current we are inspecting for a parent - /// the root parent for the first passed into the method - public static Transform GetRootParentTransform(Transform transform) - { - if (transform.parent == null || transform.parent == transform) - { - return transform; - } - return GetRootParentTransform(transform.parent); - } - /// /// Used to determine if a GameObject has one or more NetworkBehaviours but /// does not already have a NetworkObject component. If not it will notify @@ -358,7 +344,7 @@ public static void CheckForNetworkObject(GameObject gameObject, bool networkObje } // Now get the root parent transform to the current GameObject (or itself) - var rootTransform = GetRootParentTransform(gameObject.transform); + var rootTransform = gameObject.transform.root; if (!rootTransform.TryGetComponent(out var networkManager)) { networkManager = rootTransform.GetComponentInChildren(); diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta index 830a7b71d8..0e4dd44b97 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 510c5bb08d2f5724e85aa4fb66a8a4ff \ No newline at end of file +guid: 510c5bb08d2f5724e85aa4fb66a8a4ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 04d779b185ebc8d488b5d25eeb21c611, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index a7aeeead57..94e8005dd6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -355,6 +355,8 @@ private void CheckForInScenePlaced() [SerializeField] internal bool HasGhost; + [HideInInspector] + [SerializeField] internal bool HadBridge; private void UnifiedValidation() @@ -364,13 +366,31 @@ private void UnifiedValidation() HasGhost = GhostAdapter != null; if (HasGhost && NetworkObjectBridge == null) { - if (!HadBridge) { NetworkObjectBridge = gameObject.AddComponent(); HadBridge = true; // Transform synchronization is handled by unified netcode SynchronizeTransform = false; } + + // Move the bridge to the top + while (UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) + { + // Keep moving until it can't go higher + } + + // Now move the GhostAdapter to the top so it is above NetworkObjectBridge + while (UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) + { + // Keep moving until it can't go higher + } + + EditorUtility.SetDirty(gameObject); + } + else if (HadBridge && !HasGhost && !NetworkObjectBridge) + { + HadBridge = false; + SynchronizeTransform = true; } } #endif From 5cfc6c2c6d1fe31679b86c7d4b12edf98bd8d807 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Feb 2026 09:43:13 -0600 Subject: [PATCH 15/99] update Fixing some merge issues. --- .../Runtime/Core/NetworkObject.cs | 50 +++++++++++-------- .../Runtime/SceneManagement/SceneEventData.cs | 12 ++--- .../Runtime/Spawning/NetworkSpawnManager.cs | 32 ++++++------ 3 files changed, 52 insertions(+), 42 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 5063ff10b5..d9f91dda4e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -394,7 +394,7 @@ private void UnifiedValidation() { // Keep moving until it can't go higher } - + EditorUtility.SetDirty(gameObject); } else if (HadBridge && !HasGhost && !NetworkObjectBridge) @@ -2913,18 +2913,21 @@ internal struct SerializedObject public ulong OwnerClientId; public ushort OwnershipFlags; - private const ushort k_IsPlayerObject = 0x001; - private const ushort k_HasParent = 0x002; - private const ushort k_IsSceneObject = 0x004; - private const ushort k_HasTransform = 0x008; - private const ushort k_IsLatestParentSet = 0x010; - private const ushort k_WorldPositionStays = 0x020; - private const ushort k_DestroyWithScene = 0x040; - private const ushort k_DontDestroyWithOwner = 0x080; - private const ushort k_HasOwnershipFlags = 0x100; - private const ushort k_SyncObservers = 0x200; - private const ushort k_SpawnWithObservers = 0x400; - private const ushort k_HasInstantiationData = 0x800; + private const ushort k_IsPlayerObject = 0x0001; + private const ushort k_HasParent = 0x0002; + private const ushort k_IsSceneObject = 0x0004; + private const ushort k_HasTransform = 0x0008; + private const ushort k_IsLatestParentSet = 0x0010; + private const ushort k_WorldPositionStays = 0x0020; + private const ushort k_DestroyWithScene = 0x0040; + private const ushort k_DontDestroyWithOwner = 0x0080; + private const ushort k_HasOwnershipFlags = 0x0100; + private const ushort k_SyncObservers = 0x0200; + private const ushort k_SpawnWithObservers = 0x0400; + private const ushort k_HasInstantiationData = 0x0800; +#if UNIFIED_NETCODE + private const ushort k_HasGhost = 0x1000; +#endif public bool IsPlayerObject; public bool HasParent; @@ -2952,6 +2955,9 @@ internal struct SerializedObject public bool SpawnWithObservers; public bool HasInstantiationData; +#if UNIFIED_NETCODE + public bool HasGhost; +#endif [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ushort GetBitsetRepresentation() @@ -3001,10 +3007,19 @@ internal ushort GetBitsetRepresentation() { bitset |= k_SpawnWithObservers; } + if (HasInstantiationData) { bitset |= k_HasInstantiationData; } + +#if UNIFIED_NETCODE + if (HasGhost) + { + bitset |= k_HasGhost; + } + +#endif return bitset; } @@ -3023,15 +3038,10 @@ internal void SetStateFromBitset(ushort bitset) SyncObservers = (bitset & k_SyncObservers) != 0; SpawnWithObservers = (bitset & k_SpawnWithObservers) != 0; HasInstantiationData = (bitset & k_HasInstantiationData) != 0; - } - #if UNIFIED_NETCODE - public bool HasGhost - { - get => ByteUtility.GetBit(m_BitField, 12); - set => ByteUtility.SetBit(ref m_BitField, 12, value); - } + HasGhost = (bitset & k_HasGhost) != 0; #endif + } // When handling the initial synchronization of NetworkObjects, // this will be populated with the known observers. diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index d6d2b29b23..9dcb6ddb2f 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -1146,23 +1146,23 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) #if UNIFIED_NETCODE // TODO-UNIFIED: This is a temporary POC fix to handle synchronizing hybrid spawned objects where the Ghost instance might not yet exist. - if (sceneObject.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(sceneObject.NetworkObjectId)) + if (serializedObject.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(serializedObject.NetworkObjectId)) { if (networkManager.LogLevel == LogLevel.Developer) { - UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Deferring creation of NetworkObjectId-{sceneObject.NetworkObjectId} to wait for Ghost."); + UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Deferring creation of NetworkObjectId-{serializedObject.NetworkObjectId} to wait for Ghost."); } var newEntry = new PendingGhostSpawnEntry() { RegistrationTime = UnityEngine.Time.realtimeSinceStartup, - SceneObject = sceneObject, - Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, sceneObject.SynchronizationDataSize) + SerializedObject = serializedObject, + Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, serializedObject.SynchronizationDataSize) }; spawnManager.RegisterGhostPendingSynchronization(newEntry); - InternalBuffer.Seek(InternalBuffer.Position + sceneObject.SynchronizationDataSize); + InternalBuffer.Seek(InternalBuffer.Position + serializedObject.SynchronizationDataSize); continue; } #endif @@ -1459,7 +1459,7 @@ internal struct PendingGhostSpawnEntry { public float RegistrationTime; public FastBufferReader Buffer; - public NetworkObject.SceneObject SceneObject; + public NetworkObject.SerializedObject SerializedObject; } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 404446ec76..7ecf74eacb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -65,7 +65,7 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) internal readonly Dictionary GhostsPendingSynchronization = new Dictionary(); internal void RegisterGhostPendingSynchronization(PendingGhostSpawnEntry pendingGhostSpawnEntry) { - var networkObjectId = pendingGhostSpawnEntry.SceneObject.NetworkObjectId; + var networkObjectId = pendingGhostSpawnEntry.SerializedObject.NetworkObjectId; if (NetworkManager.LogLevel == LogLevel.Developer) { Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {nameof(NetworkObject)}-{networkObjectId} for pending synchronization."); @@ -77,20 +77,20 @@ internal void RegisterGhostPendingSynchronization(PendingGhostSpawnEntry pending internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool removeUponSpawn = true) { var ghostPendingSynch = GhostsPendingSynchronization[networkObjectId]; - var sceneObject = ghostPendingSynch.SceneObject; + var serializedObject = ghostPendingSynch.SerializedObject; var reader = ghostPendingSynch.Buffer; if (removeUponSpawn) { GhostsPendingSynchronization.Remove(networkObjectId); } - if (sceneObject.IsSceneObject) + if (serializedObject.IsSceneObject) { - NetworkManager.SceneManager.SetTheSceneBeingSynchronized(sceneObject.NetworkSceneHandle); + NetworkManager.SceneManager.SetTheSceneBeingSynchronized(serializedObject.NetworkSceneHandle); } - var networkObject = NetworkObject.AddSceneObject(sceneObject, reader, NetworkManager); + var networkObject = NetworkObject.Deserialize(serializedObject, reader, NetworkManager); // TODO-UNIFIED: How do we handle the "all in-scene placed objects are spawned notification"? - //if (sceneObject.IsSceneObject) + //if (serializedObject.IsSceneObject) //{ // networkObject.InternalInSceneNetworkObjectsSpawned(); //} @@ -115,11 +115,11 @@ internal void ProcessAllGhostsPendingSynchronization() } foreach (var ghost in GhostsPendingSynchronization) { - var networkObjectId = ghost.Value.SceneObject.NetworkObjectId; + var networkObjectId = ghost.Value.SerializedObject.NetworkObjectId; if (GhostsPendingSpawn.ContainsKey(networkObjectId)) { // Process it, but don't remove it as we handle that a little later - ProcessGhostPendingSynchronization(ghost.Value.SceneObject.NetworkObjectId, false); + ProcessGhostPendingSynchronization(ghost.Value.SerializedObject.NetworkObjectId, false); m_GhostSynchronizationPendingRemoval.Add(networkObjectId); } else @@ -134,7 +134,7 @@ internal void ProcessAllGhostsPendingSynchronization() } } - foreach(var networkObjectId in m_GhostSynchronizationPendingRemoval) + foreach (var networkObjectId in m_GhostSynchronizationPendingRemoval) { var entry = GhostsPendingSynchronization[networkObjectId]; GhostsPendingSynchronization.Remove(networkObjectId); @@ -1025,30 +1025,30 @@ internal NetworkObject CreateLocalNetworkObject(NetworkObject.SerializedObject s var worldPositionStays = (!serializedObject.HasParent) || serializedObject.WorldPositionStays; #if UNIFIED_NETCODE - if (sceneObject.HasGhost) + if (serializedObject.HasGhost) { // TODO-UNIFIED: Get this working somehow (or if not possible prevent this from happening prior to getting to this point) - if (sceneObject.HasInstantiationData) + if (serializedObject.HasInstantiationData) { Debug.LogError($"[{nameof(NetworkObject)}] Pre-spawn instantiation data does not work in this version!"); } - networkObject = GetGhostNetworkObjectForSpawn(sceneObject.NetworkObjectId); + networkObject = GetGhostNetworkObjectForSpawn(serializedObject.NetworkObjectId); if (networkObject == null) { - throw new Exception($"[{name}] Failed to get spawned Ghost object!"); + throw new Exception($"Failed to get spawned Ghost object!"); } } else #endif { // If scene management is disabled or the NetworkObject was dynamically spawned - if (!NetworkManager.NetworkConfig.EnableSceneManagement || !sceneObject.IsSceneObject) + if (!NetworkManager.NetworkConfig.EnableSceneManagement || !serializedObject.IsSceneObject) { - networkObject = GetNetworkObjectToSpawn(sceneObject.Hash, sceneObject.OwnerClientId, position, rotation, sceneObject.IsSceneObject, instantiationData); + networkObject = GetNetworkObjectToSpawn(serializedObject.Hash, serializedObject.OwnerClientId, position, rotation, serializedObject.IsSceneObject, instantiationData); } else // Get the in-scene placed NetworkObject { - networkObject = NetworkManager.SceneManager.GetSceneRelativeInSceneNetworkObject(globalObjectIdHash, sceneObject.NetworkSceneHandle); + networkObject = NetworkManager.SceneManager.GetSceneRelativeInSceneNetworkObject(globalObjectIdHash, serializedObject.NetworkSceneHandle); if (networkObject == null) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) From ec014289ba02dcebde8663cd7bd5393f7baa2789 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Feb 2026 09:54:19 -0600 Subject: [PATCH 16/99] update Making some minor modifications to assure we can make stand alone builds. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 4 +--- com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 45c60868de..269d9bf7ad 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -2109,7 +2109,6 @@ internal static void OnOneTimeTearDown() public static OnConnectDelegate OnNetCodeConnect; public static OnDisconnectDelegate OnNetCodeDisconnect; -#if UNITY_EDITOR // TODO-UNIFIED: For POC only (centralizing) public static MPPMCheckInfo MPPMCheck => MPPMCheckInternal; internal static MPPMCheckInfo MPPMCheckInternal = new MPPMCheckInfo(); @@ -2120,7 +2119,7 @@ public class MPPMCheckInfo public bool HasClientTag; internal void Initialize() { -#if UNITY_MULTIPLAYER_PLAYMODE +#if UNITY_MULTIPLAYER_PLAYMODE && UNITY_EDITOR Installed = true; var tags = Multiplayer.PlayMode.CurrentPlayer.Tags; foreach (var tag in tags) @@ -2139,7 +2138,6 @@ internal void Initialize() #endif } } -#endif #endif } } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index d9f91dda4e..f3cfb390de 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -368,7 +368,7 @@ private void CheckForInScenePlaced() [HideInInspector] [SerializeField] internal bool HadBridge; - +#if UNITY_EDITOR private void UnifiedValidation() { NetworkObjectBridge = GetComponent(); @@ -396,6 +396,7 @@ private void UnifiedValidation() } EditorUtility.SetDirty(gameObject); + } else if (HadBridge && !HasGhost && !NetworkObjectBridge) { @@ -403,6 +404,7 @@ private void UnifiedValidation() SynchronizeTransform = true; } } +#endif #endif /// /// Gets the NetworkManager that owns this NetworkObject instance From d1f28b51ad7cc146ba753e79b8330b6dd1ad7c8d Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 6 Feb 2026 15:36:25 -0600 Subject: [PATCH 17/99] update Fixing issue where Unity.NetCode was not wrapped by UNIFIED_NETCODE. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 269d9bf7ad..8e79307164 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -4,6 +4,7 @@ using Unity.Collections; #if UNIFIED_NETCODE using Unity.Entities; +using Unity.NetCode; #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; @@ -14,7 +15,7 @@ #endif using UnityEngine.SceneManagement; using Debug = UnityEngine.Debug; -using Unity.NetCode; + namespace Unity.Netcode From 1dd4bd2adfff406a2da39011871eaa0c030d29a3 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 25 Feb 2026 16:41:45 -0600 Subject: [PATCH 18/99] fix Issue with detecting unified ghost mode. --- .../Editor/NetworkObjectEditor.cs | 5 ++++- .../Editor/Unity.Netcode.Editor.asmdef | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs index ce9d9744cb..57c0316e3a 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs @@ -20,7 +20,7 @@ public class NetworkObjectEditor : UnityEditor.Editor private bool m_Initialized; private NetworkObject m_NetworkObject; private bool m_ShowObservers; - + private static readonly string[] k_HiddenFields = { "m_Script" }; private void Initialize() @@ -32,6 +32,9 @@ private void Initialize() m_Initialized = true; m_NetworkObject = (NetworkObject)target; +#if UNIFIED_NETCODE + m_NetworkObject.UnifiedValidation(); +#endif } /// diff --git a/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef b/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef index e496cfe8b5..26c1f8f90f 100644 --- a/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef +++ b/com.unity.netcode.gameobjects/Editor/Unity.Netcode.Editor.asmdef @@ -7,7 +7,8 @@ "Unity.Services.Relay", "Unity.Networking.Transport", "Unity.Services.Core", - "Unity.Services.Authentication" + "Unity.Services.Authentication", + "Unity.NetCode" ], "includePlatforms": [ "Editor" @@ -48,6 +49,16 @@ "name": "com.unity.services.multiplayer", "expression": "0.2.0", "define": "MULTIPLAYER_SERVICES_SDK_INSTALLED" + }, + { + "name": "com.unity.netcode", + "expression": "1.10.1", + "define": "UNIFIED_NETCODE" + }, + { + "name": "com.unity.multiplayer.playmode", + "expression": "0.1.0", + "define": "UNITY_MULTIPLAYER_PLAYMODE" } ], "noEngineReferences": false From 6cf04138c13e8800dce06fda9317c06de73f21e4 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 25 Feb 2026 16:43:22 -0600 Subject: [PATCH 19/99] update Automatically handle removing the Rigidbody on non-authority instances when running in client-server mode. --- .../Components/Helpers/ComponentHelpers.cs | 60 +++++++++ .../Helpers/ComponentHelpers.cs.meta | 2 + .../Components/Helpers/ComponentMarker.cs | 100 +++++++++++++++ .../Helpers/ComponentMarker.cs.meta | 2 + .../Components/Helpers/NetworkObjectBridge.cs | 1 - .../Runtime/Components/NetworkTransform.cs | 30 ++++- .../Runtime/Configuration/NetworkPrefabs.cs | 53 ++++++++ .../Runtime/Core/NetworkManager.cs | 4 - .../Runtime/Core/NetworkObject.cs | 119 +++++++++++++++++- 9 files changed, 364 insertions(+), 7 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs new file mode 100644 index 0000000000..8fe95368bd --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs @@ -0,0 +1,60 @@ +#if UNIFIED_NETCODE +using System.Reflection; +using UnityEngine; + +namespace Unity.Netcode +{ + internal static class ComponentHelpers + { + /// + /// Copies the properties and fields of a source component to a target component + /// + /// Type of the component being copied. + /// The copy to target. + /// The copy from source. + /// + internal static T Copy(this Component target, T source) where T : Component + { + var targetType = target.GetType(); + var sourceType = source.GetType(); + if (targetType != sourceType) + { + Debug.LogError($"[ComponentHelpers][GetCopyOf<{targetType.Name}>][Mismatched target & source] Source: {sourceType.Name}!"); + return null; + } + + var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly; + + // Copy properties + foreach (var property in targetType.GetProperties(bindingFlags)) + { + if (property.CanWrite) + { + try { property.SetValue(target, property.GetValue(source, null), null); } + catch { } // Handle exceptions for unsupported properties + } + } + + // Copy fields + foreach (var field in targetType.GetFields(bindingFlags)) + { + field.SetValue(target, field.GetValue(source)); + } + + return target as T; + } + + /// + /// Add a component of Type T and copy the source somponent's properties and fields. + /// + /// Component type to add. + /// The target GameObject the component will be added to. + /// The source component (must be the same Type of T). + /// + internal static T AddAndCopy(this GameObject gameObject, T sourceComponent) where T : Component + { + return gameObject.AddComponent().Copy(sourceComponent); + } + } +} +#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta new file mode 100644 index 0000000000..51aa6e32f7 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 543f53bafd1a2424c9f8609da08e927d \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs new file mode 100644 index 0000000000..e11978281e --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs @@ -0,0 +1,100 @@ +#if UNIFIED_NETCODE +using System.Collections.Generic; +using UnityEngine; + +namespace Unity.Netcode +{ + /// + /// Can be used to remove and add back a component that is being tracked. + /// Requires invoking before a component is marked to be tracked. + /// + [HideInInspector] + internal class ComponentMarker : MonoBehaviour + { + internal static Dictionary>> RegisteredMarkers = new Dictionary>>(); + + private static void AddInstance(NetworkManager networkManager, ComponentMarker instance) + { + if (!RegisteredMarkers.ContainsKey(networkManager)) + { + RegisteredMarkers.Add(networkManager, new Dictionary>()); + } + + if (!RegisteredMarkers[networkManager].ContainsKey(instance.gameObject)) + { + RegisteredMarkers[networkManager].Add(instance.gameObject, new HashSet()); + } + RegisteredMarkers[networkManager][instance.gameObject].Add(instance); + } + + private static void RemoveInstance(NetworkManager networkManager, ComponentMarker instance) + { + if (!RegisteredMarkers.ContainsKey(networkManager)) + { + return; + } + + if (!RegisteredMarkers[networkManager].ContainsKey(instance.gameObject)) + { + return; + } + RegisteredMarkers[networkManager][instance.gameObject].Remove(instance); + + if (RegisteredMarkers[networkManager][instance.gameObject].Count == 0) + { + RegisteredMarkers[networkManager].Remove(instance.gameObject); + } + + if (RegisteredMarkers[networkManager].Count == 0) + { + RegisteredMarkers.Remove(networkManager); + } + } + + internal NetworkManager NetworkManager { get; private set; } + + internal Component PrefabInstance { get; private set; } + internal Component CurrentInstance { get; private set; } + + internal void Add() where T : Component + { + if (CurrentInstance) + { + return; + } + var instanceAsType = (T)PrefabInstance; + CurrentInstance = ComponentHelpers.AddAndCopy(gameObject, instanceAsType); + } + + internal void Remove() where T : Component + { + if (!CurrentInstance) + { + return; + } + Destroy(CurrentInstance); + CurrentInstance = null; + } + + /// + /// Initializes this marker to track the current component instance paired with the prefab's instance of the component. + /// + /// The type of component being marked. + /// To help with integration testing (tracking which NetworkManager instance a registered marker belongs to. + /// The current active comonent instance. + /// The prefab's instance of the component (used to replicate the setttings when adding back). + internal void Initialize(NetworkManager networkManager, T currentInstance, T prefabInstance) where T : Component + { + CurrentInstance = currentInstance; + PrefabInstance = prefabInstance; + NetworkManager = networkManager; + AddInstance(networkManager, this); + } + + internal void OnDestroy() + { + RemoveInstance(NetworkManager, this); + } + } +} +#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta new file mode 100644 index 0000000000..5202ad04ce --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2ee4eade8cd29c0429f6ed606aa9141f \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index f08594d1de..37c756bf32 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -79,7 +79,6 @@ public override bool Initialize(string defaultWorldName) Instance = this; AutoConnectPort = Port; CreateDefaultClientServerWorlds(); - var initialized = base.Initialize(defaultWorldName); OnInitialized?.Invoke(initialized); return initialized; diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs index 15109c93db..944d1483cc 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs @@ -1791,6 +1791,19 @@ internal void RegisterRigidbody(NetworkRigidbodyBase networkRigidbody) m_UseRigidbodyForMotion = m_NetworkRigidbodyInternal.UseRigidBodyForMotion; } } + +#if UNIFIED_NETCODE + internal void UnregisterRigidbody() + { + if (m_NetworkRigidbodyInternal) + { + NetworkManager.NetworkTransformRegistration(NetworkObject, false, false); + NetworkManager.NetworkTransformRegistration(NetworkObject, true, true); + m_NetworkRigidbodyInternal = null; + m_UseRigidbodyForMotion = false; + } + } +#endif #endif #if DEBUG_NETWORKTRANSFORM || UNITY_INCLUDE_TESTS @@ -3594,6 +3607,8 @@ protected virtual void Awake() } CachedTransform = transform; + + } internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager) @@ -3606,6 +3621,12 @@ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManag /// public override void OnNetworkSpawn() { +#if UNIFIED_NETCODE + if (NetworkObject.HasGhost) + { + return; + } +#endif m_ParentedChildren.Clear(); m_CachedNetworkManager = NetworkManager; @@ -3700,6 +3721,13 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState() /// private void InternalInitialization(bool isOwnershipChange = false) { + +#if UNIFIED_NETCODE + if (NetworkObject.HasGhost) + { + return; + } +#endif if (!IsSpawned) { return; @@ -3808,7 +3836,7 @@ protected void Initialize() { InternalInitialization(); } - #endregion +#endregion #region PARENTING AND OWNERSHIP /// diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs index 0f64e24eca..f414283c0d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs @@ -47,6 +47,11 @@ public class NetworkPrefabs [NonSerialized] private List m_Prefabs = new List(); +#if UNIFIED_NETCODE + [NonSerialized] + internal Dictionary PrefabTable = new Dictionary(); +#endif + [NonSerialized] private List m_RuntimeAddedPrefabs = new List(); @@ -57,12 +62,21 @@ private void AddTriggeredByNetworkPrefabList(NetworkPrefab networkPrefab) // Don't add this to m_RuntimeAddedPrefabs // This prefab is now in the PrefabList, so if we shutdown and initialize again, we'll pick it up from there. m_Prefabs.Add(networkPrefab); +#if UNIFIED_NETCODE + if (!PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Add(networkPrefab.SourcePrefabGlobalObjectIdHash, networkPrefab); + } +#endif } } private void RemoveTriggeredByNetworkPrefabList(NetworkPrefab networkPrefab) { m_Prefabs.Remove(networkPrefab); +#if UNIFIED_NETCODE + PrefabTable.Remove(networkPrefab.SourcePrefabGlobalObjectIdHash); +#endif } /// @@ -95,6 +109,9 @@ public void Initialize(bool warnInvalid = true) { m_Prefabs.Clear(); NetworkPrefabsLists.RemoveAll(x => x == null); +#if UNIFIED_NETCODE + PrefabTable.Clear(); +#endif foreach (var list in NetworkPrefabsLists) { list.OnAdd += AddTriggeredByNetworkPrefabList; @@ -127,10 +144,22 @@ public void Initialize(bool warnInvalid = true) if (AddPrefabRegistration(networkPrefab)) { m_Prefabs.Add(networkPrefab); +#if UNIFIED_NETCODE + if (!PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Add(networkPrefab.SourcePrefabGlobalObjectIdHash, networkPrefab); + } +#endif } else { removeList?.Add(networkPrefab); +#if UNIFIED_NETCODE + if (PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Remove(networkPrefab.SourcePrefabGlobalObjectIdHash); + } +#endif } } @@ -139,10 +168,22 @@ public void Initialize(bool warnInvalid = true) if (AddPrefabRegistration(networkPrefab)) { m_Prefabs.Add(networkPrefab); +#if UNIFIED_NETCODE + if (!PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Add(networkPrefab.SourcePrefabGlobalObjectIdHash, networkPrefab); + } +#endif } else { removeList?.Add(networkPrefab); +#if UNIFIED_NETCODE + if (PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Remove(networkPrefab.SourcePrefabGlobalObjectIdHash); + } +#endif } } @@ -175,6 +216,12 @@ public bool Add(NetworkPrefab networkPrefab) { m_Prefabs.Add(networkPrefab); m_RuntimeAddedPrefabs.Add(networkPrefab); +#if UNIFIED_NETCODE + if (!PrefabTable.ContainsKey(networkPrefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Add(networkPrefab.SourcePrefabGlobalObjectIdHash, networkPrefab); + } +#endif return true; } @@ -202,6 +249,12 @@ public void Remove(NetworkPrefab prefab) m_RuntimeAddedPrefabs.Remove(prefab); OverrideToNetworkPrefab.Remove(prefab.TargetPrefabGlobalObjectIdHash); NetworkPrefabOverrideLinks.Remove(prefab.SourcePrefabGlobalObjectIdHash); +#if UNIFIED_NETCODE + if (PrefabTable.ContainsKey(prefab.SourcePrefabGlobalObjectIdHash)) + { + PrefabTable.Remove(prefab.SourcePrefabGlobalObjectIdHash); + } +#endif } /// diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 8e79307164..e9840ec393 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1400,7 +1400,6 @@ public bool StartServer() return false; } NetCodeConfig.Global.HostWorldModeSelection = NetCodeConfig.HostWorldMode.SingleWorld; - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); return true; } @@ -1475,7 +1474,6 @@ public bool StartClient() return false; } - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); // TODO-UNIFIED: Need a way to signal everything completed. return true; @@ -1549,8 +1547,6 @@ public bool StartHost() ShutdownInternal(); return false; } - - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); // TODO-UNIFIED: Need a way to signal everything completed. return true; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index f3cfb390de..dcdbae6bc4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -369,7 +369,7 @@ private void CheckForInScenePlaced() [SerializeField] internal bool HadBridge; #if UNITY_EDITOR - private void UnifiedValidation() + internal void UnifiedValidation() { NetworkObjectBridge = GetComponent(); GhostAdapter = GetComponent(); @@ -2573,11 +2573,18 @@ internal static void CheckOrphanChildren() internal void InvokeBehaviourNetworkPreSpawn() { + var networkManager = NetworkManager; + for (int i = 0; i < ChildNetworkBehaviours.Count; i++) { ChildNetworkBehaviours[i].NetworkPreSpawn(ref networkManager, this); } + +#if UNIFIED_NETCODE + InitializeComponentMarkers(NetworkManager); +#endif + } internal void InvokeBehaviourNetworkSpawn() @@ -2669,6 +2676,113 @@ internal string GenerateDisabledNetworkBehaviourWarning(NetworkBehaviour network return $"[{name}][{networkBehaviour.GetType().Name}][{nameof(isActiveAndEnabled)}: {networkBehaviour.isActiveAndEnabled}] Disabled {nameof(NetworkBehaviour)}s will be excluded from spawning and synchronization!"; } +#if UNIFIED_NETCODE + private void InitializeComponentMarkers(NetworkManager networkManager) + { + // TODO: Determine if this would be useful + //var networkBehaviours = GetComponentsInChildren(true); + //foreach(var networkBehaviour in networkBehaviours) + //{ + //} + + + var networkPrefab = GetPrefab(networkManager); + // Most likely an in-scene placed NetworkObject that is not a registered prefab + if (networkPrefab == null) + { + return; + } + + var rigidbodies = GetComponentsInChildren(); + var prefabRigidbodies = networkPrefab.Prefab.GetComponentsInChildren(); + + if (rigidbodies.Length != prefabRigidbodies.Length) + { + Debug.LogError($"[InitializeComponentTable][{name}][{GlobalObjectIdHash}] Rigidbody mismatch between prefab and prefab instance ({rigidbodies.Length} vs {prefabRigidbodies.Length}!"); + return; + } + + var hasAuthority = !NetworkManager.DistributedAuthorityMode ? NetworkManager.IsServer : IsOwner; + + // Remove NetworkRigidbody components first. + if (NetworkRigidbodies != null && !NetworkManager.DistributedAuthorityMode && !HasAuthority) + { + for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) + { + Destroy(NetworkRigidbodies[i]); + } + NetworkRigidbodies.Clear(); + // Unregister any registered NetworkRigidbody components + if (NetworkTransforms != null) + { + foreach (var networkTransform in NetworkTransforms) + { + networkTransform.UnregisterRigidbody(); + } + } + } + + /// Mark all rigid bodies with the component marker. + /// This provides us with an automated way to remove or add rigid bodies + /// while preserving their state via . + for (int i = 0; i < rigidbodies.Length; i++) + { + var rigidbody = rigidbodies[i]; + var prefabRigidbody = prefabRigidbodies[i]; + + var componentMarker = rigidbody.gameObject.AddComponent(); + componentMarker.Initialize(networkManager, rigidbody, prefabRigidbody); + // If we are in client-server and not the server + if (!hasAuthority) + { + // Remove the rigid body. + componentMarker.Remove(); + componentMarker.Remove(); + } + } + } + + public void UpdateComponentStatus(bool shouldAdd) where T : Component + { + if (!IsSpawned) + { + return; + } + + var gameObjectsTable = ComponentMarker.RegisteredMarkers[NetworkManager]; + foreach (var gameObjectTable in gameObjectsTable) + { + foreach(var componentMarker in gameObjectTable.Value) + { + if (shouldAdd) + { + componentMarker.Add(); + } + else + { + componentMarker.Remove(); + } + } + } + } + + /// + /// POC Version of this. + /// Currently does not take overrides into consideration. + /// We could auto-register each instance's source prefab. + /// + /// + /// + private NetworkPrefab GetPrefab(NetworkManager networkManager) + { + if (networkManager && networkManager.NetworkConfig.Prefabs.PrefabTable.ContainsKey(GlobalObjectIdHash)) + { + return networkManager.NetworkConfig.Prefabs.PrefabTable[GlobalObjectIdHash]; + } + return null; + } +#endif + internal List ChildNetworkBehaviours { get @@ -2755,6 +2869,9 @@ internal List ChildNetworkBehaviours } NetworkRigidbodies.Clear(); } + + // TODO: We might want to make this whole thing a noop as opposed to completely + // removing it. if (NetworkTransforms != null) { for (int i = NetworkTransforms.Count - 1; i >= 0; i--) From 1f3c7a77abd5c0937695abb165578adf0bab271e Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 26 Feb 2026 00:27:27 -0600 Subject: [PATCH 20/99] update - child network behaviours This update is the first pass to making ChildNetworkBehaviours a table keyed off of the NetworkBehahviour identifiers. This allows for the removal of a NetworkBehaviour without it impacting the remaining NetworkBehaviours. This could most likely be optimized by generating the initial table ahead of time on each prefab. In-scene placed that are not registered prefabs would need to do this upon being instantiated. --- .../Runtime/Core/NetworkBehaviourUpdater.cs | 18 +- .../Runtime/Core/NetworkObject.cs | 186 +++++++++++------- .../Messages/NetworkTransformMessage.cs | 8 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 5 +- .../Runtime/Timing/AnticipationSystem.cs | 2 +- 5 files changed, 134 insertions(+), 85 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs index 82219deba4..202dc6cc7b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs @@ -56,9 +56,9 @@ internal void ProcessDirtyObjectServer(NetworkObject dirtyObj, bool forceSend) if (m_NetworkManager.DistributedAuthorityMode || dirtyObj.IsNetworkVisibleTo(client.ClientId)) { // Sync just the variables for just the objects this client sees - for (int k = 0; k < dirtyObj.ChildNetworkBehaviours.Count; k++) + foreach(var childBehaviour in dirtyObj.ChildNetworkBehaviours) { - dirtyObj.ChildNetworkBehaviours[k].NetworkVariableUpdate(client.ClientId, forceSend); + childBehaviour.Value.NetworkVariableUpdate(client.ClientId, forceSend); } } } @@ -73,9 +73,9 @@ internal void ProcessDirtyObjectServer(NetworkObject dirtyObj, bool forceSend) [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void ProcessDirtyObjectClient(NetworkObject dirtyObj, bool forceSend) { - for (int k = 0; k < dirtyObj.ChildNetworkBehaviours.Count; k++) + foreach (var childBehaviour in dirtyObj.ChildNetworkBehaviours) { - dirtyObj.ChildNetworkBehaviours[k].NetworkVariableUpdate(NetworkManager.ServerClientId, forceSend); + childBehaviour.Value.NetworkVariableUpdate(NetworkManager.ServerClientId, forceSend); } } @@ -86,9 +86,9 @@ internal void ProcessDirtyObjectClient(NetworkObject dirtyObj, bool forceSend) [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void PostProcessDirtyObject(NetworkObject dirtyObj) { - for (int k = 0; k < dirtyObj.ChildNetworkBehaviours.Count; k++) + foreach (var behaviourEntry in dirtyObj.ChildNetworkBehaviours) { - var behaviour = dirtyObj.ChildNetworkBehaviours[k]; + var behaviour = behaviourEntry.Value; for (int i = 0; i < behaviour.NetworkVariableFields.Count; i++) { // Set to true for NetworkVariable to ignore duplication of the @@ -116,7 +116,7 @@ internal void ResetDirtyObject(NetworkObject dirtyObj, bool forceSend) { foreach (var behaviour in dirtyObj.ChildNetworkBehaviours) { - behaviour.PostNetworkVariableWrite(forceSend); + behaviour.Value.PostNetworkVariableWrite(forceSend); } } @@ -164,9 +164,9 @@ internal void ProcessDirtyObject(NetworkObject networkObject, bool forceSend) } // Pre-variable update - for (int k = 0; k < networkObject.ChildNetworkBehaviours.Count; k++) + foreach (var childBehaviour in networkObject.ChildNetworkBehaviours) { - networkObject.ChildNetworkBehaviours[k].PreVariableUpdate(); + childBehaviour.Value.PreVariableUpdate(); } // Server sends updates to all clients where a client sends updates diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index dcdbae6bc4..04c2d9cf1b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -484,13 +484,13 @@ public void DeferDespawn(int tickOffset, bool destroy = true) var connectionManager = NetworkManagerOwner.ConnectionManager; - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[i].PreVariableUpdate(); + childBehaviour.Value.PreVariableUpdate(); // Notify all NetworkBehaviours that the authority is performing a deferred despawn. // This is when user script would update NetworkVariable states that might be needed // for the deferred despawn sequence on non-authoritative instances. - ChildNetworkBehaviours[i].OnDeferringDespawn(DeferredDespawnTick); + childBehaviour.Value.OnDeferringDespawn(DeferredDespawnTick); } // DAHost handles sending updates to all clients @@ -502,18 +502,18 @@ public void DeferDespawn(int tickOffset, bool destroy = true) if (IsNetworkVisibleTo(client.ClientId)) { // Sync just the variables for just the objects this client sees - for (int k = 0; k < ChildNetworkBehaviours.Count; k++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[k].NetworkVariableUpdate(client.ClientId); + childBehaviour.Value.NetworkVariableUpdate(client.ClientId); } } } } else // Clients just send their deltas to the service or DAHost { - for (int k = 0; k < ChildNetworkBehaviours.Count; k++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[k].NetworkVariableUpdate(NetworkManager.ServerClientId); + childBehaviour.Value.NetworkVariableUpdate(NetworkManager.ServerClientId); } } @@ -1990,7 +1990,7 @@ public void Despawn(bool destroy = true) foreach (var behavior in ChildNetworkBehaviours) { - behavior.MarkVariablesDirty(false); + behavior.Value.MarkVariablesDirty(false); } NetworkManagerOwner.SpawnManager.DespawnObject(this, destroy); } @@ -2069,10 +2069,10 @@ internal void InvokeBehaviourOnOwnershipChanged(ulong originalOwnerClientId, ulo foreach (var childBehaviour in ChildNetworkBehaviours) { - childBehaviour.UpdateNetworkProperties(); + childBehaviour.Value.UpdateNetworkProperties(); if (distributedAuthorityMode || isServer || isPreviousOwner) { - childBehaviour.OnLostOwnership(); + childBehaviour.Value.OnLostOwnership(); } } @@ -2082,28 +2082,29 @@ internal void InvokeBehaviourOnOwnershipChanged(ulong originalOwnerClientId, ulo { foreach (var childBehaviour in ChildNetworkBehaviours) { - if (!childBehaviour.gameObject.activeInHierarchy) + if (!childBehaviour.Value.gameObject.activeInHierarchy) { - Debug.LogWarning($"[{name}] {childBehaviour.gameObject.name} is disabled! Netcode for GameObjects does not support disabled NetworkBehaviours! The {childBehaviour.GetType().Name} component was skipped during ownership assignment!"); + Debug.LogWarning($"[{name}] {childBehaviour.Value.gameObject.name} is disabled! Netcode for GameObjects does not support disabled NetworkBehaviours! The {childBehaviour.Value.GetType().Name} component was skipped during ownership assignment!"); continue; } - childBehaviour.InternalOnGainedOwnership(); + childBehaviour.Value.InternalOnGainedOwnership(); } } } internal void InvokeOwnershipChanged(ulong previous, ulong next) { - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy) + var behaviour = childBehaviour.Value; + if (behaviour.gameObject.activeInHierarchy) { - ChildNetworkBehaviours[i].InternalOnOwnershipChanged(previous, next); + behaviour.InternalOnOwnershipChanged(previous, next); } else { - Debug.LogWarning($"[{name}] {ChildNetworkBehaviours[i].gameObject.name} is disabled! Netcode for GameObjects does not support disabled NetworkBehaviours! The {ChildNetworkBehaviours[i].GetType().Name} component was skipped during ownership assignment!"); + Debug.LogWarning($"[{name}] {behaviour.gameObject.name} is disabled! Netcode for GameObjects does not support disabled NetworkBehaviours! The {behaviour.GetType().Name} component was skipped during ownership assignment!"); } } } @@ -2117,24 +2118,25 @@ internal void InvokeSessionOwnerPromoted(bool isSessionOwner) foreach (var childBehaviour in ChildNetworkBehaviours) { - childBehaviour.IsSessionOwner = isSessionOwner; + childBehaviour.Value.IsSessionOwner = isSessionOwner; } } internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNetworkObject) { - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { + var behaviour = childBehaviour.Value; // Any NetworkBehaviour that is not spawned and the associated GameObject is disabled should be // skipped over (i.e. not supported). - if (!ChildNetworkBehaviours[i].IsSpawned && !ChildNetworkBehaviours[i].gameObject.activeInHierarchy) + if (!behaviour.IsSpawned && !behaviour.gameObject.activeInHierarchy) { continue; } // Invoke internal notification - ChildNetworkBehaviours[i].InternalOnNetworkObjectParentChanged(parentNetworkObject); + behaviour.InternalOnNetworkObjectParentChanged(parentNetworkObject); // Invoke public notification - ChildNetworkBehaviours[i].OnNetworkObjectParentChanged(parentNetworkObject); + behaviour.OnNetworkObjectParentChanged(parentNetworkObject); } } @@ -2576,15 +2578,17 @@ internal void InvokeBehaviourNetworkPreSpawn() var networkManager = NetworkManager; - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[i].NetworkPreSpawn(ref networkManager, this); + childBehaviour.Value.NetworkPreSpawn(ref networkManager, this); } #if UNIFIED_NETCODE InitializeComponentMarkers(NetworkManager); #endif + } internal void InvokeBehaviourNetworkSpawn() @@ -2599,55 +2603,59 @@ internal void InvokeBehaviourNetworkSpawn() // - invocation of RPCs will work properly (and not throw exception under certain scenarios) foreach (var childBehaviour in ChildNetworkBehaviours) { - if (!childBehaviour.gameObject.activeInHierarchy) + if (!childBehaviour.Value.gameObject.activeInHierarchy) { - Debug.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour)}"); + Debug.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour.Value)}"); continue; } - childBehaviour.InternalOnNetworkSpawn(); + childBehaviour.Value.InternalOnNetworkSpawn(); } // After initialization, we can then invoke OnNetworkSpawn on each child NetworkBehaviour. foreach (var childBehaviour in ChildNetworkBehaviours) { - if (!childBehaviour.gameObject.activeInHierarchy) + var behaviour = childBehaviour.Value; + if (!behaviour.gameObject.activeInHierarchy) { - Debug.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour)}"); + Debug.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour.Value)}"); continue; } - childBehaviour.NetworkSpawn(); + behaviour.NetworkSpawn(); } } internal void InvokeBehaviourNetworkPostSpawn() { - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy) + var behaviour = childBehaviour.Value; + if (behaviour.gameObject.activeInHierarchy) { - ChildNetworkBehaviours[i].NetworkPostSpawn(); + behaviour.NetworkPostSpawn(); } } } internal void InternalNetworkSessionSynchronized() { - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy) + var behaviour = childBehaviour.Value; + if (behaviour.gameObject.activeInHierarchy) { - ChildNetworkBehaviours[i].NetworkSessionSynchronized(); + behaviour.NetworkSessionSynchronized(); } } } internal void InternalInSceneNetworkObjectsSpawned() { - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy) + var behaviour = childBehaviour.Value; + if (behaviour.gameObject.activeInHierarchy) { - ChildNetworkBehaviours[i].InSceneNetworkObjectsSpawned(); + behaviour.InSceneNetworkObjectsSpawned(); } } } @@ -2655,21 +2663,21 @@ internal void InternalInSceneNetworkObjectsSpawned() internal void InvokeBehaviourNetworkDespawn() { // Invoke OnNetworkPreDespawn on all child behaviours - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[i].InternalOnNetworkPreDespawn(); + childBehaviour.Value.InternalOnNetworkPreDespawn(); } NetworkManagerOwner.SpawnManager.UpdateOwnershipTable(this, OwnerClientId, true); NetworkManagerOwner.SpawnManager.RemoveNetworkObjectFromSceneChangedUpdates(this); - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[i].InternalOnNetworkDespawn(); + childBehaviour.Value.InternalOnNetworkDespawn(); } } - private List m_ChildNetworkBehaviours; + private Dictionary m_ChildNetworkBehaviours; internal string GenerateDisabledNetworkBehaviourWarning(NetworkBehaviour networkBehaviour) { @@ -2691,7 +2699,7 @@ private void InitializeComponentMarkers(NetworkManager networkManager) if (networkPrefab == null) { return; - } + } var rigidbodies = GetComponentsInChildren(); var prefabRigidbodies = networkPrefab.Prefab.GetComponentsInChildren(); @@ -2704,11 +2712,32 @@ private void InitializeComponentMarkers(NetworkManager networkManager) var hasAuthority = !NetworkManager.DistributedAuthorityMode ? NetworkManager.IsServer : IsOwner; + var networkTransforms = GetComponentsInChildren(); + + if (!hasAuthority && !NetworkManager.DistributedAuthorityMode && networkTransforms != null && networkTransforms.Length > 0) + { + foreach (var networkTransform in networkTransforms) + { + var shouldHaveAuthority = networkTransform.AuthorityMode == NetworkTransform.AuthorityModes.Owner && NetworkManager.LocalClientId == OwnerClientId; + if (hasAuthority != shouldHaveAuthority) + { + hasAuthority = shouldHaveAuthority; + break; + } + } + } + + if (hasAuthority) + { + return; + } + // Remove NetworkRigidbody components first. - if (NetworkRigidbodies != null && !NetworkManager.DistributedAuthorityMode && !HasAuthority) + if (NetworkRigidbodies != null && !NetworkManager.DistributedAuthorityMode) { for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) { + m_ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); Destroy(NetworkRigidbodies[i]); } NetworkRigidbodies.Clear(); @@ -2752,7 +2781,7 @@ public void UpdateComponentStatus(bool shouldAdd) where T : Component var gameObjectsTable = ComponentMarker.RegisteredMarkers[NetworkManager]; foreach (var gameObjectTable in gameObjectsTable) { - foreach(var componentMarker in gameObjectTable.Value) + foreach (var componentMarker in gameObjectTable.Value) { if (shouldAdd) { @@ -2783,7 +2812,16 @@ private NetworkPrefab GetPrefab(NetworkManager networkManager) } #endif - internal List ChildNetworkBehaviours + /// + /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /// Convert ChildNetworkBehaviours to a + /// table so removing won't impact things. + /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /// + + + + internal Dictionary ChildNetworkBehaviours { get { @@ -2792,7 +2830,7 @@ internal List ChildNetworkBehaviours return m_ChildNetworkBehaviours; } - m_ChildNetworkBehaviours = new List(); + m_ChildNetworkBehaviours = new Dictionary(); var networkBehaviours = GetComponentsInChildren(true); for (int i = 0; i < networkBehaviours.Length; i++) { @@ -2804,6 +2842,11 @@ internal List ChildNetworkBehaviours continue; } var type = networkBehaviours[i].GetType(); + + // Set ourselves as the NetworkObject that this behaviour belongs to and add it to the child list + var nextIndex = (ushort)m_ChildNetworkBehaviours.Count; + networkBehaviours[i].SetNetworkObject(this, nextIndex); + #if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D if (NetworkRigidbodies == null) { @@ -2845,12 +2888,9 @@ internal List ChildNetworkBehaviours #endif } - // Set ourselves as the NetworkObject that this behaviour belongs to and add it to the child list - var nextIndex = (ushort)m_ChildNetworkBehaviours.Count; - networkBehaviours[i].SetNetworkObject(this, nextIndex); // Finally, add the NetworkBehaviour to the list of child NetworkBehaviours - m_ChildNetworkBehaviours.Add(networkBehaviours[i]); + m_ChildNetworkBehaviours.Add(nextIndex, networkBehaviours[i]); } #if UNIFIED_NETCODE @@ -2865,6 +2905,7 @@ internal List ChildNetworkBehaviours { for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) { + m_ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); Destroy(NetworkRigidbodies[i]); } NetworkRigidbodies.Clear(); @@ -2876,6 +2917,7 @@ internal List ChildNetworkBehaviours { for (int i = NetworkTransforms.Count - 1; i >= 0; i--) { + m_ChildNetworkBehaviours.Remove(NetworkTransforms[i].NetworkBehaviourId); Destroy(NetworkTransforms[i]); } NetworkTransforms.Clear(); @@ -2904,9 +2946,10 @@ internal void SynchronizeOwnerNetworkVariables(ulong originalOwnerId, ulong orig var currentOwnerId = OwnerClientId; OwnerClientId = originalOwnerId; PreviousOwnerId = originalPreviousOwnerId; - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - ChildNetworkBehaviours[i].MarkOwnerReadDirtyAndCheckOwnerWriteIsDirty(); + var behaviour = childBehaviour.Value; + behaviour.MarkOwnerReadDirtyAndCheckOwnerWriteIsDirty(); } // Now set the new owner and previous owner identifiers back to their original new values @@ -2977,13 +3020,14 @@ public ushort GetNetworkBehaviourOrderIndex(NetworkBehaviour instance) instance.NetworkBehaviourIdCache = default; } - for (ushort i = 0; i < ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in ChildNetworkBehaviours) { - if (ChildNetworkBehaviours[i] == instance) + var behaviour = childBehaviour.Value; + if (behaviour == instance) { // cache the id, for next query - instance.NetworkBehaviourIdCache = i; - return i; + instance.NetworkBehaviourIdCache = childBehaviour.Key; + return childBehaviour.Key; } } @@ -2997,7 +3041,7 @@ public ushort GetNetworkBehaviourOrderIndex(NetworkBehaviour instance) /// The at the ordered index value or null if it does not exist. public NetworkBehaviour GetNetworkBehaviourAtOrderIndex(ushort index) { - if (index >= ChildNetworkBehaviours.Count) + if (!ChildNetworkBehaviours.ContainsKey(index)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { @@ -3007,11 +3051,13 @@ public NetworkBehaviour GetNetworkBehaviourAtOrderIndex(ushort index) { var currentKnownChildren = new StringBuilder(); currentKnownChildren.Append($"Known child {nameof(NetworkBehaviour)}s:"); - for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + var count = 0; + foreach (var childBehaviour in ChildNetworkBehaviours) { - var childNetworkBehaviour = ChildNetworkBehaviours[i]; - currentKnownChildren.Append($" [{i}] {childNetworkBehaviour.__getTypeName()}"); - currentKnownChildren.Append(i < ChildNetworkBehaviours.Count - 1 ? "," : "."); + var childNetworkBehaviour = childBehaviour.Value; + currentKnownChildren.Append($" [{childBehaviour.Key}] {childNetworkBehaviour.__getTypeName()}"); + currentKnownChildren.Append(count < ChildNetworkBehaviours.Count - 1 ? "," : "."); + count++; } NetworkLog.LogInfo(currentKnownChildren.ToString()); } @@ -3354,8 +3400,8 @@ internal void SynchronizeNetworkBehaviours(ref BufferSerializer serializer // Synchronize NetworkVariables foreach (var behavior in ChildNetworkBehaviours) { - behavior.InitializeVariables(); - behavior.WriteNetworkVariableData(writer, targetClientId); + behavior.Value.InitializeVariables(); + behavior.Value.WriteNetworkVariableData(writer, targetClientId); } // Reserve the NetworkBehaviour synchronization count position @@ -3368,7 +3414,7 @@ internal void SynchronizeNetworkBehaviours(ref BufferSerializer serializer var synchronizationCount = (byte)0; foreach (var childBehaviour in ChildNetworkBehaviours) { - if (childBehaviour.Synchronize(ref serializer, targetClientId)) + if (childBehaviour.Value.Synchronize(ref serializer, targetClientId)) { synchronizationCount++; } @@ -3389,8 +3435,8 @@ internal void SynchronizeNetworkBehaviours(ref BufferSerializer serializer // Apply the network variable synchronization data foreach (var behaviour in ChildNetworkBehaviours) { - behaviour.InitializeVariables(); - behaviour.SetNetworkVariableData(reader, targetClientId); + behaviour.Value.InitializeVariables(); + behaviour.Value.SetNetworkVariableData(reader, targetClientId); } // Read the number of NetworkBehaviours to synchronize @@ -3914,7 +3960,7 @@ internal void OnNetworkBehaviourDestroyed(NetworkBehaviour networkBehaviour) { NetworkLog.LogWarning($"{nameof(NetworkBehaviour)}-{networkBehaviour.name} is being destroyed while {nameof(NetworkObject)}-{name} is still spawned! (could break state synchronization)"); } - ChildNetworkBehaviours.Remove(networkBehaviour); + ChildNetworkBehaviours.Remove(networkBehaviour.NetworkBehaviourId); } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs index a5c279c7c3..cfe0125977 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkTransformMessage.cs @@ -71,7 +71,8 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int } var currentPosition = reader.Position; var networkObjectId = (ulong)0; - var networkBehaviourId = 0; + var networkBehaviourId = (ushort)0; + var networkBehaviourIdRead = 0; ByteUnpacker.ReadValueBitPacked(reader, out networkObjectId); var isSpawnedLocally = networkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId); @@ -91,12 +92,13 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int var ownerAuthoritativeServerSide = false; // Get the behaviour index - ByteUnpacker.ReadValueBitPacked(reader, out networkBehaviourId); + ByteUnpacker.ReadValueBitPacked(reader, out networkBehaviourIdRead); + networkBehaviourId = (ushort)networkBehaviourIdRead; if (isSpawnedLocally) { networkObject = networkManager.SpawnManager.SpawnedObjects[networkObjectId]; - if (networkObject.ChildNetworkBehaviours.Count <= networkBehaviourId || networkObject.ChildNetworkBehaviours[networkBehaviourId] == null) + if (!networkObject.ChildNetworkBehaviours.ContainsKey(networkBehaviourId) || networkObject.ChildNetworkBehaviours[networkBehaviourId] == null) { Debug.LogError($"[{nameof(NetworkTransformMessage)}][Invalid] Targeted {nameof(NetworkTransform)}, {nameof(NetworkBehaviour.NetworkBehaviourId)} ({networkBehaviourId}), does not exist! Make sure you are not spawning {nameof(NetworkObject)}s with disabled {nameof(GameObject)}s that have {nameof(NetworkBehaviour)} components on them."); return false; diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 7ecf74eacb..64e92e980e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -574,9 +574,10 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId, bool // then notify the user they could potentially lose state updates if developer logging is enabled. if (NetworkManager.LogLevel == LogLevel.Developer && !distributedAuthorityMode && m_LastChangeInOwnership.ContainsKey(networkObject.NetworkObjectId) && m_LastChangeInOwnership[networkObject.NetworkObjectId] > Time.realtimeSinceStartup) { - for (int i = 0; i < networkObject.ChildNetworkBehaviours.Count; i++) + foreach (var childBehaviour in networkObject.ChildNetworkBehaviours) { - if (networkObject.ChildNetworkBehaviours[i].NetworkVariableFields.Count > 0) + var behaviour = childBehaviour.Value; + if (behaviour.NetworkVariableFields.Count > 0) { NetworkLog.LogWarningServer($"[Rapid Ownership Change Detected][Potential Loss in State] Detected a rapid change in ownership that exceeds a frequency less than {k_MaximumTickOwnershipChangeMultiplier}x the current network tick rate! Provide at least {k_MaximumTickOwnershipChangeMultiplier}x the current network tick rate between ownership changes to avoid NetworkVariable state loss."); break; diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs b/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs index b61afd40b7..624dd2caeb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs +++ b/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs @@ -69,7 +69,7 @@ public void ProcessReanticipation() { foreach (var behaviour in item.OwnerObject.ChildNetworkBehaviours) { - behaviour.OnReanticipate(lastRoundTripTime); + behaviour.Value.OnReanticipate(lastRoundTripTime); } item.ResetAnticipation(); } From 90559b30117c673ef243c5fb0f5134d49e2bdaf6 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 27 Feb 2026 13:39:51 -0600 Subject: [PATCH 21/99] fix Removing the update registration when cleaning out NetworkRigidbody. --- .../Runtime/Components/NetworkTransform.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs index 944d1483cc..981e2ca331 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs @@ -1797,8 +1797,6 @@ internal void UnregisterRigidbody() { if (m_NetworkRigidbodyInternal) { - NetworkManager.NetworkTransformRegistration(NetworkObject, false, false); - NetworkManager.NetworkTransformRegistration(NetworkObject, true, true); m_NetworkRigidbodyInternal = null; m_UseRigidbodyForMotion = false; } From 21143ec5e025bf7c679017c4c486c6ee57820a13 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 27 Feb 2026 15:35:38 -0600 Subject: [PATCH 22/99] fix Putting back the default world initialization. --- .../Runtime/Core/NetworkManager.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index e9840ec393..d4c4d6d3e7 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1399,7 +1399,8 @@ public bool StartServer() ShutdownInternal(); return false; } - NetCodeConfig.Global.HostWorldModeSelection = NetCodeConfig.HostWorldMode.SingleWorld; + + DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); return true; } @@ -1473,7 +1474,7 @@ public bool StartClient() ShutdownInternal(); return false; } - + DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); // TODO-UNIFIED: Need a way to signal everything completed. return true; @@ -1547,6 +1548,7 @@ public bool StartHost() ShutdownInternal(); return false; } + DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); // TODO-UNIFIED: Need a way to signal everything completed. return true; From e83eb234a5b8f26aac638a5d8b562c7854ab3d03 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 27 Feb 2026 17:04:27 -0600 Subject: [PATCH 23/99] fix The type of world is now handled by the NGO side UnifiedBootStrap. Removing the need to use the MPPM stuff. --- .../Components/Helpers/NetworkObjectBridge.cs | 9 ++++- .../Runtime/Core/NetworkManager.cs | 34 ------------------- 2 files changed, 8 insertions(+), 35 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 37c756bf32..2ff988aea6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -78,7 +78,14 @@ public override bool Initialize(string defaultWorldName) { Instance = this; AutoConnectPort = Port; - CreateDefaultClientServerWorlds(); + if (NetworkManager.Singleton.IsServer) + { + CreateSingleWorldHost("ClientAndServerWorld"); + } + else + { + CreateClientWorld("ClientWorld"); + } var initialized = base.Initialize(defaultWorldName); OnInitialized?.Invoke(initialized); return initialized; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index d4c4d6d3e7..7710bbb155 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1054,10 +1054,6 @@ private void Awake() #endif // Notify we have instantiated a new instance of NetworkManager. OnInstantiated?.Invoke(this); - -#if UNIFIED_NETCODE && UNITY_MULTIPLAYER_PLAYMODE - MPPMCheckInternal.Initialize(); -#endif } private void OnEnable() @@ -2107,36 +2103,6 @@ internal static void OnOneTimeTearDown() public delegate void OnDisconnectDelegate(NetcodeConnection connection); public static OnConnectDelegate OnNetCodeConnect; public static OnDisconnectDelegate OnNetCodeDisconnect; - - // TODO-UNIFIED: For POC only (centralizing) - public static MPPMCheckInfo MPPMCheck => MPPMCheckInternal; - internal static MPPMCheckInfo MPPMCheckInternal = new MPPMCheckInfo(); - public class MPPMCheckInfo - { - public bool Installed { get; private set; } - public bool HasServerTag; - public bool HasClientTag; - internal void Initialize() - { -#if UNITY_MULTIPLAYER_PLAYMODE && UNITY_EDITOR - Installed = true; - var tags = Multiplayer.PlayMode.CurrentPlayer.Tags; - foreach (var tag in tags) - { - if (tag == "Server") - { - HasServerTag = true; - } - else if (tag == "Client") - { - HasClientTag = true; - } - } -#else - Installed = false; -#endif - } - } #endif } } From 9546ff26e0f8334b0807924ee0e58f1906556b5d Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sat, 28 Feb 2026 16:01:57 -0600 Subject: [PATCH 24/99] fix Fixing issue with temporary buffer not being copied over properly when synchronizing. --- .../Runtime/SceneManagement/SceneEventData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 9dcb6ddb2f..7b132c8e7b 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -1157,7 +1157,7 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) { RegistrationTime = UnityEngine.Time.realtimeSinceStartup, SerializedObject = serializedObject, - Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, serializedObject.SynchronizationDataSize) + Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, serializedObject.SynchronizationDataSize, InternalBuffer.Position) }; spawnManager.RegisterGhostPendingSynchronization(newEntry); @@ -1174,9 +1174,9 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) } var spawnedNetworkObject = NetworkObject.Deserialize(serializedObject, InternalBuffer, networkManager); - var noStop = InternalBuffer.Position; if (EnableSerializationLogs) { + var noStop = InternalBuffer.Position; builder.AppendLine($"[Head: {noStart}][Tail: {noStop}][Size: {noStop - noStart}][{spawnedNetworkObject.name}][NID-{spawnedNetworkObject.NetworkObjectId}][Children: {spawnedNetworkObject.ChildNetworkBehaviours.Count}]"); LogArray(InternalBuffer.ToArray(), noStart, noStop, builder); } From 211a50f0628edb532bdc3e863cfd59864b275ee0 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 11:49:17 -0600 Subject: [PATCH 25/99] update Updating runtimetests to the changes in ChildNetworkBehaviours. --- .../Runtime/TestHelpers/Components/ObjectNameIdentifier.cs | 7 +++++++ .../Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs index 17978b49ec..ccbab576d8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs @@ -108,10 +108,17 @@ public override void OnDestroy() DeRegisterNetworkObject(); // This is required otherwise it will try to continue to update the NetworkBehaviour even if // it has been destroyed (most likely integration test specific) +#if UNIFIED_NETCODE + if (m_NetworkObject.ChildNetworkBehaviours != null && m_NetworkObject.ChildNetworkBehaviours.ContainsKey(NetworkBehaviourId)) + { + NetworkObject.ChildNetworkBehaviours.Remove(NetworkBehaviourId); + } +#else if (m_NetworkObject.ChildNetworkBehaviours != null && m_NetworkObject.ChildNetworkBehaviours.Contains(this)) { NetworkObject.ChildNetworkBehaviours.Remove(this); } +#endif m_NetworkObject = null; } base.OnDestroy(); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef index cde139b07f..fa718f8b04 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef @@ -47,6 +47,11 @@ "name": "Unity", "expression": "6000.1.0a1", "define": "HOSTNAME_RESOLUTION_AVAILABLE" + }, + { + "name": "com.unity.netcode", + "expression": "1.10.1", + "define": "UNIFIED_NETCODE" } ], "noEngineReferences": false From c6315cef287a076a03e4f947cbca4697193c5e02 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 15:16:09 -0600 Subject: [PATCH 26/99] fix & update Fixing test project not being able to load without an AnalyticsTests compilation error. Making ObjectNameIdentifier just use the new way we handle ChildNetworkBehaviours (i.e. it is a table now). Marking NetworkObject.ChildNetworkBehaviours comment above as having finished the migration to a table. Noting we should find a better place/way to initialize this stuff. --- .../Runtime/Core/NetworkObject.cs | 8 +++++--- .../TestHelpers/Components/ObjectNameIdentifier.cs | 7 ------- testproject/Assets/Tests/Runtime/AnalyticsTests.cs | 2 +- .../Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef | 3 ++- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 04c2d9cf1b..971464c349 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -2816,11 +2816,13 @@ private NetworkPrefab GetPrefab(NetworkManager networkManager) /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /// Convert ChildNetworkBehaviours to a /// table so removing won't impact things. + /// (Done) + /// + /// Find a place to do this initialization + /// somewhere else so we don't have a + /// megalithic getter. /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /// - - - internal Dictionary ChildNetworkBehaviours { get diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs index ccbab576d8..4f64a78ef2 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/Components/ObjectNameIdentifier.cs @@ -108,17 +108,10 @@ public override void OnDestroy() DeRegisterNetworkObject(); // This is required otherwise it will try to continue to update the NetworkBehaviour even if // it has been destroyed (most likely integration test specific) -#if UNIFIED_NETCODE if (m_NetworkObject.ChildNetworkBehaviours != null && m_NetworkObject.ChildNetworkBehaviours.ContainsKey(NetworkBehaviourId)) { NetworkObject.ChildNetworkBehaviours.Remove(NetworkBehaviourId); } -#else - if (m_NetworkObject.ChildNetworkBehaviours != null && m_NetworkObject.ChildNetworkBehaviours.Contains(this)) - { - NetworkObject.ChildNetworkBehaviours.Remove(this); - } -#endif m_NetworkObject = null; } base.OnDestroy(); diff --git a/testproject/Assets/Tests/Runtime/AnalyticsTests.cs b/testproject/Assets/Tests/Runtime/AnalyticsTests.cs index a841333900..51a35e5016 100644 --- a/testproject/Assets/Tests/Runtime/AnalyticsTests.cs +++ b/testproject/Assets/Tests/Runtime/AnalyticsTests.cs @@ -22,7 +22,7 @@ internal class AnalyticsTests : NetcodeIntegrationTest protected override IEnumerator OnSetup() { NetcodeAnalytics.EnableIntegrationTestAnalytics = true; - m_NetcodeAnalytics = Unity.Netcode.Editor.NetworkManagerHelper.Singleton.NetcodeAnalytics; + m_NetcodeAnalytics = Unity.Netcode.GameObjects.Editor.NetworkManagerHelper.Singleton.NetcodeAnalytics; yield return base.OnSetup(); } diff --git a/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef b/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef index d94d369852..1bd9925469 100644 --- a/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef +++ b/testproject/Assets/Tests/Runtime/TestProject.Runtime.Tests.asmdef @@ -15,7 +15,8 @@ "Unity.Mathematics", "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "Unity.Netcode.Runtime.Tests" + "Unity.Netcode.Runtime.Tests", + "Unity.Netcode.GameObjects.Editor" ], "includePlatforms": [], "excludePlatforms": [], From 9038909c9cc542f72cd204feae940f8bbc5f819a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 16:27:05 -0600 Subject: [PATCH 27/99] update Adding additional log information only displayed when the log level is Developer. --- .../Components/Helpers/NetworkObjectBridge.cs | 11 ++++++++++- .../Runtime/Core/NetworkManager.cs | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 2ff988aea6..53e58b4081 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -76,15 +76,24 @@ internal class UnifiedBootStrap : ClientServerBootstrap public override bool Initialize(string defaultWorldName) { + var networkManager = NetworkManager.Singleton; Instance = this; AutoConnectPort = Port; - if (NetworkManager.Singleton.IsServer) + if (networkManager.IsServer) { CreateSingleWorldHost("ClientAndServerWorld"); + if (networkManager.LogLevel <= LogLevel.Developer) + { + UnityEngine.Debug.Log("Creating world: ClientAndServerWorld"); + } } else { CreateClientWorld("ClientWorld"); + if (networkManager.LogLevel <= LogLevel.Developer) + { + UnityEngine.Debug.Log("Creating world: ClientWorld"); + } } var initialized = base.Initialize(defaultWorldName); OnInitialized?.Invoke(initialized); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 7710bbb155..aa74501e5f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1323,7 +1323,11 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType { yield return null; } - + if (LogLevel <= LogLevel.Developer) + { + Debug.Log("All hybrid prefabs have been registered!"); + Debug.Log("Finalizing NetworkManager start..."); + } switch (startType) { case StartType.Server: @@ -1395,7 +1399,10 @@ public bool StartServer() ShutdownInternal(); return false; } - + if (LogLevel <= LogLevel.Developer) + { + Debug.Log("Creating world: Default world"); + } DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); return true; @@ -1470,6 +1477,10 @@ public bool StartClient() ShutdownInternal(); return false; } + if (LogLevel <= LogLevel.Developer) + { + Debug.Log("Creating world: Default world"); + } DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); // TODO-UNIFIED: Need a way to signal everything completed. @@ -1544,6 +1555,10 @@ public bool StartHost() ShutdownInternal(); return false; } + if (LogLevel <= LogLevel.Developer) + { + Debug.Log("Creating world: Default world"); + } DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); // TODO-UNIFIED: Need a way to signal everything completed. From 526f30b93c09ab3bce6c84901a7f5b72fd7b22aa Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 17:46:06 -0600 Subject: [PATCH 28/99] update Possible fix for an edge case scenario during synchronization. --- .../Runtime/SceneManagement/SceneEventData.cs | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs index 7b132c8e7b..407099ef52 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs @@ -1146,24 +1146,37 @@ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager) #if UNIFIED_NETCODE // TODO-UNIFIED: This is a temporary POC fix to handle synchronizing hybrid spawned objects where the Ghost instance might not yet exist. - if (serializedObject.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(serializedObject.NetworkObjectId)) + if (serializedObject.HasGhost) { - if (networkManager.LogLevel == LogLevel.Developer) + if (!networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(serializedObject.NetworkObjectId)) { - UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Deferring creation of NetworkObjectId-{serializedObject.NetworkObjectId} to wait for Ghost."); - } - - var newEntry = new PendingGhostSpawnEntry() - { - RegistrationTime = UnityEngine.Time.realtimeSinceStartup, - SerializedObject = serializedObject, - Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, serializedObject.SynchronizationDataSize, InternalBuffer.Position) - }; + if (networkManager.LogLevel == LogLevel.Developer) + { + UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Deferring creation of NetworkObjectId-{serializedObject.NetworkObjectId} to wait for Ghost."); + } - spawnManager.RegisterGhostPendingSynchronization(newEntry); + var newEntry = new PendingGhostSpawnEntry() + { + RegistrationTime = UnityEngine.Time.realtimeSinceStartup, + SerializedObject = serializedObject, + Buffer = new FastBufferReader(InternalBuffer, Allocator.Persistent, serializedObject.SynchronizationDataSize, InternalBuffer.Position) + }; - InternalBuffer.Seek(InternalBuffer.Position + serializedObject.SynchronizationDataSize); - continue; + spawnManager.RegisterGhostPendingSynchronization(newEntry); + InternalBuffer.Seek(InternalBuffer.Position + serializedObject.SynchronizationDataSize); + continue; + } + else if (networkManager.SpawnManager.GhostsPendingSpawn[serializedObject.NetworkObjectId] == null) + { + if (networkManager.LogLevel == LogLevel.Developer) + { + UnityEngine.Debug.Log($"[{nameof(SceneEventData)}][{nameof(SynchronizeSceneNetworkObjects)}] Dropping creation of NetworkObjectId-{serializedObject.NetworkObjectId} as it has an entry but no longer exists!"); + } + // If it no longer exists, then just remove the entry and skip it. + InternalBuffer.Seek(InternalBuffer.Position + serializedObject.SynchronizationDataSize); + networkManager.SpawnManager.GhostsPendingSpawn.Remove(serializedObject.NetworkObjectId); + continue; + } } #endif From ff84ee228aeeb60c997a043cf525e6d40b951785 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Mon, 2 Mar 2026 17:56:44 -0600 Subject: [PATCH 29/99] Transport sharing WIP --- .../Components/Helpers/NetworkObjectBridge.cs | 12 + .../Runtime/Core/NetworkManager.cs | 6 + .../Runtime/Transports/Unified.meta | 3 + .../Unified/UnifiedNetcodeTransport.cs | 287 ++++++++++++++++++ .../Unified/UnifiedNetcodeTransport.cs.meta | 3 + 5 files changed, 311 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Unified.meta create mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 53e58b4081..0b2f068b7e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -99,6 +99,18 @@ public override bool Initialize(string defaultWorldName) OnInitialized?.Invoke(initialized); return initialized; } + + public static void StopClient() + { + ClientWorld.Dispose(); + ClientWorlds.Remove(ClientWorld); + } + + public static void StopServer() + { + ServerWorld.Dispose(); + ServerWorlds.Remove(ServerWorld); + } ~UnifiedBootStrap() { diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index aa74501e5f..35f6cc3d9d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -8,6 +8,7 @@ #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; +using Unity.Netcode.Unified; using UnityEngine; #if UNITY_EDITOR using UnityEditor; @@ -1212,6 +1213,11 @@ internal void Initialize(bool server) // UnityTransport dependencies are then initialized RealTimeProvider = ComponentFactory.Create(this); + +#if UNIFIED_NETCODE + NetworkConfig.NetworkTransport = gameObject.AddComponent(); +#endif + MetricsManager.Initialize(this); { diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Unified.meta new file mode 100644 index 0000000000..b4340f3a18 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5ce5c8d0dc8948aab8482e617eccabcc +timeCreated: 1772129529 \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs new file mode 100644 index 0000000000..3793461316 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -0,0 +1,287 @@ +#if UNIFIED_NETCODE +using System; +using System.Collections.Generic; +using System.Text; +using Unity.Burst; +using Unity.Burst.Intrinsics; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using Unity.Entities; +using Unity.NetCode; +using Unity.Networking.Transport; +using UnityEngine; + +namespace Unity.Netcode.Unified +{ + internal struct TransportRpc : IRpcCommand, IRpcCommandSerializer + { + public FixedList4096Bytes Buffer; + + internal static string ByteArrayToString(FixedList4096Bytes ba, int offset, int count) + { + var hex = new StringBuilder(ba.Length * 2); + for (int i = offset; i < offset + count; ++i) + { + hex.AppendFormat("{0:x2} ", ba[i]); + } + + return hex.ToString(); + } + internal static string ByteArrayToString(NativeArray ba, int offset, int count) + { + var hex = new StringBuilder(ba.Length * 2); + for (int i = offset; i < offset + count; ++i) + { + hex.AppendFormat("{0:x2} ", ba[i]); + } + + return hex.ToString(); + } + + public unsafe void Serialize(ref DataStreamWriter writer, in RpcSerializerState state, in TransportRpc data) + { + writer.WriteInt(data.Buffer.Length); + var span = new Span(data.Buffer.GetUnsafePtr(), data.Buffer.Length); + writer.WriteBytes(span); + } + + public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerState state, ref TransportRpc data) + { + var length = reader.ReadInt(); + data.Buffer = new FixedList4096Bytes(); + data.Buffer.Length = length; + var span = new Span(data.Buffer.GetUnsafePtr(), length); + reader.ReadBytes(span); + } + + [BurstCompile(DisableDirectCall = true)] + private static void InvokeExecute(ref RpcExecutor.Parameters parameters) + { + RpcExecutor.ExecuteCreateRequestComponent(ref parameters); + } + + static readonly PortableFunctionPointer InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); + + public PortableFunctionPointer CompileExecute() + { + return InvokeExecuteFunctionPointer; + } + } + + [UpdateInGroup(typeof(RpcCommandRequestSystemGroup))] + [CreateAfter(typeof(RpcSystem))] + [BurstCompile] + partial struct TransportRpcCommandRequestSystem : ISystem + { + private RpcCommandRequest m_Request; + + [BurstCompile] + struct SendRpc : IJobChunk + { + public RpcCommandRequest.SendRpcData data; + + public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask) + { + data.Execute(chunk, unfilteredChunkIndex); + } + } + + public void OnCreate(ref SystemState state) + { + m_Request.OnCreate(ref state); + } + + [BurstCompile] + public void OnUpdate(ref SystemState state) + { + var sendJob = new SendRpc { data = m_Request.InitJobData(ref state) }; + state.Dependency = sendJob.Schedule(m_Request.Query, state.Dependency); + } + } + + + internal partial class UnifiedNetcodeUpdateSystem : SystemBase + { + public UnifiedNetcodeTransport Transport; + + public List DiscconedtQueue = new List(); + + public void Disconnect(Connection connection) + { + DiscconedtQueue.Add(connection); + } + + protected override void OnUpdate() + { + using var commandBuffer = new EntityCommandBuffer(Allocator.Temp); + foreach(var (request, rpc, entity) in SystemAPI.Query, RefRW>().WithEntityAccess()) + { + var connectionId = SystemAPI.GetComponent(request.ValueRO.SourceConnection).Value; + + var buffer = rpc.ValueRW.Buffer; + Transport.DispatchMessage(connectionId, buffer); + commandBuffer.DestroyEntity(entity); + } + + foreach (var connection in DiscconedtQueue) + { + commandBuffer.AddComponent(connection.ConnectionEntity); + } + commandBuffer.Playback(EntityManager); + DiscconedtQueue.Clear(); + } + } + + internal class UnifiedNetcodeTransport : NetworkTransport + { + private int m_ServerClientId = -1; + public override ulong ServerClientId => (ulong)m_ServerClientId; + + private bool m_IsClient; + private bool m_IsServer; + private bool m_StartedServerWorld = false; + private bool m_StartedClientWorld = false; + + private IRealTimeProvider m_RealTimeProvider; + + private Dictionary m_Connections; + + internal void DispatchMessage(int connectionId, FixedList4096Bytes buffer) + { + ArraySegment data = new ArraySegment(buffer.ToArray()); + InvokeOnTransportEvent(NetworkEvent.Data, (ulong)connectionId, data, m_RealTimeProvider.RealTimeSinceStartup); + } + + public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) + { + if (!m_Connections.TryGetValue((int)clientId, out Connection connection)) + { + return; + } + + var rpc = new TransportRpc + { + Buffer = new FixedList4096Bytes(), + }; + + unsafe + { + rpc.Buffer.Length = payload.Count; + fixed (byte* data = payload.Array) + { + UnsafeUtility.MemCpy(rpc.Buffer.GetUnsafePtr(), (void*)(data + payload.Offset), payload.Count); + } + } + + connection.SendMessage(rpc); + } + + public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) + { + clientId = 0; + payload = default; + receiveTime = 0; + return NetworkEvent.Nothing; + } + + private void OnClientConnectedToServer(Connection connection, NetCodeConnectionEvent connectionEvent) + { + m_Connections[connection.NetworkId.Value] = connection; + m_ServerClientId = connection.NetworkId.Value; + InvokeOnTransportEvent(NetworkEvent.Connect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); + } + + private void OnServerNewClientConnection(Connection connection, NetCodeConnectionEvent connectionEvent) + { + m_Connections[connection.NetworkId.Value] = connection; + InvokeOnTransportEvent(NetworkEvent.Connect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); + } + + private void OnClientDisconnectFromServer(Connection connection, NetCodeConnectionEvent connectionEvent) + { + InvokeOnTransportEvent(NetworkEvent.Disconnect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); + } + + private void OnServerClientDisconnected(Connection connection, NetCodeConnectionEvent connectionEvent) + { + InvokeOnTransportEvent(NetworkEvent.Disconnect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); + } + + public override bool StartClient() + { + if (!UnifiedBootStrap.HasClientWorlds) + { + UnifiedBootStrap.CreateClientWorld("ClientWorld"); + m_StartedClientWorld = true; + } + + NetCode.Netcode.Client.OnConnect = OnClientConnectedToServer; + NetCode.Netcode.Client.OnDisconnect = OnClientDisconnectFromServer; + var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); + updateSystem.Transport = this; + return true; + } + + public override bool StartServer() + { + if (!UnifiedBootStrap.HasServerWorld) + { + UnifiedBootStrap.CreateServerWorld("ServerWorld"); + m_StartedClientWorld = true; + } + else + { + foreach (var connection in NetCode.Netcode.Server.Connections) + { + OnServerNewClientConnection(connection, default); + } + } + + NetCode.Netcode.Server.OnConnect = OnServerNewClientConnection; + NetCode.Netcode.Server.OnDisconnect = OnServerClientDisconnected; + var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); + updateSystem.Transport = this; + return true; + } + + public override void DisconnectRemoteClient(ulong clientId) + { + var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); + updateSystem.Disconnect(m_Connections[(int)clientId]); + m_Connections.Remove((int)clientId); + } + + public override void DisconnectLocalClient() + { + var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); + updateSystem.Disconnect(m_Connections[(int)ServerClientId]); + m_Connections.Remove((int)ServerClientId); + } + + public override ulong GetCurrentRtt(ulong clientId) + { + // todo + return 0; + //return (ulong)m_Connections[(int)clientId].RTT; + } + + public override void Shutdown() + { + if (m_StartedClientWorld) + { + UnifiedBootStrap.StopClient(); + } + if (m_StartedServerWorld) + { + UnifiedBootStrap.StopServer(); + } + } + + public override void Initialize(NetworkManager networkManager = null) + { + m_Connections = new Dictionary(); + m_RealTimeProvider = networkManager.RealTimeProvider; + } + } +} +#endif \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs.meta b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs.meta new file mode 100644 index 0000000000..ace36beccc --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9980b4e2027240ceb731e395dc270359 +timeCreated: 1772129541 \ No newline at end of file From ea80eb03ad31153f95619f41f8d34bb668cba663 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 18:19:59 -0600 Subject: [PATCH 30/99] update preserve hybrid objects pending spawn. --- .../Runtime/Spawning/NetworkSpawnManager.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 64e92e980e..fcf3d146e8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -40,7 +40,13 @@ public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong network { Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); } - GhostsPendingSpawn.TryAdd(networkObjectId, networkObject); + if(GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) + { + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // For now, move any pending object into the DDOL. + UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + } + NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); if (GhostsArePendingSynchronization && GhostsPendingSynchronization.ContainsKey(networkObjectId)) { @@ -95,6 +101,9 @@ internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool rem // networkObject.InternalInSceneNetworkObjectsSpawned(); //} + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. + UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); if (removeUponSpawn) { GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; From 3d4a803fc6c84ce2be1b695ff07d510ba4cbd97f Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 2 Mar 2026 19:38:56 -0600 Subject: [PATCH 31/99] update Temporary fix for missed sync. --- .../Runtime/Core/NetworkManager.cs | 5 ++ .../Runtime/Core/NetworkObject.cs | 18 ++++++- .../Runtime/Spawning/NetworkSpawnManager.cs | 54 ++++++++++++++++--- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index aa74501e5f..c90c443d5f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -348,6 +348,11 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) { NetworkConfig.Prefabs.RegisterGhostPrefabs(this); } + + if (!IsServer) + { + SpawnManager?.CheckGhostsPendingNetworkObjectId(); + } #endif UpdateTopology(); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 971464c349..c18c7f7aed 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3854,13 +3854,27 @@ private void InitGhost() } } - private void RegisterGhostBridge() + internal bool IsGhostNetworkObjectIdValid() + { + if (NetworkObjectBridge == null) + { + return false; + } + // TODO-UNIFIED: Sometimes the GhostField can be latent. Need a way to know the GhostField has been set. + return NetworkObjectBridge.NetworkObjectId.Value < 1000000; + } + + internal void RegisterGhostBridge() { if (NetworkManager.LogLevel == LogLevel.Developer) { Debug.Log($"[{nameof(NetworkObject)}][{nameof(NetworkObjectId)}] NetworkObjectBridge notified instance exists with assigned ID of: {NetworkObjectBridge.NetworkObjectId.Value}"); } - NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); + + if (!NetworkManager.IsServer) + { + NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); + } } private void OnNetworkObjectIdChanged(ulong networkObjectId) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index fcf3d146e8..08231f2856 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -34,8 +34,41 @@ public class NetworkSpawnManager internal readonly Dictionary GhostsPendingSpawn = new Dictionary(); - public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) + internal readonly List GhostsPendingNetworkObjectId = new List(); + + internal void CheckGhostsPendingNetworkObjectId() + { + if (GhostsPendingNetworkObjectId.Count == 0) + { + return; + } + + for(int i = GhostsPendingNetworkObjectId.Count - 1; i >= 0; i--) + { + var networkObject = GhostsPendingNetworkObjectId[i]; + if (networkObject.IsGhostNetworkObjectIdValid()) + { + GhostsPendingNetworkObjectId.Remove(networkObject); + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] {networkObject.name}'s Ghost {nameof(NetworkObject.NetworkObjectId)} is valid. Re-registering."); + } + networkObject.RegisterGhostBridge(); + } + } + } + + internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) { + if (!networkObject.IsGhostNetworkObjectIdValid()) + { + GhostsPendingNetworkObjectId.Add(networkObject); + if (NetworkManager.LogLevel == LogLevel.Developer) + { + Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] {networkObject.name}'s Ghost {nameof(NetworkObject.NetworkObjectId)} ({networkObjectId}) seems invalid. Adding to the pending NetworkObjectId list."); + } + return; + } if (NetworkManager.LogLevel == LogLevel.Developer) { Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); @@ -43,13 +76,17 @@ public void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong network if(GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) { // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // For now, move any pending object into the DDOL. + // For now, move any pending object into the DDOL. UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); } NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); if (GhostsArePendingSynchronization && GhostsPendingSynchronization.ContainsKey(networkObjectId)) { + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. + UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + // When the object is spawned, it will invoke GetGhostNetworkObjectForSpawn below which removes the entry from GhostsPendingSpawn ProcessGhostPendingSynchronization(networkObjectId); } @@ -64,6 +101,9 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) } var networkObject = GhostsPendingSpawn[networkObjectId]; GhostsPendingSpawn.Remove(networkObjectId); + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. + UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); return networkObject; } @@ -100,10 +140,6 @@ internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool rem //{ // networkObject.InternalInSceneNetworkObjectsSpawned(); //} - - // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. - UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); if (removeUponSpawn) { GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; @@ -2020,6 +2056,12 @@ internal NetworkSpawnManager(NetworkManager networkManager) internal void Shutdown() { +#if UNIFIED_NETCODE + GhostsPendingNetworkObjectId.Clear(); + GhostsPendingNetworkObjectId.Clear(); + GhostsPendingSpawn.Clear(); + GhostsPendingSynchronization.Clear(); +#endif NetworkObjectsToSynchronizeSceneChanges.Clear(); CleanUpDisposedObjects.Clear(); } From a6b852f1dbb63c2d1b1772d3bb596ed801a4202c Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 10:22:40 -0600 Subject: [PATCH 32/99] update Delay in-game state for new connections to provide NGO time to start synchronization. --- .../Helpers/UnifiedUpdateConnections.cs | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 93918a66b4..58e09d22f3 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -13,6 +13,8 @@ public struct NetcodeConnection internal Entity Entity; public int NetworkId; + internal float ConnectedTime; + public bool IsServer => World.IsServer(); public void GoInGame() { @@ -29,8 +31,12 @@ public void SendMessage(T message) where T : unmanaged, IRpcCommand internal partial class UnifiedUpdateConnections : SystemBase { private List m_TempConnections = new List(); + + private Dictionary m_NewConnections = new Dictionary(); + protected override void OnUpdate() { + var isServer = World.IsServer(); var commandBuffer = new EntityCommandBuffer(Allocator.Temp); foreach (var (networkId, connectionState, entity) in SystemAPI.Query().WithNone().WithEntityAccess()) { @@ -44,18 +50,40 @@ protected override void OnUpdate() m_TempConnections.Clear(); + foreach (var (networkId, entity) in SystemAPI.Query().WithAll().WithNone().WithEntityAccess()) { - commandBuffer.AddComponent(entity); - commandBuffer.AddComponent(entity, default(ConnectionState)); - m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + // TODO-Unified: For new connections, we have a delay before the N4E in-game state for the client to provide time for the NGO side of the client to synchronize. + // Note: Once both are using the same transport we should be able to get the transport id and determine the NGO assigned client-id and at that point once the + // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). + if (!m_NewConnections.ContainsKey(networkId.Value)) + { + var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + 1.0f }; + m_NewConnections.Add(networkId.Value, newConnection); + } } - foreach (var con in m_TempConnections) + // If we have any pending connections + if (m_NewConnections.Count > 0) { - NetworkManager.OnNetCodeConnect?.Invoke(con); + foreach (var entry in m_NewConnections) + { + // Check if the delay time has passed. + if (entry.Value.ConnectedTime < UnityEngine.Time.realtimeSinceStartup) + { + // Set the connection in-game + commandBuffer.AddComponent(entry.Value.Entity); + commandBuffer.AddComponent(entry.Value.Entity, default(ConnectionState)); + NetworkManager.OnNetCodeConnect?.Invoke(entry.Value); + m_TempConnections.Add(entry.Value); + } + } + // Remove any connections that have "gone in-game". + foreach (var connection in m_TempConnections) + { + m_NewConnections.Remove(connection.NetworkId); + } } - m_TempConnections.Clear(); commandBuffer.Playback(EntityManager); From cce11854835a17f30cf73cdf1412f9a2f8130392 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 11:52:40 -0600 Subject: [PATCH 33/99] update --- .../Runtime/Components/Helpers/UnifiedUpdateConnections.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 58e09d22f3..321b5c98d5 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -58,7 +58,8 @@ protected override void OnUpdate() // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + 1.0f }; + var delayTime = isServer ? 0.5f : 1.0f; + var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; m_NewConnections.Add(networkId.Value, newConnection); } } From 91cf538e79f118aa8d561e84dbdd91b8959489ba Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 12:49:14 -0600 Subject: [PATCH 34/99] update Removing a hack work around that is no longer needed due to recent fixes merged in the dots repo side. --- .../Runtime/Core/NetworkManager.cs | 5 --- .../Runtime/Core/NetworkObject.cs | 10 ----- .../Runtime/Spawning/NetworkSpawnManager.cs | 37 +------------------ 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index e34ea6cd03..c2bbb06779 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -348,11 +348,6 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) { NetworkConfig.Prefabs.RegisterGhostPrefabs(this); } - - if (!IsServer) - { - SpawnManager?.CheckGhostsPendingNetworkObjectId(); - } #endif UpdateTopology(); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index c18c7f7aed..92bbffa48a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3854,16 +3854,6 @@ private void InitGhost() } } - internal bool IsGhostNetworkObjectIdValid() - { - if (NetworkObjectBridge == null) - { - return false; - } - // TODO-UNIFIED: Sometimes the GhostField can be latent. Need a way to know the GhostField has been set. - return NetworkObjectBridge.NetworkObjectId.Value < 1000000; - } - internal void RegisterGhostBridge() { if (NetworkManager.LogLevel == LogLevel.Developer) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 5348bce2ad..3ca913394c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -34,46 +34,13 @@ public class NetworkSpawnManager internal readonly Dictionary GhostsPendingSpawn = new Dictionary(); - internal readonly List GhostsPendingNetworkObjectId = new List(); - - internal void CheckGhostsPendingNetworkObjectId() - { - if (GhostsPendingNetworkObjectId.Count == 0) - { - return; - } - - for(int i = GhostsPendingNetworkObjectId.Count - 1; i >= 0; i--) - { - var networkObject = GhostsPendingNetworkObjectId[i]; - if (networkObject.IsGhostNetworkObjectIdValid()) - { - GhostsPendingNetworkObjectId.Remove(networkObject); - if (NetworkManager.LogLevel == LogLevel.Developer) - { - Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] {networkObject.name}'s Ghost {nameof(NetworkObject.NetworkObjectId)} is valid. Re-registering."); - } - networkObject.RegisterGhostBridge(); - } - } - } - internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) { - if (!networkObject.IsGhostNetworkObjectIdValid()) - { - GhostsPendingNetworkObjectId.Add(networkObject); - if (NetworkManager.LogLevel == LogLevel.Developer) - { - Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] {networkObject.name}'s Ghost {nameof(NetworkObject.NetworkObjectId)} ({networkObjectId}) seems invalid. Adding to the pending NetworkObjectId list."); - } - return; - } if (NetworkManager.LogLevel == LogLevel.Developer) { Debug.Log($"[{nameof(RegisterGhostPendingSpawn)}] Registering {networkObject.name} with a {nameof(NetworkObject.NetworkObjectId)} of {networkObjectId}."); } - if(GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) + if (GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) { // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. // For now, move any pending object into the DDOL. @@ -2041,8 +2008,6 @@ internal NetworkSpawnManager(NetworkManager networkManager) internal void Shutdown() { #if UNIFIED_NETCODE - GhostsPendingNetworkObjectId.Clear(); - GhostsPendingNetworkObjectId.Clear(); GhostsPendingSpawn.Clear(); GhostsPendingSynchronization.Clear(); #endif From 5802407261f91100484f219865d28253c34d9946 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 12:53:07 -0600 Subject: [PATCH 35/99] update Lowering the in-game connection delay. --- .../Runtime/Components/Helpers/UnifiedUpdateConnections.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 321b5c98d5..1f21f609c1 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -58,7 +58,7 @@ protected override void OnUpdate() // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var delayTime = isServer ? 0.5f : 1.0f; + var delayTime = isServer ? 0.05f : 0.1f; var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; m_NewConnections.Add(networkId.Value, newConnection); } From da1beaf10bc264c46f12d656839009f80097d120 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 17:32:30 -0600 Subject: [PATCH 36/99] update Fixing hybrid prefab registration and world initialization order. --- .../Components/Helpers/NetworkObjectBridge.cs | 51 +++++++++++++------ .../Helpers/UnifiedUpdateConnections.cs | 2 +- .../Runtime/Core/NetworkManager.cs | 26 ++++------ 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 53e58b4081..91d950a418 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -1,5 +1,6 @@ #if UNIFIED_NETCODE using System; +using Unity.Entities; using Unity.NetCode; namespace Unity.Netcode @@ -25,7 +26,7 @@ public override void Awake() { if (UnifiedBootStrap.Instance != null) { - Initialize(true); + Initialize(); } else { @@ -33,7 +34,7 @@ public override void Awake() } } - private void Initialize(bool initialized) + private void Initialize() { UnifiedBootStrap.OnInitialized -= Initialize; if (gameObject != null) @@ -71,33 +72,53 @@ public override void OnDestroy() internal class UnifiedBootStrap : ClientServerBootstrap { public static UnifiedBootStrap Instance { get; private set; } - public static Action OnInitialized; + public static Action OnInitialized; public static ushort Port = 7979; + public static World World { get; private set; } + public override bool Initialize(string defaultWorldName) { var networkManager = NetworkManager.Singleton; Instance = this; AutoConnectPort = Port; - if (networkManager.IsServer) + if (base.Initialize(defaultWorldName)) { - CreateSingleWorldHost("ClientAndServerWorld"); - if (networkManager.LogLevel <= LogLevel.Developer) - { - UnityEngine.Debug.Log("Creating world: ClientAndServerWorld"); - } + UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); + return true; } - else + + World = networkManager.IsServer ? CreateSingleWorldHost("ClientAndServerWorld") : CreateClientWorld("ClientWorld"); + + if (World == null) + { + UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); + return false; + } + + if (!World.IsCreated) + { + UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); + return false; + } + + if (networkManager.LogLevel <= LogLevel.Developer) + { + NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Created world: {World.Name}"); + } + + if (networkManager.NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - CreateClientWorld("ClientWorld"); if (networkManager.LogLevel <= LogLevel.Developer) { - UnityEngine.Debug.Log("Creating world: ClientWorld"); + NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Registering hybrid prefabs..."); } + networkManager.NetworkConfig.Prefabs.RegisterGhostPrefabs(networkManager); } - var initialized = base.Initialize(defaultWorldName); - OnInitialized?.Invoke(initialized); - return initialized; + + OnInitialized?.Invoke(); + + return true; } ~UnifiedBootStrap() diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 1f21f609c1..58b0820e74 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -58,7 +58,7 @@ protected override void OnUpdate() // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var delayTime = isServer ? 0.05f : 0.1f; + var delayTime = isServer ? 0.2f : 0.1f; var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; m_NewConnections.Add(networkId.Value, newConnection); } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index c2bbb06779..467f685789 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -341,15 +341,6 @@ public void NetworkUpdate(NetworkUpdateStage updateStage) { case NetworkUpdateStage.EarlyUpdate: { -#if UNIFIED_NETCODE - // Temporary work around for handling the registration - // of hybrid spawned objects. - if (NetworkConfig.Prefabs.HasPendingGhostPrefabs) - { - NetworkConfig.Prefabs.RegisterGhostPrefabs(this); - } -#endif - UpdateTopology(); // Handle processing any new connections or transport events @@ -1319,14 +1310,22 @@ private bool CanStart(StartType type) #if UNIFIED_NETCODE private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) { + DefaultWorldInitialization.Initialize("Default World", false); + var waitTime = new WaitForSeconds(0.016f); + // This should not be needed at this point, but here in the event something changes. while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - yield return null; + if (LogLevel <= LogLevel.Developer) + { + NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Ghosts are still pending registration!"); + } + NetworkConfig.Prefabs.RegisterGhostPrefabs(this); + yield return waitTime; } if (LogLevel <= LogLevel.Developer) { - Debug.Log("All hybrid prefabs have been registered!"); - Debug.Log("Finalizing NetworkManager start..."); + NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] All hybrid prefabs have been registered!"); + NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Finalizing NetworkManager start..."); } switch (startType) { @@ -1413,7 +1412,6 @@ public bool StartServer() { Debug.Log("Creating world: Default world"); } - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server)); return true; } @@ -1501,7 +1499,6 @@ public bool StartClient() { Debug.Log("Creating world: Default world"); } - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client)); // TODO-UNIFIED: Need a way to signal everything completed. return true; @@ -1589,7 +1586,6 @@ public bool StartHost() { Debug.Log("Creating world: Default world"); } - DefaultWorldInitialization.Initialize("Default World", false); StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host)); // TODO-UNIFIED: Need a way to signal everything completed. return true; From f2f658059ec51bac42a66c234482e9416fab90d6 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 3 Mar 2026 20:13:36 -0600 Subject: [PATCH 37/99] update Some fixes that should accompany the N4E POC branch. --- .../Components/Helpers/NetworkObjectBridge.cs | 42 +------------------ .../Helpers/UnifiedUpdateConnections.cs | 2 +- .../Runtime/Core/NetworkManager.cs | 4 ++ .../Runtime/Spawning/NetworkSpawnManager.cs | 1 - 4 files changed, 6 insertions(+), 43 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 91d950a418..41dddaaf12 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -15,53 +15,13 @@ namespace Unity.Netcode public partial class NetworkObjectBridge : GhostBehaviour { public Action NetworkObjectIdChanged; - + internal GhostField NetworkObjectId = new GhostField(); public void SetNetworkObjectId(ulong value) { NetworkObjectId.Value = value; } - public override void Awake() - { - if (UnifiedBootStrap.Instance != null) - { - Initialize(); - } - else - { - UnifiedBootStrap.OnInitialized += Initialize; - } - } - - private void Initialize() - { - UnifiedBootStrap.OnInitialized -= Initialize; - if (gameObject != null) - { - base.Awake(); - NetworkObjectId.ValueChanged += OnNetworkObjectIdChanged; - } - } - - private void OnNetworkObjectIdChanged(ulong value) - { - NetworkObjectIdChanged?.Invoke(value); - } - - internal void OnDespawn(bool shouldDestroy) - { - if (shouldDestroy) - { - UnifiedBootStrap.OnInitialized -= Initialize; - } - } - - public override void OnDestroy() - { - UnifiedBootStrap.OnInitialized -= Initialize; - base.OnDestroy(); - } } /// diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 58b0820e74..4237869496 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -58,7 +58,7 @@ protected override void OnUpdate() // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var delayTime = isServer ? 0.2f : 0.1f; + var delayTime = 0.0f;// isServer ? 0.2f : 0.1f; var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; m_NewConnections.Add(networkId.Value, newConnection); } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 467f685789..d6da22d2ce 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1310,6 +1310,10 @@ private bool CanStart(StartType type) #if UNIFIED_NETCODE private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) { + if (NetCode.Netcode.IsActive) + { + NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point."); + } DefaultWorldInitialization.Initialize("Default World", false); var waitTime = new WaitForSeconds(0.016f); // This should not be needed at this point, but here in the event something changes. diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 3ca913394c..9168761037 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1864,7 +1864,6 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec // Let unified netcode handle destroying if (destroyGameObject && networkObject.HasGhost && !NetworkManager.IsServer) { - networkObject.NetworkObjectBridge.OnDespawn(destroyGameObject); // exit early return; } From fd1263f4359f6a580a498ef2fe5cdb0713cec445 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 5 Mar 2026 10:15:19 -0600 Subject: [PATCH 38/99] - Delay connections from going in game in N4E until initial NGO sync has finished - Handle messages too large to be sent as a single RPC in N4E (using BatchedSendQueue and BatchedReceiveQueue) - Handle RPCs being received out of order - Switched connection flow so that connection is initialized by the transport (typical NGO flow) rather than using AutoConnectPort. --- .../Components/Helpers/NetworkObjectBridge.cs | 2 +- .../Helpers/UnifiedUpdateConnections.cs | 14 +- .../Messaging/Messages/SceneEventMessage.cs | 8 + .../Unified/UnifiedNetcodeTransport.cs | 161 ++++++++++++------ 4 files changed, 132 insertions(+), 53 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 086cd09c0a..c0f3ceb295 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -41,7 +41,7 @@ public override bool Initialize(string defaultWorldName) { var networkManager = NetworkManager.Singleton; Instance = this; - AutoConnectPort = Port; + AutoConnectPort = 0; if (base.Initialize(defaultWorldName)) { UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 4237869496..efece3bc56 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -14,6 +14,7 @@ public struct NetcodeConnection public int NetworkId; internal float ConnectedTime; + internal bool IsSynced; public bool IsServer => World.IsServer(); public void GoInGame() @@ -34,6 +35,15 @@ internal partial class UnifiedUpdateConnections : SystemBase private Dictionary m_NewConnections = new Dictionary(); + public void MarkSync(int NetworkId) + { + if (m_NewConnections.TryGetValue(NetworkId, out var connection)) + { + connection.IsSynced = true; + m_NewConnections[NetworkId] = connection; + } + } + protected override void OnUpdate() { var isServer = World.IsServer(); @@ -59,7 +69,7 @@ protected override void OnUpdate() if (!m_NewConnections.ContainsKey(networkId.Value)) { var delayTime = 0.0f;// isServer ? 0.2f : 0.1f; - var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; + var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime, IsSynced = isServer}; m_NewConnections.Add(networkId.Value, newConnection); } } @@ -70,7 +80,7 @@ protected override void OnUpdate() foreach (var entry in m_NewConnections) { // Check if the delay time has passed. - if (entry.Value.ConnectedTime < UnityEngine.Time.realtimeSinceStartup) + if (entry.Value.IsSynced && entry.Value.ConnectedTime < UnityEngine.Time.realtimeSinceStartup) { // Set the connection in-game commandBuffer.AddComponent(entry.Value.Entity); diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs index 25c53a2786..320dc2ba1a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs @@ -1,4 +1,7 @@ +using Unity.Netcode.Components; +using Unity.Netcode.Unified; + namespace Unity.Netcode { // Todo: Would be lovely to get this one nicely formatted with all the data it sends in the struct @@ -27,6 +30,11 @@ public void Handle(ref NetworkContext context) { var networkManager = (NetworkManager)context.SystemOwner; networkManager.SceneManager.HandleSceneEvent(context.SenderId, m_ReceivedData); + +#if UNIFIED_NETCODE + var unifiedConnectionSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); + unifiedConnectionSystem.MarkSync((int)context.SenderId); +#endif } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 3793461316..3632ee8218 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -8,6 +8,7 @@ using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.NetCode; +using Unity.Netcode.Transports.UTP; using Unity.Networking.Transport; using UnityEngine; @@ -16,30 +17,11 @@ namespace Unity.Netcode.Unified internal struct TransportRpc : IRpcCommand, IRpcCommandSerializer { public FixedList4096Bytes Buffer; - - internal static string ByteArrayToString(FixedList4096Bytes ba, int offset, int count) - { - var hex = new StringBuilder(ba.Length * 2); - for (int i = offset; i < offset + count; ++i) - { - hex.AppendFormat("{0:x2} ", ba[i]); - } - - return hex.ToString(); - } - internal static string ByteArrayToString(NativeArray ba, int offset, int count) - { - var hex = new StringBuilder(ba.Length * 2); - for (int i = offset; i < offset + count; ++i) - { - hex.AppendFormat("{0:x2} ", ba[i]); - } - - return hex.ToString(); - } + public ulong Order; public unsafe void Serialize(ref DataStreamWriter writer, in RpcSerializerState state, in TransportRpc data) { + writer.WriteULong(data.Order); writer.WriteInt(data.Buffer.Length); var span = new Span(data.Buffer.GetUnsafePtr(), data.Buffer.Length); writer.WriteBytes(span); @@ -47,6 +29,7 @@ public unsafe void Serialize(ref DataStreamWriter writer, in RpcSerializerState public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerState state, ref TransportRpc data) { + data.Order = reader.ReadULong(); var length = reader.ReadInt(); data.Buffer = new FixedList4096Bytes(); data.Buffer.Length = length; @@ -104,13 +87,13 @@ internal partial class UnifiedNetcodeUpdateSystem : SystemBase { public UnifiedNetcodeTransport Transport; - public List DiscconedtQueue = new List(); - + public List DisconnectQueue = new List(); + public void Disconnect(Connection connection) { - DiscconedtQueue.Add(connection); + DisconnectQueue.Add(connection); } - + protected override void OnUpdate() { using var commandBuffer = new EntityCommandBuffer(Allocator.Temp); @@ -119,16 +102,24 @@ protected override void OnUpdate() var connectionId = SystemAPI.GetComponent(request.ValueRO.SourceConnection).Value; var buffer = rpc.ValueRW.Buffer; - Transport.DispatchMessage(connectionId, buffer); - commandBuffer.DestroyEntity(entity); + try + { + Transport.DispatchMessage(connectionId, buffer, rpc.ValueRO.Order); + } + finally + { + commandBuffer.DestroyEntity(entity); + } } - foreach (var connection in DiscconedtQueue) + foreach (var connection in DisconnectQueue) { commandBuffer.AddComponent(connection.ConnectionEntity); } + DisconnectQueue.Clear(); + commandBuffer.Playback(EntityManager); - DiscconedtQueue.Clear(); + } } @@ -144,36 +135,90 @@ internal class UnifiedNetcodeTransport : NetworkTransport private IRealTimeProvider m_RealTimeProvider; - private Dictionary m_Connections; - - internal void DispatchMessage(int connectionId, FixedList4096Bytes buffer) + private class ConnectionInfo { - ArraySegment data = new ArraySegment(buffer.ToArray()); - InvokeOnTransportEvent(NetworkEvent.Data, (ulong)connectionId, data, m_RealTimeProvider.RealTimeSinceStartup); + public BatchedSendQueue SendQueue; + public BatchedReceiveQueue ReceiveQueue; + public Connection Connection; + public ulong LastSent; + public ulong LastReceived; + public Dictionary> DeferredMessages; } + + private Dictionary m_Connections; - public override void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) + internal void DispatchMessage(int connectionId, FixedList4096Bytes buffer, ulong order) { - if (!m_Connections.TryGetValue((int)clientId, out Connection connection)) + var connectionInfo = m_Connections[connectionId]; + + if (order != connectionInfo.LastReceived + 1) { + if (connectionInfo.DeferredMessages == null) + { + connectionInfo.DeferredMessages = new Dictionary>(); + } + + connectionInfo.DeferredMessages[order] = buffer; return; } - var rpc = new TransportRpc + var reader = new DataStreamReader(buffer.ToNativeArray(Allocator.Temp)); + if (connectionInfo.ReceiveQueue == null) { - Buffer = new FixedList4096Bytes(), - }; - - unsafe + connectionInfo.ReceiveQueue = new BatchedReceiveQueue(reader); + } + else + { + connectionInfo.ReceiveQueue.PushReader(reader); + } + + connectionInfo.LastReceived = order; + if (connectionInfo.DeferredMessages != null) { - rpc.Buffer.Length = payload.Count; - fixed (byte* data = payload.Array) + var next = order + 1; + while (connectionInfo.DeferredMessages.Remove(next, out var nextBuffer)) { - UnsafeUtility.MemCpy(rpc.Buffer.GetUnsafePtr(), (void*)(data + payload.Offset), payload.Count); + reader = new DataStreamReader(nextBuffer.ToNativeArray(Allocator.Temp)); + connectionInfo.ReceiveQueue.PushReader(reader); + connectionInfo.LastReceived = next; + ++next; } } - connection.SendMessage(rpc); + var message = connectionInfo.ReceiveQueue.PopMessage(); + while (message.Count != 0) + { + InvokeOnTransportEvent(NetworkEvent.Data, (ulong)connectionId, message, + m_RealTimeProvider.RealTimeSinceStartup); + message = connectionInfo.ReceiveQueue.PopMessage(); + } + } + + public override unsafe void Send(ulong clientId, ArraySegment payload, NetworkDelivery networkDelivery) + { + if (!m_Connections.TryGetValue((int)clientId, out ConnectionInfo connectionInfo)) + { + return; + } + + connectionInfo.SendQueue.PushMessage(payload); + + while (!connectionInfo.SendQueue.IsEmpty) + { + var rpc = new TransportRpc + { + Buffer = new FixedList4096Bytes(), + }; + var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), 1024); + + var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, 1024); + rpc.Buffer.Length = amount; + rpc.Order = ++connectionInfo.LastSent; + + connectionInfo.Connection.SendMessage(rpc); + + connectionInfo.SendQueue.Consume(amount); + } } public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment payload, out float receiveTime) @@ -186,14 +231,24 @@ public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment(); updateSystem.Transport = this; + using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); + var driver = drvQuery.GetSingletonRW(); + driver.ValueRW.Connect(updateSystem.EntityManager, NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } @@ -241,20 +299,23 @@ public override bool StartServer() NetCode.Netcode.Server.OnDisconnect = OnServerClientDisconnected; var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); updateSystem.Transport = this; + using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); + var driver = drvQuery.GetSingletonRW(); + driver.ValueRW.Listen(NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } public override void DisconnectRemoteClient(ulong clientId) { var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); - updateSystem.Disconnect(m_Connections[(int)clientId]); + updateSystem.Disconnect(m_Connections[(int)clientId].Connection); m_Connections.Remove((int)clientId); } public override void DisconnectLocalClient() { var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); - updateSystem.Disconnect(m_Connections[(int)ServerClientId]); + updateSystem.Disconnect(m_Connections[(int)ServerClientId].Connection); m_Connections.Remove((int)ServerClientId); } @@ -279,7 +340,7 @@ public override void Shutdown() public override void Initialize(NetworkManager networkManager = null) { - m_Connections = new Dictionary(); + m_Connections = new Dictionary(); m_RealTimeProvider = networkManager.RealTimeProvider; } } From 8bc88002a6cc0112c73e28e02a36158ebf6f1b58 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 5 Mar 2026 10:34:22 -0600 Subject: [PATCH 39/99] Got RTT working correctly. --- .../Runtime/Transports/Unified/UnifiedNetcodeTransport.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 3632ee8218..6479526206 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -132,6 +132,7 @@ internal class UnifiedNetcodeTransport : NetworkTransport private bool m_IsServer; private bool m_StartedServerWorld = false; private bool m_StartedClientWorld = false; + private NetworkManager m_NetworkManager; private IRealTimeProvider m_RealTimeProvider; @@ -321,9 +322,8 @@ public override void DisconnectLocalClient() public override ulong GetCurrentRtt(ulong clientId) { - // todo - return 0; - //return (ulong)m_Connections[(int)clientId].RTT; + var (transportId, _) = m_NetworkManager.ConnectionManager.ClientIdToTransportId(clientId); + return (ulong)m_Connections[(int)transportId].Connection.RTT; } public override void Shutdown() @@ -342,6 +342,7 @@ public override void Initialize(NetworkManager networkManager = null) { m_Connections = new Dictionary(); m_RealTimeProvider = networkManager.RealTimeProvider; + m_NetworkManager = networkManager; } } } From ac625b243e627c2e8ae5cb03ce2ccbd6b964c9d0 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 14:39:59 -0600 Subject: [PATCH 40/99] update Fixes for connection sequence where clients don't announce they are ready to receive snapshots until fully synchronized by NGO. Fixes for removing pending ghosts and ghost spawn data (especially when being destroyed). Fixes for NetworkSceneManager detecting pending ghosts as in-scene placed. Fixes for NetworkSpawnManager.RegisterGhostPendingSpawn trying to double process triggers and/or process triggers when it should not. --- .../Components/Helpers/NetworkObjectBridge.cs | 8 ++-- .../Helpers/UnifiedUpdateConnections.cs | 37 ++++++++++-------- .../Runtime/Core/NetworkObject.cs | 19 ++++----- .../SceneManagement/NetworkSceneManager.cs | 6 +++ .../Runtime/Spawning/NetworkSpawnManager.cs | 39 +++++++++++++------ 5 files changed, 70 insertions(+), 39 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 41dddaaf12..2f4c2cb006 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -7,15 +7,17 @@ namespace Unity.Netcode { /// - /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. + /// TODO-UNIFIED: Needs further peer review and exploring alternate ways of handling this. /// /// /// If used, we most likely would make this internal /// public partial class NetworkObjectBridge : GhostBehaviour { - public Action NetworkObjectIdChanged; - + /// + /// This is used to link data to + /// N4E-spawned hybrid prefab instances. + /// internal GhostField NetworkObjectId = new GhostField(); public void SetNetworkObjectId(ulong value) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index 4237869496..0b2d6bd9d2 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -13,8 +13,6 @@ public struct NetcodeConnection internal Entity Entity; public int NetworkId; - internal float ConnectedTime; - public bool IsServer => World.IsServer(); public void GoInGame() { @@ -38,6 +36,8 @@ protected override void OnUpdate() { var isServer = World.IsServer(); var commandBuffer = new EntityCommandBuffer(Allocator.Temp); + var networkManager = NetworkManager.Singleton; + foreach (var (networkId, connectionState, entity) in SystemAPI.Query().WithNone().WithEntityAccess()) { commandBuffer.RemoveComponent(entity); @@ -50,16 +50,12 @@ protected override void OnUpdate() m_TempConnections.Clear(); - + // TODO: We should figure out how to associate the N4E NetworkId with the NGO ClientId foreach (var (networkId, entity) in SystemAPI.Query().WithAll().WithNone().WithEntityAccess()) { - // TODO-Unified: For new connections, we have a delay before the N4E in-game state for the client to provide time for the NGO side of the client to synchronize. - // Note: Once both are using the same transport we should be able to get the transport id and determine the NGO assigned client-id and at that point once the - // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var delayTime = 0.0f;// isServer ? 0.2f : 0.1f; - var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime}; + var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }; m_NewConnections.Add(networkId.Value, newConnection); } } @@ -69,8 +65,9 @@ protected override void OnUpdate() { foreach (var entry in m_NewConnections) { - // Check if the delay time has passed. - if (entry.Value.ConnectedTime < UnityEngine.Time.realtimeSinceStartup) + // Server: always connect + // Client: wait until we have synchronized before announcing we are ready to receive snapshots + if (networkManager.IsServer || (!networkManager.IsServer && networkManager.IsConnectedClient)) { // Set the connection in-game commandBuffer.AddComponent(entry.Value.Entity); @@ -87,21 +84,29 @@ protected override void OnUpdate() } m_TempConnections.Clear(); + // If the local NetworkManager is shutting down or no longer connected, then + // make sure we have disconnected all known connections. + if (networkManager.ShutdownInProgress || !networkManager.IsListening) + { + foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + } + } commandBuffer.Playback(EntityManager); } + /// + /// Always disconnect all known connections when being destroyed. + /// protected override void OnDestroy() { var commandBuffer = new EntityCommandBuffer(Allocator.Temp); foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) { commandBuffer.RemoveComponent(entity); - // TODO: maybe disconnect reason? - m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); - } - foreach (var con in m_TempConnections) - { - NetworkManager.OnNetCodeDisconnect?.Invoke(con); + NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); } commandBuffer.Playback(EntityManager); base.OnDestroy(); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 92bbffa48a..b1b98fa0c8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -1732,8 +1732,15 @@ private void OnDestroy() return; } + var spawnManager = NetworkManager.SpawnManager; + // Always attempt to remove from scene changed updates - networkManager.SpawnManager?.RemoveNetworkObjectFromSceneChangedUpdates(this); + spawnManager?.RemoveNetworkObjectFromSceneChangedUpdates(this); + +#if UNIFIED_NETCODE + spawnManager?.GhostsPendingSpawn.Remove(NetworkObjectId); + spawnManager?.GhostsPendingSynchronization.Remove(NetworkObjectId); +#endif if (IsSpawned && !networkManager.ShutdownInProgress) { @@ -1763,11 +1770,11 @@ private void OnDestroy() } } - if (networkManager.SpawnManager != null && networkManager.SpawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject)) + if (spawnManager != null && spawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject)) { if (this == networkObject) { - networkManager.SpawnManager.OnDespawnObject(networkObject, false); + spawnManager.OnDespawnObject(networkObject, false); } } } @@ -3846,7 +3853,6 @@ private void InitGhost() { Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); } - NetworkObjectBridge.NetworkObjectIdChanged += OnNetworkObjectIdChanged; if (NetworkObjectBridge.NetworkObjectId.Value != 0) { RegisterGhostBridge(); @@ -3866,11 +3872,6 @@ internal void RegisterGhostBridge() NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); } } - - private void OnNetworkObjectIdChanged(ulong networkObjectId) - { - RegisterGhostBridge(); - } #endif /// diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs index 0e75f0c92f..d4930c6026 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs @@ -2740,8 +2740,14 @@ internal void PopulateScenePlacedObjects(Scene sceneToFilterBy, bool clearSceneP var globalObjectIdHash = networkObjectInstance.GlobalObjectIdHash; var sceneHandle = networkObjectInstance.gameObject.scene.handle; // We check to make sure the NetworkManager instance is the same one to be "NetcodeIntegrationTestHelpers" compatible and filter the list on a per scene basis (for additive scenes) +#if UNIFIED_NETCODE + if (!networkObjectInstance.HasGhost && networkObjectInstance.IsSceneObject != false && (networkObjectInstance.NetworkManager == NetworkManager || + networkObjectInstance.NetworkManagerOwner == null) && sceneHandle == sceneToFilterBy.handle) +#else if (networkObjectInstance.IsSceneObject != false && (networkObjectInstance.NetworkManager == NetworkManager || networkObjectInstance.NetworkManagerOwner == null) && sceneHandle == sceneToFilterBy.handle) + +#endif { if (!ScenePlacedObjects.ContainsKey(globalObjectIdHash)) { diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 9168761037..c1b8f37750 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -43,19 +43,35 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo if (GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) { // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // For now, move any pending object into the DDOL. - UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + // Edge-Case scenario: During initial client synchronization (i.e. !NetworkManager.IsConnectedClient). + // + // Description: A client can receive snapshots before finishing the NGO synchronization process. + // This is when an edge case scenario can happen where the initial NGO synchronization information + // can include new scenes to load. If one of those scenes is configured to load in SingleMode, then + // any instantiated ghosts pending synchronization would be instantiated in whatever the currently + // active scene was when the client was processing the synchronization data. If the ghosts pending + // synchrpnization are in the currently active scene when the new scene is loaded in SingleMode, then + // they would be destroyed. + // + // Current Fix: + // If the client is not yet synchronized, then any ghost pending spawn get migrated into the DDOL. + // + // Further review: + // We need to make sure that we are migrating NetworkObjects into their assigned scene (if scene + // management is enabled). Currently, we assume all instances were in the DDOL and just migrate + // them into the currently active scene upon spawn. + if (!NetworkManager.IsConnectedClient && !GhostsPendingSynchronization.ContainsKey(networkObjectId)) + { + UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + } + else // There is matching spawn data for this pending Ghost, process the pending spawn for this hybrid instance. + { + NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); + } } - - NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); - if (GhostsArePendingSynchronization && GhostsPendingSynchronization.ContainsKey(networkObjectId)) + else { - // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. - UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); - - // When the object is spawned, it will invoke GetGhostNetworkObjectForSpawn below which removes the entry from GhostsPendingSpawn - ProcessGhostPendingSynchronization(networkObjectId); + Debug.LogError($"[{networkObject.name}-{networkObjectId}] Has already been registered as a pending ghost!"); } } @@ -109,6 +125,7 @@ internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool rem //} if (removeUponSpawn) { + GhostsPendingSynchronization.Remove(networkObjectId); GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; ghostPendingSynch.Buffer.Dispose(); } From 038b157f5bfbf3d0aafd560bff75a13a32a1dc98 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 16:42:25 -0600 Subject: [PATCH 41/99] update & fixes Some adjustments to the POC Transport. Some fixes. --- .../Components/Helpers/NetworkObjectBridge.cs | 13 +--- .../Helpers/UnifiedUpdateConnections.cs | 9 --- .../Runtime/Core/NetworkManager.cs | 27 +++++--- .../Runtime/Core/NetworkObject.cs | 6 +- .../Messaging/Messages/SceneEventMessage.cs | 9 --- .../Runtime/Spawning/NetworkSpawnManager.cs | 10 ++- .../Unified/UnifiedNetcodeTransport.cs | 65 ++++++------------- 7 files changed, 50 insertions(+), 89 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index dae048fcde..db13f5ca2c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -82,21 +82,10 @@ public override bool Initialize(string defaultWorldName) return true; } - - public static void StopClient() - { - ClientWorld.Dispose(); - ClientWorlds.Remove(ClientWorld); - } - - public static void StopServer() - { - ServerWorld.Dispose(); - ServerWorlds.Remove(ServerWorld); - } ~UnifiedBootStrap() { + World = null; Instance = null; } } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index addccd84e8..faa1b12d67 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -31,15 +31,6 @@ internal partial class UnifiedUpdateConnections : SystemBase private List m_TempConnections = new List(); private Dictionary m_NewConnections = new Dictionary(); - - public void MarkSync(int NetworkId) - { - if (m_NewConnections.TryGetValue(NetworkId, out var connection)) - { - connection.IsSynced = true; - m_NewConnections[NetworkId] = connection; - } - } protected override void OnUpdate() { diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 22f6527caf..2cd7c4481e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1204,11 +1204,11 @@ internal void Initialize(bool server) // UnityTransport dependencies are then initialized RealTimeProvider = ComponentFactory.Create(this); - + #if UNIFIED_NETCODE NetworkConfig.NetworkTransport = gameObject.AddComponent(); #endif - + MetricsManager.Initialize(this); { @@ -1320,18 +1320,27 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType { NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point."); } + + /// !! Important !! + /// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session. + NetCode.Netcode.Reset(); + + /// !! Initialize worlds here !! + /// Worlds are created here: DefaultWorldInitialization.Initialize("Default World", false); - var waitTime = new WaitForSeconds(0.016f); - // This should not be needed at this point, but here in the event something changes. - while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) + + // This should not be needed at this point, but this is here in the event something changes. + if (NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - if (LogLevel <= LogLevel.Developer) + NetworkLog.LogWarning($"[{nameof(WaitForHybridPrefabRegistration)}] !!!!! (Ghosts are still pending registration) !!!!!"); + var waitTime = new WaitForSeconds(0.016f); + while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Ghosts are still pending registration!"); + NetworkConfig.Prefabs.RegisterGhostPrefabs(this); + yield return waitTime; } - NetworkConfig.Prefabs.RegisterGhostPrefabs(this); - yield return waitTime; } + if (LogLevel <= LogLevel.Developer) { NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] All hybrid prefabs have been registered!"); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index b1b98fa0c8..de08d8b4c6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -1740,9 +1740,11 @@ private void OnDestroy() #if UNIFIED_NETCODE spawnManager?.GhostsPendingSpawn.Remove(NetworkObjectId); spawnManager?.GhostsPendingSynchronization.Remove(NetworkObjectId); -#endif - + // N4E controls this on the client, allow this if there is a ghost + if (IsSpawned && !HasGhost && !networkManager.ShutdownInProgress) +#else if (IsSpawned && !networkManager.ShutdownInProgress) +#endif { // An authorized destroy is when done by the authority instance or done due to a scene event and the NetworkObject // was marked as destroy pending scene event (which means the destroy with scene property was set). diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs index 320dc2ba1a..c0452146b4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs @@ -1,7 +1,3 @@ - -using Unity.Netcode.Components; -using Unity.Netcode.Unified; - namespace Unity.Netcode { // Todo: Would be lovely to get this one nicely formatted with all the data it sends in the struct @@ -30,11 +26,6 @@ public void Handle(ref NetworkContext context) { var networkManager = (NetworkManager)context.SystemOwner; networkManager.SceneManager.HandleSceneEvent(context.SenderId, m_ReceivedData); - -#if UNIFIED_NETCODE - var unifiedConnectionSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); - unifiedConnectionSystem.MarkSync((int)context.SenderId); -#endif } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index c1b8f37750..f870a7fb7a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -83,10 +83,14 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) return null; } var networkObject = GhostsPendingSpawn[networkObjectId]; + GhostsPendingSpawn.Remove(networkObjectId); - // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. - UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + if (networkObject != null) + { + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. + UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + } return networkObject; } diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 6479526206..743145dff6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -1,19 +1,17 @@ #if UNIFIED_NETCODE using System; using System.Collections.Generic; -using System.Text; using Unity.Burst; using Unity.Burst.Intrinsics; using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.NetCode; using Unity.Netcode.Transports.UTP; using Unity.Networking.Transport; -using UnityEngine; namespace Unity.Netcode.Unified { + [BurstCompile] internal struct TransportRpc : IRpcCommand, IRpcCommandSerializer { public FixedList4096Bytes Buffer; @@ -31,8 +29,10 @@ public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerSt { data.Order = reader.ReadULong(); var length = reader.ReadInt(); - data.Buffer = new FixedList4096Bytes(); - data.Buffer.Length = length; + data.Buffer = new FixedList4096Bytes() + { + Length = length + }; var span = new Span(data.Buffer.GetUnsafePtr(), length); reader.ReadBytes(span); } @@ -43,29 +43,29 @@ private static void InvokeExecute(ref RpcExecutor.Parameters parameters) RpcExecutor.ExecuteCreateRequestComponent(ref parameters); } - static readonly PortableFunctionPointer InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); + private static readonly PortableFunctionPointer k_InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); public PortableFunctionPointer CompileExecute() { - return InvokeExecuteFunctionPointer; + return k_InvokeExecuteFunctionPointer; } } [UpdateInGroup(typeof(RpcCommandRequestSystemGroup))] [CreateAfter(typeof(RpcSystem))] [BurstCompile] - partial struct TransportRpcCommandRequestSystem : ISystem + internal partial struct TransportRpcCommandRequestSystem : ISystem { private RpcCommandRequest m_Request; [BurstCompile] - struct SendRpc : IJobChunk + internal struct SendRpc : IJobChunk { - public RpcCommandRequest.SendRpcData data; + public RpcCommandRequest.SendRpcData Data; public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask) { - data.Execute(chunk, unfilteredChunkIndex); + Data.Execute(chunk, unfilteredChunkIndex); } } @@ -77,7 +77,7 @@ public void OnCreate(ref SystemState state) [BurstCompile] public void OnUpdate(ref SystemState state) { - var sendJob = new SendRpc { data = m_Request.InitJobData(ref state) }; + var sendJob = new SendRpc { Data = m_Request.InitJobData(ref state) }; state.Dependency = sendJob.Schedule(m_Request.Query, state.Dependency); } } @@ -128,10 +128,6 @@ internal class UnifiedNetcodeTransport : NetworkTransport private int m_ServerClientId = -1; public override ulong ServerClientId => (ulong)m_ServerClientId; - private bool m_IsClient; - private bool m_IsServer; - private bool m_StartedServerWorld = false; - private bool m_StartedClientWorld = false; private NetworkManager m_NetworkManager; private IRealTimeProvider m_RealTimeProvider; @@ -265,12 +261,6 @@ private void OnServerClientDisconnected(Connection connection, NetCodeConnection public override bool StartClient() { - if (!UnifiedBootStrap.HasClientWorlds) - { - UnifiedBootStrap.CreateClientWorld("ClientWorld"); - m_StartedClientWorld = true; - } - NetCode.Netcode.Client.OnConnect = OnClientConnectedToServer; NetCode.Netcode.Client.OnDisconnect = OnClientDisconnectFromServer; var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); @@ -283,17 +273,9 @@ public override bool StartClient() public override bool StartServer() { - if (!UnifiedBootStrap.HasServerWorld) + foreach (var connection in NetCode.Netcode.Server.Connections) { - UnifiedBootStrap.CreateServerWorld("ServerWorld"); - m_StartedClientWorld = true; - } - else - { - foreach (var connection in NetCode.Netcode.Server.Connections) - { - OnServerNewClientConnection(connection, default); - } + OnServerNewClientConnection(connection, default); } NetCode.Netcode.Server.OnConnect = OnServerNewClientConnection; @@ -326,24 +308,17 @@ public override ulong GetCurrentRtt(ulong clientId) return (ulong)m_Connections[(int)transportId].Connection.RTT; } - public override void Shutdown() - { - if (m_StartedClientWorld) - { - UnifiedBootStrap.StopClient(); - } - if (m_StartedServerWorld) - { - UnifiedBootStrap.StopServer(); - } - } - public override void Initialize(NetworkManager networkManager = null) { m_Connections = new Dictionary(); m_RealTimeProvider = networkManager.RealTimeProvider; m_NetworkManager = networkManager; } + + public override void Shutdown() + { + + } } } -#endif \ No newline at end of file +#endif From 1e75ba1bf0e955a836e5a10de5e593088bd423bc Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 17:13:45 -0600 Subject: [PATCH 42/99] fix Wrapping reference to namespace that only exists when in unified mode. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 2cd7c4481e..5175d1031e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -8,7 +8,9 @@ #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; +#if UNIFIED_NETCOE using Unity.Netcode.Unified; +#endif using UnityEngine; #if UNITY_EDITOR using UnityEditor; From be7b59cc46313da0a9fb155b903cc36fae0f0663 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 17:30:32 -0600 Subject: [PATCH 43/99] update fixing spelling of UNIFIED_NETCODE --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 5175d1031e..b8c29a67e4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -8,7 +8,7 @@ #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; -#if UNIFIED_NETCOE +#if UNIFIED_NETCODE using Unity.Netcode.Unified; #endif using UnityEngine; From 6f575ae386e30cfec897c2dacaacd84bb848b5e1 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 20:30:19 -0600 Subject: [PATCH 44/99] update Increasing max RPC size to 1340. Re-enabling the UnifiedBootStrap.AutoConnectPort. (N4E handles the connection) Removing the initial listen and/or connection within the UnifiedTransport (N4E handle this). Moving unified validation invocation to be after OnValidation early exit checks. --- .../Components/Helpers/NetworkObjectBridge.cs | 2 +- .../Runtime/Core/NetworkObject.cs | 8 ++++---- .../Runtime/Spawning/NetworkSpawnManager.cs | 4 ++++ .../Transports/Unified/UnifiedNetcodeTransport.cs | 12 +++--------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index db13f5ca2c..3d857b4c67 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -43,7 +43,7 @@ public override bool Initialize(string defaultWorldName) { var networkManager = NetworkManager.Singleton; Instance = this; - AutoConnectPort = 0; + AutoConnectPort = Port; if (base.Initialize(defaultWorldName)) { UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index de08d8b4c6..e5c96dbc17 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -257,10 +257,6 @@ private static void CheckPrefabStage(PrefabStage prefabStage) /// internal void OnValidate() { -#if UNIFIED_NETCODE - UnifiedValidation(); -#endif - // Always exit early if we are in prefab edit mode and this instance is the // prefab instance within the InContext or InIsolation edit scene. if (s_PrefabInstance == this) @@ -280,6 +276,10 @@ internal void OnValidate() return; } +#if UNIFIED_NETCODE + UnifiedValidation(); +#endif + // Get a global object identifier for this network prefab. var globalId = GlobalObjectId.GetGlobalObjectIdSlow(this); diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index f870a7fb7a..4f9b0fff14 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -67,6 +67,10 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo else // There is matching spawn data for this pending Ghost, process the pending spawn for this hybrid instance. { NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); + if (GhostsPendingSynchronization.ContainsKey(networkObjectId)) + { + ProcessGhostPendingSynchronization(networkObjectId); + } } } else diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 743145dff6..ec10116d90 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -7,7 +7,6 @@ using Unity.Entities; using Unity.NetCode; using Unity.Netcode.Transports.UTP; -using Unity.Networking.Transport; namespace Unity.Netcode.Unified { @@ -206,9 +205,10 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net { Buffer = new FixedList4096Bytes(), }; - var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), 1024); + + var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), 1340); - var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, 1024); + var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, 1340); rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; @@ -265,9 +265,6 @@ public override bool StartClient() NetCode.Netcode.Client.OnDisconnect = OnClientDisconnectFromServer; var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); updateSystem.Transport = this; - using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); - var driver = drvQuery.GetSingletonRW(); - driver.ValueRW.Connect(updateSystem.EntityManager, NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } @@ -282,9 +279,6 @@ public override bool StartServer() NetCode.Netcode.Server.OnDisconnect = OnServerClientDisconnected; var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); updateSystem.Transport = this; - using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); - var driver = drvQuery.GetSingletonRW(); - driver.ValueRW.Listen(NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } From 13cbe718c7873e3f85dbfd594a057fefc910cf58 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Thu, 5 Mar 2026 20:53:58 -0600 Subject: [PATCH 45/99] update Lowering max packet size to 1300. --- .../Runtime/Transports/Unified/UnifiedNetcodeTransport.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index ec10116d90..225165ab88 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -124,6 +124,8 @@ protected override void OnUpdate() internal class UnifiedNetcodeTransport : NetworkTransport { + private const int k_MaxPacketSize = 1300; + private int m_ServerClientId = -1; public override ulong ServerClientId => (ulong)m_ServerClientId; @@ -206,9 +208,9 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net Buffer = new FixedList4096Bytes(), }; - var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), 1340); + var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), k_MaxPacketSize); - var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, 1340); + var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; From 66e64838c2270cd9aa4d865c23161e4b09fbd444 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Fri, 6 Mar 2026 14:45:36 -0600 Subject: [PATCH 46/99] Switched TransportRpc to use the Out-Of-Band RPC pipeline --- .../Runtime/Transports/Unified/UnifiedNetcodeTransport.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 6479526206..d35c554ae2 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -14,7 +14,7 @@ namespace Unity.Netcode.Unified { - internal struct TransportRpc : IRpcCommand, IRpcCommandSerializer + internal struct TransportRpc : IOutOfBandRpcCommand, IRpcCommandSerializer { public FixedList4096Bytes Buffer; public ulong Order; @@ -216,7 +216,7 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; - connectionInfo.Connection.SendMessage(rpc); + connectionInfo.Connection.SendOutOfBandMessage(rpc); connectionInfo.SendQueue.Consume(amount); } From ebed5f65db5ca35e4dd9612658e20a0030e727a9 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 9 Mar 2026 21:13:32 -0500 Subject: [PATCH 47/99] update - OUT_OF_BAND_RPC Wrapping the OutOfBoundRpc stuff until we can get that migrated over. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 4 ++-- .../Runtime/Transports/Unified/UnifiedNetcodeTransport.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index b8c29a67e4..fb16e74953 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -8,7 +8,7 @@ #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; -#if UNIFIED_NETCODE +#if UNIFIED_NETCODE && OUT_OF_BAND_RPC using Unity.Netcode.Unified; #endif using UnityEngine; @@ -1207,7 +1207,7 @@ internal void Initialize(bool server) // UnityTransport dependencies are then initialized RealTimeProvider = ComponentFactory.Create(this); -#if UNIFIED_NETCODE +#if UNIFIED_NETCODE && OUT_OF_BAND_RPC NetworkConfig.NetworkTransport = gameObject.AddComponent(); #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 0c728b1c79..184f4d553b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -1,4 +1,4 @@ -#if UNIFIED_NETCODE +#if UNIFIED_NETCODE && OUT_OF_BAND_RPC using System; using System.Collections.Generic; using Unity.Burst; From 003ae4267bc07b4a6339c1c1276a4cfd9b79a394 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 10 Mar 2026 13:47:20 -0500 Subject: [PATCH 48/99] update Adding conditional to determine if we want to use the UnifiedTransport or not. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 14f31f63ad..4fb01d622b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1209,7 +1209,10 @@ internal void Initialize(bool server) RealTimeProvider = ComponentFactory.Create(this); #if UNIFIED_NETCODE && OUT_OF_BAND_RPC - NetworkConfig.NetworkTransport = gameObject.AddComponent(); + if (NetworkConfig.Prefabs.HasGhostPrefabs) + { + NetworkConfig.NetworkTransport = gameObject.AddComponent(); + } #endif MetricsManager.Initialize(this); From 4512b39d1f155a96cb67c7e406d91661e4fcc773 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 10 Mar 2026 16:43:48 -0400 Subject: [PATCH 49/99] chore: merge ngo and n4e with poc transport and updates (#3889) * update Fixes for connection sequence where clients don't announce they are ready to receive snapshots until fully synchronized by NGO. Fixes for removing pending ghosts and ghost spawn data (especially when being destroyed). Fixes for NetworkSceneManager detecting pending ghosts as in-scene placed. Fixes for NetworkSpawnManager.RegisterGhostPendingSpawn trying to double process triggers and/or process triggers when it should not. * update & fixes Some adjustments to the POC Transport. Some fixes. * fix Wrapping reference to namespace that only exists when in unified mode. * update fixing spelling of UNIFIED_NETCODE * update Increasing max RPC size to 1340. Re-enabling the UnifiedBootStrap.AutoConnectPort. (N4E handles the connection) Removing the initial listen and/or connection within the UnifiedTransport (N4E handle this). Moving unified validation invocation to be after OnValidation early exit checks. * update Lowering max packet size to 1300. --- .../Components/Helpers/NetworkObjectBridge.cs | 23 ++---- .../Helpers/UnifiedUpdateConnections.cs | 47 +++++------ .../Runtime/Core/NetworkManager.cs | 29 ++++--- .../Runtime/Core/NetworkObject.cs | 29 ++++--- .../Messaging/Messages/SceneEventMessage.cs | 9 --- .../SceneManagement/NetworkSceneManager.cs | 6 ++ .../Runtime/Spawning/NetworkSpawnManager.cs | 53 +++++++++---- .../Unified/UnifiedNetcodeTransport.cs | 79 ++++++------------- 8 files changed, 134 insertions(+), 141 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index c0f3ceb295..3d857b4c67 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -7,15 +7,17 @@ namespace Unity.Netcode { /// - /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. + /// TODO-UNIFIED: Needs further peer review and exploring alternate ways of handling this. /// /// /// If used, we most likely would make this internal /// public partial class NetworkObjectBridge : GhostBehaviour { - public Action NetworkObjectIdChanged; - + /// + /// This is used to link data to + /// N4E-spawned hybrid prefab instances. + /// internal GhostField NetworkObjectId = new GhostField(); public void SetNetworkObjectId(ulong value) @@ -41,7 +43,7 @@ public override bool Initialize(string defaultWorldName) { var networkManager = NetworkManager.Singleton; Instance = this; - AutoConnectPort = 0; + AutoConnectPort = Port; if (base.Initialize(defaultWorldName)) { UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); @@ -80,21 +82,10 @@ public override bool Initialize(string defaultWorldName) return true; } - - public static void StopClient() - { - ClientWorld.Dispose(); - ClientWorlds.Remove(ClientWorld); - } - - public static void StopServer() - { - ServerWorld.Dispose(); - ServerWorlds.Remove(ServerWorld); - } ~UnifiedBootStrap() { + World = null; Instance = null; } } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index efece3bc56..faa1b12d67 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -13,9 +13,6 @@ public struct NetcodeConnection internal Entity Entity; public int NetworkId; - internal float ConnectedTime; - internal bool IsSynced; - public bool IsServer => World.IsServer(); public void GoInGame() { @@ -34,20 +31,13 @@ internal partial class UnifiedUpdateConnections : SystemBase private List m_TempConnections = new List(); private Dictionary m_NewConnections = new Dictionary(); - - public void MarkSync(int NetworkId) - { - if (m_NewConnections.TryGetValue(NetworkId, out var connection)) - { - connection.IsSynced = true; - m_NewConnections[NetworkId] = connection; - } - } protected override void OnUpdate() { var isServer = World.IsServer(); var commandBuffer = new EntityCommandBuffer(Allocator.Temp); + var networkManager = NetworkManager.Singleton; + foreach (var (networkId, connectionState, entity) in SystemAPI.Query().WithNone().WithEntityAccess()) { commandBuffer.RemoveComponent(entity); @@ -60,16 +50,12 @@ protected override void OnUpdate() m_TempConnections.Clear(); - + // TODO: We should figure out how to associate the N4E NetworkId with the NGO ClientId foreach (var (networkId, entity) in SystemAPI.Query().WithAll().WithNone().WithEntityAccess()) { - // TODO-Unified: For new connections, we have a delay before the N4E in-game state for the client to provide time for the NGO side of the client to synchronize. - // Note: Once both are using the same transport we should be able to get the transport id and determine the NGO assigned client-id and at that point once the - // client has signaled that it has synchronized (or has been sent the synchronization data) we finalize the in-game connection state (or something along those lines). if (!m_NewConnections.ContainsKey(networkId.Value)) { - var delayTime = 0.0f;// isServer ? 0.2f : 0.1f; - var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value, ConnectedTime = UnityEngine.Time.realtimeSinceStartup + delayTime, IsSynced = isServer}; + var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }; m_NewConnections.Add(networkId.Value, newConnection); } } @@ -79,8 +65,9 @@ protected override void OnUpdate() { foreach (var entry in m_NewConnections) { - // Check if the delay time has passed. - if (entry.Value.IsSynced && entry.Value.ConnectedTime < UnityEngine.Time.realtimeSinceStartup) + // Server: always connect + // Client: wait until we have synchronized before announcing we are ready to receive snapshots + if (networkManager.IsServer || (!networkManager.IsServer && networkManager.IsConnectedClient)) { // Set the connection in-game commandBuffer.AddComponent(entry.Value.Entity); @@ -97,21 +84,29 @@ protected override void OnUpdate() } m_TempConnections.Clear(); + // If the local NetworkManager is shutting down or no longer connected, then + // make sure we have disconnected all known connections. + if (networkManager.ShutdownInProgress || !networkManager.IsListening) + { + foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + } + } commandBuffer.Playback(EntityManager); } + /// + /// Always disconnect all known connections when being destroyed. + /// protected override void OnDestroy() { var commandBuffer = new EntityCommandBuffer(Allocator.Temp); foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) { commandBuffer.RemoveComponent(entity); - // TODO: maybe disconnect reason? - m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); - } - foreach (var con in m_TempConnections) - { - NetworkManager.OnNetCodeDisconnect?.Invoke(con); + NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); } commandBuffer.Playback(EntityManager); base.OnDestroy(); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 22f6527caf..b8c29a67e4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -8,7 +8,9 @@ #endif using Unity.Netcode.Components; using Unity.Netcode.Runtime; +#if UNIFIED_NETCODE using Unity.Netcode.Unified; +#endif using UnityEngine; #if UNITY_EDITOR using UnityEditor; @@ -1204,11 +1206,11 @@ internal void Initialize(bool server) // UnityTransport dependencies are then initialized RealTimeProvider = ComponentFactory.Create(this); - + #if UNIFIED_NETCODE NetworkConfig.NetworkTransport = gameObject.AddComponent(); #endif - + MetricsManager.Initialize(this); { @@ -1320,18 +1322,27 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType { NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point."); } + + /// !! Important !! + /// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session. + NetCode.Netcode.Reset(); + + /// !! Initialize worlds here !! + /// Worlds are created here: DefaultWorldInitialization.Initialize("Default World", false); - var waitTime = new WaitForSeconds(0.016f); - // This should not be needed at this point, but here in the event something changes. - while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) + + // This should not be needed at this point, but this is here in the event something changes. + if (NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - if (LogLevel <= LogLevel.Developer) + NetworkLog.LogWarning($"[{nameof(WaitForHybridPrefabRegistration)}] !!!!! (Ghosts are still pending registration) !!!!!"); + var waitTime = new WaitForSeconds(0.016f); + while (NetworkConfig.Prefabs.HasPendingGhostPrefabs) { - NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Ghosts are still pending registration!"); + NetworkConfig.Prefabs.RegisterGhostPrefabs(this); + yield return waitTime; } - NetworkConfig.Prefabs.RegisterGhostPrefabs(this); - yield return waitTime; } + if (LogLevel <= LogLevel.Developer) { NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] All hybrid prefabs have been registered!"); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 92bbffa48a..e5c96dbc17 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -257,10 +257,6 @@ private static void CheckPrefabStage(PrefabStage prefabStage) /// internal void OnValidate() { -#if UNIFIED_NETCODE - UnifiedValidation(); -#endif - // Always exit early if we are in prefab edit mode and this instance is the // prefab instance within the InContext or InIsolation edit scene. if (s_PrefabInstance == this) @@ -280,6 +276,10 @@ internal void OnValidate() return; } +#if UNIFIED_NETCODE + UnifiedValidation(); +#endif + // Get a global object identifier for this network prefab. var globalId = GlobalObjectId.GetGlobalObjectIdSlow(this); @@ -1732,10 +1732,19 @@ private void OnDestroy() return; } + var spawnManager = NetworkManager.SpawnManager; + // Always attempt to remove from scene changed updates - networkManager.SpawnManager?.RemoveNetworkObjectFromSceneChangedUpdates(this); + spawnManager?.RemoveNetworkObjectFromSceneChangedUpdates(this); +#if UNIFIED_NETCODE + spawnManager?.GhostsPendingSpawn.Remove(NetworkObjectId); + spawnManager?.GhostsPendingSynchronization.Remove(NetworkObjectId); + // N4E controls this on the client, allow this if there is a ghost + if (IsSpawned && !HasGhost && !networkManager.ShutdownInProgress) +#else if (IsSpawned && !networkManager.ShutdownInProgress) +#endif { // An authorized destroy is when done by the authority instance or done due to a scene event and the NetworkObject // was marked as destroy pending scene event (which means the destroy with scene property was set). @@ -1763,11 +1772,11 @@ private void OnDestroy() } } - if (networkManager.SpawnManager != null && networkManager.SpawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject)) + if (spawnManager != null && spawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject)) { if (this == networkObject) { - networkManager.SpawnManager.OnDespawnObject(networkObject, false); + spawnManager.OnDespawnObject(networkObject, false); } } } @@ -3846,7 +3855,6 @@ private void InitGhost() { Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); } - NetworkObjectBridge.NetworkObjectIdChanged += OnNetworkObjectIdChanged; if (NetworkObjectBridge.NetworkObjectId.Value != 0) { RegisterGhostBridge(); @@ -3866,11 +3874,6 @@ internal void RegisterGhostBridge() NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); } } - - private void OnNetworkObjectIdChanged(ulong networkObjectId) - { - RegisterGhostBridge(); - } #endif /// diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs index 320dc2ba1a..c0452146b4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs @@ -1,7 +1,3 @@ - -using Unity.Netcode.Components; -using Unity.Netcode.Unified; - namespace Unity.Netcode { // Todo: Would be lovely to get this one nicely formatted with all the data it sends in the struct @@ -30,11 +26,6 @@ public void Handle(ref NetworkContext context) { var networkManager = (NetworkManager)context.SystemOwner; networkManager.SceneManager.HandleSceneEvent(context.SenderId, m_ReceivedData); - -#if UNIFIED_NETCODE - var unifiedConnectionSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); - unifiedConnectionSystem.MarkSync((int)context.SenderId); -#endif } } } diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs index 0e75f0c92f..d4930c6026 100644 --- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs @@ -2740,8 +2740,14 @@ internal void PopulateScenePlacedObjects(Scene sceneToFilterBy, bool clearSceneP var globalObjectIdHash = networkObjectInstance.GlobalObjectIdHash; var sceneHandle = networkObjectInstance.gameObject.scene.handle; // We check to make sure the NetworkManager instance is the same one to be "NetcodeIntegrationTestHelpers" compatible and filter the list on a per scene basis (for additive scenes) +#if UNIFIED_NETCODE + if (!networkObjectInstance.HasGhost && networkObjectInstance.IsSceneObject != false && (networkObjectInstance.NetworkManager == NetworkManager || + networkObjectInstance.NetworkManagerOwner == null) && sceneHandle == sceneToFilterBy.handle) +#else if (networkObjectInstance.IsSceneObject != false && (networkObjectInstance.NetworkManager == NetworkManager || networkObjectInstance.NetworkManagerOwner == null) && sceneHandle == sceneToFilterBy.handle) + +#endif { if (!ScenePlacedObjects.ContainsKey(globalObjectIdHash)) { diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index 9168761037..4f9b0fff14 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -43,19 +43,39 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo if (GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) { // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // For now, move any pending object into the DDOL. - UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + // Edge-Case scenario: During initial client synchronization (i.e. !NetworkManager.IsConnectedClient). + // + // Description: A client can receive snapshots before finishing the NGO synchronization process. + // This is when an edge case scenario can happen where the initial NGO synchronization information + // can include new scenes to load. If one of those scenes is configured to load in SingleMode, then + // any instantiated ghosts pending synchronization would be instantiated in whatever the currently + // active scene was when the client was processing the synchronization data. If the ghosts pending + // synchrpnization are in the currently active scene when the new scene is loaded in SingleMode, then + // they would be destroyed. + // + // Current Fix: + // If the client is not yet synchronized, then any ghost pending spawn get migrated into the DDOL. + // + // Further review: + // We need to make sure that we are migrating NetworkObjects into their assigned scene (if scene + // management is enabled). Currently, we assume all instances were in the DDOL and just migrate + // them into the currently active scene upon spawn. + if (!NetworkManager.IsConnectedClient && !GhostsPendingSynchronization.ContainsKey(networkObjectId)) + { + UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + } + else // There is matching spawn data for this pending Ghost, process the pending spawn for this hybrid instance. + { + NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); + if (GhostsPendingSynchronization.ContainsKey(networkObjectId)) + { + ProcessGhostPendingSynchronization(networkObjectId); + } + } } - - NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, networkObjectId); - if (GhostsArePendingSynchronization && GhostsPendingSynchronization.ContainsKey(networkObjectId)) + else { - // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. - UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); - - // When the object is spawned, it will invoke GetGhostNetworkObjectForSpawn below which removes the entry from GhostsPendingSpawn - ProcessGhostPendingSynchronization(networkObjectId); + Debug.LogError($"[{networkObject.name}-{networkObjectId}] Has already been registered as a pending ghost!"); } } @@ -67,10 +87,14 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) return null; } var networkObject = GhostsPendingSpawn[networkObjectId]; + GhostsPendingSpawn.Remove(networkObjectId); - // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. - // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. - UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + if (networkObject != null) + { + // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. + // NOTE: We might be able to use the NetworkSceneHandle to get the associated local scene handle to which we can use to get the targeted scene. + UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(networkObject.gameObject, UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + } return networkObject; } @@ -109,6 +133,7 @@ internal void ProcessGhostPendingSynchronization(ulong networkObjectId, bool rem //} if (removeUponSpawn) { + GhostsPendingSynchronization.Remove(networkObjectId); GhostsArePendingSynchronization = GhostsPendingSynchronization.Count > 0; ghostPendingSynch.Buffer.Dispose(); } diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index d35c554ae2..0c728b1c79 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -1,19 +1,16 @@ #if UNIFIED_NETCODE using System; using System.Collections.Generic; -using System.Text; using Unity.Burst; using Unity.Burst.Intrinsics; using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.NetCode; using Unity.Netcode.Transports.UTP; -using Unity.Networking.Transport; -using UnityEngine; namespace Unity.Netcode.Unified { + [BurstCompile] internal struct TransportRpc : IOutOfBandRpcCommand, IRpcCommandSerializer { public FixedList4096Bytes Buffer; @@ -31,8 +28,10 @@ public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerSt { data.Order = reader.ReadULong(); var length = reader.ReadInt(); - data.Buffer = new FixedList4096Bytes(); - data.Buffer.Length = length; + data.Buffer = new FixedList4096Bytes() + { + Length = length + }; var span = new Span(data.Buffer.GetUnsafePtr(), length); reader.ReadBytes(span); } @@ -43,29 +42,29 @@ private static void InvokeExecute(ref RpcExecutor.Parameters parameters) RpcExecutor.ExecuteCreateRequestComponent(ref parameters); } - static readonly PortableFunctionPointer InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); + private static readonly PortableFunctionPointer k_InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); public PortableFunctionPointer CompileExecute() { - return InvokeExecuteFunctionPointer; + return k_InvokeExecuteFunctionPointer; } } [UpdateInGroup(typeof(RpcCommandRequestSystemGroup))] [CreateAfter(typeof(RpcSystem))] [BurstCompile] - partial struct TransportRpcCommandRequestSystem : ISystem + internal partial struct TransportRpcCommandRequestSystem : ISystem { private RpcCommandRequest m_Request; [BurstCompile] - struct SendRpc : IJobChunk + internal struct SendRpc : IJobChunk { - public RpcCommandRequest.SendRpcData data; + public RpcCommandRequest.SendRpcData Data; public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask) { - data.Execute(chunk, unfilteredChunkIndex); + Data.Execute(chunk, unfilteredChunkIndex); } } @@ -77,7 +76,7 @@ public void OnCreate(ref SystemState state) [BurstCompile] public void OnUpdate(ref SystemState state) { - var sendJob = new SendRpc { data = m_Request.InitJobData(ref state) }; + var sendJob = new SendRpc { Data = m_Request.InitJobData(ref state) }; state.Dependency = sendJob.Schedule(m_Request.Query, state.Dependency); } } @@ -125,13 +124,11 @@ protected override void OnUpdate() internal class UnifiedNetcodeTransport : NetworkTransport { + private const int k_MaxPacketSize = 1300; + private int m_ServerClientId = -1; public override ulong ServerClientId => (ulong)m_ServerClientId; - private bool m_IsClient; - private bool m_IsServer; - private bool m_StartedServerWorld = false; - private bool m_StartedClientWorld = false; private NetworkManager m_NetworkManager; private IRealTimeProvider m_RealTimeProvider; @@ -210,9 +207,10 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net { Buffer = new FixedList4096Bytes(), }; - var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), 1024); + + var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), k_MaxPacketSize); - var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, 1024); + var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; @@ -265,44 +263,24 @@ private void OnServerClientDisconnected(Connection connection, NetCodeConnection public override bool StartClient() { - if (!UnifiedBootStrap.HasClientWorlds) - { - UnifiedBootStrap.CreateClientWorld("ClientWorld"); - m_StartedClientWorld = true; - } - NetCode.Netcode.Client.OnConnect = OnClientConnectedToServer; NetCode.Netcode.Client.OnDisconnect = OnClientDisconnectFromServer; var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); updateSystem.Transport = this; - using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); - var driver = drvQuery.GetSingletonRW(); - driver.ValueRW.Connect(updateSystem.EntityManager, NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } public override bool StartServer() { - if (!UnifiedBootStrap.HasServerWorld) - { - UnifiedBootStrap.CreateServerWorld("ServerWorld"); - m_StartedClientWorld = true; - } - else + foreach (var connection in NetCode.Netcode.Server.Connections) { - foreach (var connection in NetCode.Netcode.Server.Connections) - { - OnServerNewClientConnection(connection, default); - } + OnServerNewClientConnection(connection, default); } NetCode.Netcode.Server.OnConnect = OnServerNewClientConnection; NetCode.Netcode.Server.OnDisconnect = OnServerClientDisconnected; var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); updateSystem.Transport = this; - using var drvQuery = updateSystem.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); - var driver = drvQuery.GetSingletonRW(); - driver.ValueRW.Listen(NetworkEndpoint.Parse("127.0.0.1", 7979)); return true; } @@ -326,24 +304,17 @@ public override ulong GetCurrentRtt(ulong clientId) return (ulong)m_Connections[(int)transportId].Connection.RTT; } - public override void Shutdown() - { - if (m_StartedClientWorld) - { - UnifiedBootStrap.StopClient(); - } - if (m_StartedServerWorld) - { - UnifiedBootStrap.StopServer(); - } - } - public override void Initialize(NetworkManager networkManager = null) { m_Connections = new Dictionary(); m_RealTimeProvider = networkManager.RealTimeProvider; m_NetworkManager = networkManager; } + + public override void Shutdown() + { + + } } } -#endif \ No newline at end of file +#endif From 86e0249886989e2da93d9a2e9cdfbadbf34f21ca Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Tue, 10 Mar 2026 16:24:16 -0500 Subject: [PATCH 50/99] Optimizations of the UnifiedNetcodeTransport. --- .../Unified/UnifiedNetcodeTransport.cs | 70 +++++++++++++++---- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 0c728b1c79..55246d21aa 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -4,23 +4,56 @@ using Unity.Burst; using Unity.Burst.Intrinsics; using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.NetCode; using Unity.Netcode.Transports.UTP; +using UnityEngine; namespace Unity.Netcode.Unified { [BurstCompile] + internal unsafe struct FixedBytes1280 + { + public fixed byte Buffer[1280]; + public int Length; + + // Returns a direct pointer to the data in the buffer. + // Implemented as a static with an in-parameter to avoid the buffer being copied while keeping its memory allocation fixed/non-heap + // Note that the buffer MUST outlive the returned pointer, as it is an alias. + public static byte* GetUnsafePtr(in FixedBytes1280 data) + { + fixed (byte* buffer = data.Buffer) + { + return buffer; + } + } + + // Returns a native array that is an alias of the existing data without copying it + // Implemented as a static with an in-parameter to avoid the buffer being copied while keeping its memory allocation fixed/non-heap + // Note that the buffer MUST outlive the returned array, as it is an alias. + public static NativeArray ToNativeArray(in FixedBytes1280 data) + { + var array = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray(GetUnsafePtr(data), data.Length, Allocator.None); +#if ENABLE_UNITY_COLLECTIONS_CHECKS + var safety = CollectionHelper.CreateSafetyHandle(Allocator.None); + NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref array, safety); +#endif + return array; + } + } + + [BurstCompile] internal struct TransportRpc : IOutOfBandRpcCommand, IRpcCommandSerializer { - public FixedList4096Bytes Buffer; + public FixedBytes1280 Buffer; public ulong Order; public unsafe void Serialize(ref DataStreamWriter writer, in RpcSerializerState state, in TransportRpc data) { writer.WriteULong(data.Order); writer.WriteInt(data.Buffer.Length); - var span = new Span(data.Buffer.GetUnsafePtr(), data.Buffer.Length); + var span = new Span(FixedBytes1280.GetUnsafePtr(data.Buffer), data.Buffer.Length); writer.WriteBytes(span); } @@ -28,11 +61,12 @@ public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerSt { data.Order = reader.ReadULong(); var length = reader.ReadInt(); - data.Buffer = new FixedList4096Bytes() + data.Buffer = new FixedBytes1280 { Length = length }; - var span = new Span(data.Buffer.GetUnsafePtr(), length); + + var span = new Span(FixedBytes1280.GetUnsafePtr(data.Buffer), length); reader.ReadBytes(span); } @@ -81,7 +115,6 @@ public void OnUpdate(ref SystemState state) } } - internal partial class UnifiedNetcodeUpdateSystem : SystemBase { public UnifiedNetcodeTransport Transport; @@ -96,11 +129,11 @@ public void Disconnect(Connection connection) protected override void OnUpdate() { using var commandBuffer = new EntityCommandBuffer(Allocator.Temp); - foreach(var (request, rpc, entity) in SystemAPI.Query, RefRW>().WithEntityAccess()) + foreach(var (request, rpc, entity) in SystemAPI.Query, RefRO>().WithEntityAccess()) { var connectionId = SystemAPI.GetComponent(request.ValueRO.SourceConnection).Value; - var buffer = rpc.ValueRW.Buffer; + var buffer = rpc.ValueRO.Buffer; try { Transport.DispatchMessage(connectionId, buffer, rpc.ValueRO.Order); @@ -124,7 +157,7 @@ protected override void OnUpdate() internal class UnifiedNetcodeTransport : NetworkTransport { - private const int k_MaxPacketSize = 1300; + private const int k_MaxPacketSize = 1280; private int m_ServerClientId = -1; public override ulong ServerClientId => (ulong)m_ServerClientId; @@ -140,27 +173,34 @@ private class ConnectionInfo public Connection Connection; public ulong LastSent; public ulong LastReceived; - public Dictionary> DeferredMessages; + public Dictionary DeferredMessages; } private Dictionary m_Connections; - internal void DispatchMessage(int connectionId, FixedList4096Bytes buffer, ulong order) + internal void DispatchMessage(int connectionId, in FixedBytes1280 buffer, ulong order) { var connectionInfo = m_Connections[connectionId]; + if (order <= connectionInfo.LastReceived) + { + Debug.LogWarning("Received duplicate message, ignoring."); + return; + } + if (order != connectionInfo.LastReceived + 1) { if (connectionInfo.DeferredMessages == null) { - connectionInfo.DeferredMessages = new Dictionary>(); + connectionInfo.DeferredMessages = new Dictionary(); } connectionInfo.DeferredMessages[order] = buffer; return; } - var reader = new DataStreamReader(buffer.ToNativeArray(Allocator.Temp)); + using var arr = FixedBytes1280.ToNativeArray(buffer); + var reader = new DataStreamReader(arr); if (connectionInfo.ReceiveQueue == null) { connectionInfo.ReceiveQueue = new BatchedReceiveQueue(reader); @@ -176,7 +216,7 @@ internal void DispatchMessage(int connectionId, FixedList4096Bytes buffer, var next = order + 1; while (connectionInfo.DeferredMessages.Remove(next, out var nextBuffer)) { - reader = new DataStreamReader(nextBuffer.ToNativeArray(Allocator.Temp)); + reader = new DataStreamReader(FixedBytes1280.ToNativeArray(nextBuffer)); connectionInfo.ReceiveQueue.PushReader(reader); connectionInfo.LastReceived = next; ++next; @@ -205,10 +245,10 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net { var rpc = new TransportRpc { - Buffer = new FixedList4096Bytes(), + Buffer = new FixedBytes1280(), }; - var writer = new DataStreamWriter(rpc.Buffer.GetUnsafePtr(), k_MaxPacketSize); + var writer = new DataStreamWriter(FixedBytes1280.GetUnsafePtr(rpc.Buffer), k_MaxPacketSize); var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); rpc.Buffer.Length = amount; From 5c9ad5059a55d2fc4680dcae78fa82fc21d53ad3 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Wed, 11 Mar 2026 16:32:01 -0500 Subject: [PATCH 51/99] Added support for surfacing disconnect messages --- .../Unified/UnifiedNetcodeTransport.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 55246d21aa..e24319065b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -291,8 +291,77 @@ private void OnServerNewClientConnection(Connection connection, NetCodeConnectio InvokeOnTransportEvent(NetworkEvent.Connect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); } + private const string InvalidRpcMessage = "An invalid RPC was received"; + private const string HandshakeTimeoutMessage = "The connection was closed because the handshake timed out."; + private const string ApprovalFailureMessage = "The connection was closed because the connection was not approved by the server."; + private const string ApprovalTimeoutMessage = "The connection was closed because the connection approval process timed out."; + + private string GetDisconnectMessageFromNetworkStreamDisconnectReason(NetworkStreamDisconnectReason reason) + { + switch (reason) + { + case NetworkStreamDisconnectReason.ConnectionClose: + return UnityTransportNotificationHandler.DisconnectedMessage; + case NetworkStreamDisconnectReason.Timeout: + return UnityTransportNotificationHandler.TimeoutMessage; + case NetworkStreamDisconnectReason.MaxConnectionAttempts: + return UnityTransportNotificationHandler.MaxConnectionAttemptsMessage; + case NetworkStreamDisconnectReason.ClosedByRemote: + return UnityTransportNotificationHandler.ClosedRemoteConnectionMessage; + case NetworkStreamDisconnectReason.BadProtocolVersion: + return UnityTransportNotificationHandler.ProtocolErrorMessage; + case NetworkStreamDisconnectReason.InvalidRpc: + return InvalidRpcMessage; + case NetworkStreamDisconnectReason.AuthenticationFailure: + return UnityTransportNotificationHandler.AuthenticationFailureMessage; + case NetworkStreamDisconnectReason.ProtocolError: + return UnityTransportNotificationHandler.ProtocolErrorMessage; + case NetworkStreamDisconnectReason.HandshakeTimeout: + return HandshakeTimeoutMessage; + case NetworkStreamDisconnectReason.ApprovalFailure: + return ApprovalFailureMessage; + case NetworkStreamDisconnectReason.ApprovalTimeout: + return ApprovalTimeoutMessage; + } + return "Unknown reason"; + } + + private DisconnectEvents GetDisconnectEventFromNetworkStreamDisconnectReason(NetworkStreamDisconnectReason reason) + { + switch (reason) + { + case NetworkStreamDisconnectReason.ConnectionClose: + return DisconnectEvents.Disconnected; + case NetworkStreamDisconnectReason.Timeout: + return DisconnectEvents.ProtocolTimeout; + case NetworkStreamDisconnectReason.MaxConnectionAttempts: + return DisconnectEvents.MaxConnectionAttempts; + case NetworkStreamDisconnectReason.ClosedByRemote: + return DisconnectEvents.ClosedByRemote; + case NetworkStreamDisconnectReason.BadProtocolVersion: + return DisconnectEvents.ProtocolError; + case NetworkStreamDisconnectReason.InvalidRpc: + return DisconnectEvents.ProtocolError; + case NetworkStreamDisconnectReason.AuthenticationFailure: + return DisconnectEvents.AuthenticationFailure; + case NetworkStreamDisconnectReason.ProtocolError: + return DisconnectEvents.ProtocolError; + case NetworkStreamDisconnectReason.HandshakeTimeout: + return DisconnectEvents.ProtocolError; + case NetworkStreamDisconnectReason.ApprovalFailure: + return DisconnectEvents.AuthenticationFailure; + case NetworkStreamDisconnectReason.ApprovalTimeout: + return DisconnectEvents.ProtocolTimeout; + } + return DisconnectEvents.Disconnected; + } + private void OnClientDisconnectFromServer(Connection connection, NetCodeConnectionEvent connectionEvent) { + SetDisconnectEvent( + GetDisconnectEventFromNetworkStreamDisconnectReason(connectionEvent.DisconnectReason), + GetDisconnectMessageFromNetworkStreamDisconnectReason(connectionEvent.DisconnectReason) + ); InvokeOnTransportEvent(NetworkEvent.Disconnect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); } From b1daa584ae8bf2040235368bbbd5b351f828887f Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 11 Mar 2026 16:45:49 -0500 Subject: [PATCH 52/99] fix Fixing a missed namespace, formatting, and some minor style related issues with newly added private statics. --- .../Unified/UnifiedNetcodeTransport.cs | 77 ++++++++++--------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 42d2b2b7cb..f8d97072fb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -4,6 +4,7 @@ using Unity.Burst; using Unity.Burst.Intrinsics; using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.NetCode; using Unity.Netcode.Transports.UTP; @@ -42,12 +43,12 @@ public static NativeArray ToNativeArray(in FixedBytes1280 data) } } - [BurstCompile] + [BurstCompile] internal struct TransportRpc : IOutOfBandRpcCommand, IRpcCommandSerializer { public FixedBytes1280 Buffer; public ulong Order; - + public unsafe void Serialize(ref DataStreamWriter writer, in RpcSerializerState state, in TransportRpc data) { writer.WriteULong(data.Order); @@ -64,7 +65,7 @@ public unsafe void Deserialize(ref DataStreamReader reader, in RpcDeserializerSt { Length = length }; - + var span = new Span(FixedBytes1280.GetUnsafePtr(data.Buffer), length); reader.ReadBytes(span); } @@ -74,7 +75,7 @@ private static void InvokeExecute(ref RpcExecutor.Parameters parameters) { RpcExecutor.ExecuteCreateRequestComponent(ref parameters); } - + private static readonly PortableFunctionPointer k_InvokeExecuteFunctionPointer = new PortableFunctionPointer(InvokeExecute); public PortableFunctionPointer CompileExecute() @@ -113,13 +114,13 @@ public void OnUpdate(ref SystemState state) state.Dependency = sendJob.Schedule(m_Request.Query, state.Dependency); } } - + internal partial class UnifiedNetcodeUpdateSystem : SystemBase { public UnifiedNetcodeTransport Transport; public List DisconnectQueue = new List(); - + public void Disconnect(Connection connection) { DisconnectQueue.Add(connection); @@ -128,7 +129,7 @@ public void Disconnect(Connection connection) protected override void OnUpdate() { using var commandBuffer = new EntityCommandBuffer(Allocator.Temp); - foreach(var (request, rpc, entity) in SystemAPI.Query, RefRO>().WithEntityAccess()) + foreach (var (request, rpc, entity) in SystemAPI.Query, RefRO>().WithEntityAccess()) { var connectionId = SystemAPI.GetComponent(request.ValueRO.SourceConnection).Value; @@ -150,7 +151,7 @@ protected override void OnUpdate() DisconnectQueue.Clear(); commandBuffer.Playback(EntityManager); - + } } @@ -162,7 +163,7 @@ internal class UnifiedNetcodeTransport : NetworkTransport public override ulong ServerClientId => (ulong)m_ServerClientId; private NetworkManager m_NetworkManager; - + private IRealTimeProvider m_RealTimeProvider; private class ConnectionInfo @@ -174,9 +175,9 @@ private class ConnectionInfo public ulong LastReceived; public Dictionary DeferredMessages; } - + private Dictionary m_Connections; - + internal void DispatchMessage(int connectionId, in FixedBytes1280 buffer, ulong order) { var connectionInfo = m_Connections[connectionId]; @@ -197,7 +198,7 @@ internal void DispatchMessage(int connectionId, in FixedBytes1280 buffer, ulong connectionInfo.DeferredMessages[order] = buffer; return; } - + using var arr = FixedBytes1280.ToNativeArray(buffer); var reader = new DataStreamReader(arr); if (connectionInfo.ReceiveQueue == null) @@ -246,7 +247,7 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net { Buffer = new FixedBytes1280(), }; - + var writer = new DataStreamWriter(FixedBytes1280.GetUnsafePtr(rpc.Buffer), k_MaxPacketSize); var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); @@ -254,7 +255,7 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net rpc.Order = ++connectionInfo.LastSent; connectionInfo.Connection.SendOutOfBandMessage(rpc); - + connectionInfo.SendQueue.Consume(amount); } } @@ -266,7 +267,7 @@ public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment Date: Wed, 18 Mar 2026 14:10:19 -0500 Subject: [PATCH 53/99] fix Delay the sorting of the GhostAdapter and NetworkObjectBridge to avoid from sorting while updating the AssetDatabase. --- .../Runtime/Core/NetworkObject.cs | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index e5c96dbc17..a82fecd60a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -383,19 +383,7 @@ internal void UnifiedValidation() SynchronizeTransform = false; } - // Move the bridge to the top - while (UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) - { - // Keep moving until it can't go higher - } - - // Now move the GhostAdapter to the top so it is above NetworkObjectBridge - while (UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) - { - // Keep moving until it can't go higher - } - - EditorUtility.SetDirty(gameObject); + EditorApplication.delayCall += SortToTop; } else if (HadBridge && !HasGhost && !NetworkObjectBridge) @@ -404,6 +392,24 @@ internal void UnifiedValidation() SynchronizeTransform = true; } } + + + private void SortToTop() + { + // Move the bridge to the top + while (UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) + { + // Keep moving until it can't go higher + } + + // Now move the GhostAdapter to the top so it is above NetworkObjectBridge + while (UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) + { + // Keep moving until it can't go higher + } + + EditorUtility.SetDirty(gameObject); + } #endif #endif /// From 5d9f741ed10dab037f8af1ab98afbebd13be2558 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 20 Mar 2026 15:02:00 -0500 Subject: [PATCH 54/99] Update NetworkObject.cs --- .../Runtime/Core/NetworkObject.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index a82fecd60a..9a859139b5 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -396,19 +396,28 @@ internal void UnifiedValidation() private void SortToTop() { + if (gameObject == null) + { + return; + } // Move the bridge to the top - while (UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) + while (NetworkObjectBridge != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) { // Keep moving until it can't go higher } // Now move the GhostAdapter to the top so it is above NetworkObjectBridge - while (UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) + while (GhostAdapter != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) { // Keep moving until it can't go higher } - - EditorUtility.SetDirty(gameObject); + + if (gameObject != null) + { + EditorUtility.SetDirty(gameObject); + return; + } + } #endif #endif From 8ed8666a9d7c88252febbe507b37ecb9c096d371 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 20 Mar 2026 15:30:09 -0500 Subject: [PATCH 55/99] temp-fix Temporary fix for automatically adding the NetworkObjectBridge and not causing warnings to be logged about sending messages during Awake, OnValidate, etc. --- .../Runtime/Core/NetworkObject.cs | 53 +++++++------------ 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 9a859139b5..954bcce577 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -276,10 +276,6 @@ internal void OnValidate() return; } -#if UNIFIED_NETCODE - UnifiedValidation(); -#endif - // Get a global object identifier for this network prefab. var globalId = GlobalObjectId.GetGlobalObjectIdSlow(this); @@ -376,15 +372,22 @@ internal void UnifiedValidation() HasGhost = GhostAdapter != null; if (HasGhost && NetworkObjectBridge == null) { + NetworkObjectBridge = gameObject.AddComponent(); + HadBridge = true; + // Transform synchronization is handled by unified netcode + SynchronizeTransform = false; + + // Move the bridge to the top + while (NetworkObjectBridge != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) { - NetworkObjectBridge = gameObject.AddComponent(); - HadBridge = true; - // Transform synchronization is handled by unified netcode - SynchronizeTransform = false; + // Keep moving until it can't go higher } - EditorApplication.delayCall += SortToTop; - + // Now move the GhostAdapter to the top so it is above NetworkObjectBridge + while (GhostAdapter != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) + { + // Keep moving until it can't go higher + } } else if (HadBridge && !HasGhost && !NetworkObjectBridge) { @@ -393,31 +396,13 @@ internal void UnifiedValidation() } } - - private void SortToTop() + /// + /// TODO: This needs to be handled better. + /// Temporary work-around for sorting and adding components. + /// + private void OnEnable() { - if (gameObject == null) - { - return; - } - // Move the bridge to the top - while (NetworkObjectBridge != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) - { - // Keep moving until it can't go higher - } - - // Now move the GhostAdapter to the top so it is above NetworkObjectBridge - while (GhostAdapter != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) - { - // Keep moving until it can't go higher - } - - if (gameObject != null) - { - EditorUtility.SetDirty(gameObject); - return; - } - + UnifiedValidation(); } #endif #endif From 13ef0136991073731e49a958259e9a42923eac37 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 20 Mar 2026 18:12:12 -0500 Subject: [PATCH 56/99] update improving how NetworkObjectBridge is added and then sorted to the top with the GhostAdapter. --- .../Components/Helpers/NetworkObjectBridge.cs | 27 +++++++++++++++++++ .../Runtime/Core/NetworkObject.cs | 25 +++-------------- .../Runtime/Spawning/NetworkSpawnManager.cs | 2 +- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 3d857b4c67..103da29d6a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -14,6 +14,33 @@ namespace Unity.Netcode /// public partial class NetworkObjectBridge : GhostBehaviour { + +#if UNITY_EDITOR + [UnityEngine.HideInInspector] + [UnityEngine.SerializeField] + private bool m_Sorted = false; + private void OnValidate() + { + // Sort only once when we have first been added. + if (!m_Sorted) + { + while (UnityEditorInternal.ComponentUtility.MoveComponentUp(this)) + { + // Keep moving until it can't go higher + } + var ghostAdapter = gameObject.GetComponent(); + // Now move the GhostAdapter to the top so it is above NetworkObjectBridge + while (ghostAdapter != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(ghostAdapter)) + { + // Keep moving until it can't go higher + } + + m_Sorted = true; + } + } +#endif + + /// /// This is used to link data to /// N4E-spawned hybrid prefab instances. diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 954bcce577..c69af4357e 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -291,6 +291,10 @@ internal void OnValidate() // Always check for in-scene placed to assure any previous version scene assets with in-scene place NetworkObjects gets updated. CheckForInScenePlaced(); +#if UNIFIED_NETCODE + UnifiedValidation(); +#endif + // If the GlobalObjectIdHash value changed, then mark the asset dirty. if (GlobalObjectIdHash != oldValue) { @@ -376,18 +380,6 @@ internal void UnifiedValidation() HadBridge = true; // Transform synchronization is handled by unified netcode SynchronizeTransform = false; - - // Move the bridge to the top - while (NetworkObjectBridge != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(NetworkObjectBridge)) - { - // Keep moving until it can't go higher - } - - // Now move the GhostAdapter to the top so it is above NetworkObjectBridge - while (GhostAdapter != null && UnityEditorInternal.ComponentUtility.MoveComponentUp(GhostAdapter)) - { - // Keep moving until it can't go higher - } } else if (HadBridge && !HasGhost && !NetworkObjectBridge) { @@ -395,15 +387,6 @@ internal void UnifiedValidation() SynchronizeTransform = true; } } - - /// - /// TODO: This needs to be handled better. - /// Temporary work-around for sorting and adding components. - /// - private void OnEnable() - { - UnifiedValidation(); - } #endif #endif /// diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index f4354a35ea..33d98b0dce 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -1278,7 +1278,7 @@ internal void AuthorityLocalSpawn([NotNull] NetworkObject networkObject, ulong n #if UNIFIED_NETCODE if (networkObject.HasGhost) { - networkObject.NetworkObjectBridge.NetworkObjectId.Value = networkObject.NetworkObjectId; + networkObject.NetworkObjectBridge.SetNetworkObjectId(networkObject.NetworkObjectId); } #endif From 1c8b43db323032b7ee2cb8d3aba99adb2b34092b Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Fri, 20 Mar 2026 19:19:25 -0500 Subject: [PATCH 57/99] update Adding a base project that can be used to continue development on the unified branch. --- Examples/NGO-N4E-Unified/.gitignore | 76 ++ Examples/NGO-N4E-Unified/.vsconfig | 6 + .../Assets/DefaultNetworkPrefabs.asset | 31 + .../Assets/DefaultNetworkPrefabs.asset.meta | 8 + .../Assets/InputSystem_Actions.inputactions | 1057 +++++++++++++++++ .../InputSystem_Actions.inputactions.meta | 14 + .../NGO-N4E-Unified/Assets/Materials.meta | 8 + .../Assets/Materials/Default.mat | 138 +++ .../Assets/Materials/Default.mat.meta | 8 + .../Assets/Materials/Floor.mat | 139 +++ .../Assets/Materials/Floor.mat.meta | 8 + .../Assets/NetcodeConfig.asset | 76 ++ .../Assets/NetcodeConfig.asset.meta | 8 + Examples/NGO-N4E-Unified/Assets/Prefabs.meta | 8 + .../Assets/Prefabs/NGOPHybridPrefab.prefab | 137 +++ .../Prefabs/NGOPHybridPrefab.prefab.meta | 7 + .../Assets/Prefabs/NGOPrefab.prefab | 237 ++++ .../Assets/Prefabs/NGOPrefab.prefab.meta | 7 + .../Assets/Prefabs/NetworkManager.prefab | 118 ++ .../Assets/Prefabs/NetworkManager.prefab.meta | 7 + .../Assets/Prefabs/Platform.prefab | 594 +++++++++ .../Assets/Prefabs/Platform.prefab.meta | 7 + Examples/NGO-N4E-Unified/Assets/Scenes.meta | 8 + .../Assets/Scenes/ExampleHybridSpawn.asset | 26 + .../Scenes/ExampleHybridSpawn.asset.meta | 8 + .../Assets/Scenes/ExampleHybridSpawn.unity | 661 +++++++++++ .../Scenes/ExampleHybridSpawn.unity.meta | 7 + Examples/NGO-N4E-Unified/Assets/Scripts.meta | 8 + .../Assets/Scripts/ExampleHybridSpawn.meta | 8 + .../ExampleHybridSpawn/SpawnHybridPrefab.cs | 63 + .../SpawnHybridPrefab.cs.meta | 2 + .../Assets/Scripts/General.meta | 8 + .../Scripts/General/ExtendedNetworkManager.cs | 827 +++++++++++++ .../General/ExtendedNetworkManager.cs.meta | 2 + .../Scripts/General/ObjectPoolSystem.cs | 443 +++++++ .../Scripts/General/ObjectPoolSystem.cs.meta | 2 + .../Assets/Scripts/General/ProgressFill.cs | 22 + .../Scripts/General/ProgressFill.cs.meta | 2 + .../Assets/Scripts/General/SceneLoader.cs | 599 ++++++++++ .../Scripts/General/SceneLoader.cs.meta | 2 + Examples/NGO-N4E-Unified/Assets/Settings.meta | 8 + .../Settings/DefaultVolumeProfile.asset | 982 +++++++++++++++ .../Settings/DefaultVolumeProfile.asset.meta | 8 + .../Assets/Settings/Mobile_RPAsset.asset | 144 +++ .../Assets/Settings/Mobile_RPAsset.asset.meta | 8 + .../Assets/Settings/Mobile_Renderer.asset | 52 + .../Settings/Mobile_Renderer.asset.meta | 8 + .../Assets/Settings/PC_RPAsset.asset | 144 +++ .../Assets/Settings/PC_RPAsset.asset.meta | 8 + .../Assets/Settings/PC_Renderer.asset | 95 ++ .../Assets/Settings/PC_Renderer.asset.meta | 8 + .../Assets/Settings/SampleSceneProfile.asset | 159 +++ .../Settings/SampleSceneProfile.asset.meta | 8 + ...niversalRenderPipelineGlobalSettings.asset | 462 +++++++ ...salRenderPipelineGlobalSettings.asset.meta | 8 + .../NGO-N4E-Unified/Packages/manifest.json | 56 + .../ProjectSettings/AudioManager.asset | 19 + .../BurstAotSettings_StandaloneWindows.json | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../CommonBurstAotSettings.json | 6 + .../ProjectSettings/DynamicsManager.asset | 36 + .../ProjectSettings/EditorBuildSettings.asset | 12 + .../ProjectSettings/EditorSettings.asset | 52 + .../EntitiesClientSettings.asset | 16 + .../ProjectSettings/GraphicsSettings.asset | 81 ++ .../ProjectSettings/InputManager.asset | 487 ++++++++ .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/MultiplayerManager.asset | 9 + .../ProjectSettings/NavMeshAreas.asset | 91 ++ .../NetCodeClientAndServerSettings.asset | 41 + .../NetCodeClientSettings.asset | 18 + .../NetCodeServerSettings.asset | 17 + .../PackageManagerSettings.asset | 44 + .../ProjectSettings/Physics2DSettings.asset | 56 + .../PhysicsCoreProjectSettings2D.asset | 6 + .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 948 +++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 134 +++ .../SceneTemplateSettings.json | 121 ++ .../ProjectSettings/ShaderGraphSettings.asset | 19 + .../ProjectSettings/TagManager.asset | 76 ++ .../ProjectSettings/TimeManager.asset | 9 + .../ProjectSettings/URPProjectSettings.asset | 16 + .../UnityConnectSettings.asset | 40 + .../ProjectSettings/VFXManager.asset | 12 + .../VersionControlSettings.asset | 8 + .../VirtualProjectsConfig.json | 4 + .../ProjectSettings/XRSettings.asset | 10 + 89 files changed, 10012 insertions(+) create mode 100644 Examples/NGO-N4E-Unified/.gitignore create mode 100644 Examples/NGO-N4E-Unified/.vsconfig create mode 100644 Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions create mode 100644 Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Materials.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Default.mat create mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat create mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab create mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity create mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs create mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset create mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta create mode 100644 Examples/NGO-N4E-Unified/Packages/manifest.json create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json create mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset diff --git a/Examples/NGO-N4E-Unified/.gitignore b/Examples/NGO-N4E-Unified/.gitignore new file mode 100644 index 0000000000..cfa242cd09 --- /dev/null +++ b/Examples/NGO-N4E-Unified/.gitignore @@ -0,0 +1,76 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore +# +.utmp/ +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ +*.log +packages-lock.* + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage +*.unitypackage.meta +*.app + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* diff --git a/Examples/NGO-N4E-Unified/.vsconfig b/Examples/NGO-N4E-Unified/.vsconfig new file mode 100644 index 0000000000..f019fd0ad1 --- /dev/null +++ b/Examples/NGO-N4E-Unified/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset new file mode 100644 index 0000000000..6425f6827e --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset @@ -0,0 +1,31 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3} + m_Name: DefaultNetworkPrefabs + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList + IsDefault: 1 + List: + - Override: 0 + Prefab: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 3779494614364547505, guid: 437919e16bbd28f459dd5277adea9585, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta new file mode 100644 index 0000000000..ac649b9453 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d763116c8b64ac34d92697d81281483a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions new file mode 100644 index 0000000000..1a12cb91b6 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions @@ -0,0 +1,1057 @@ +{ + "name": "InputSystem_Actions", + "maps": [ + { + "name": "Player", + "id": "df70fa95-8a34-4494-b137-73ab6b9c7d37", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "6b444451-8a00-4d00-a97e-f47457f736a8", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Attack", + "type": "Button", + "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "852140f2-7766-474d-8707-702459ba45f3", + "expectedControlType": "Button", + "processors": "", + "interactions": "Hold", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Previous", + "type": "Button", + "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Next", + "type": "Button", + "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "641cd816-40e6-41b4-8c3d-04687c349290", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", + "path": "/w", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", + "path": "/s", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", + "path": "/a", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", + "path": "/d", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", + "path": "/primaryTouch/tap", + "interactions": "", + "processors": "", + "groups": ";Touch", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8255d333-5683-4943-a58a-ccb207ff1dce", + "path": "/{PrimaryAction}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", + "path": "/enter", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", + "path": "/dpad/right", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f2e9ba44-c423-42a7-ad56-f20975884794", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", + "path": "/leftStickPress", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "603f3daf-40bd-4854-8724-93e8017f59e3", + "path": "/secondaryButton", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", + "path": "/dpad/left", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "272f6d14-89ba-496f-b7ff-215263d3219f", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "7607c7b6-cd76-4816-beef-bd0341cfe950", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "32b35790-4ed0-4e9a-aa41-69ac6d629449", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "3c7022bf-7922-4f7c-a998-c437916075ad", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "44b200b1-1557-4083-816c-b22cbdf77ddf", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "dad70c86-b58c-4b17-88ad-f5e53adf419e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "0489e84a-4833-4c40-bfae-cea84b696689", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDevicePosition", + "type": "PassThrough", + "id": "24908448-c609-4bc3-a128-ea258674378a", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDeviceOrientation", + "type": "PassThrough", + "id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "Gamepad", + "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2db08d65-c5fb-421b-983f-c71163608d67", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "58748904-2ea9-4a80-8579-b500e6a76df8", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcd248ae-a788-4676-a12e-f4d81205600b", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3db53b26-6601-41be-9887-63ac74e79d19", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "ff527021-f211-4c02-933e-5976594c46ed", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "74214943-c580-44e4-98eb-ad7eebe17902", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cea9b045-a000-445b-95b8-0c171af70a3b", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "8607c725-d935-4808-84b1-8354e29bab63", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", + "path": "/touch*/position", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", + "path": "/touch*/press", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "38c99815-14ea-4617-8627-164d27641299", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4c191405-5738-4d4b-a523-c6a301dbf754", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDevicePosition", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDeviceOrientation", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta new file mode 100644 index 0000000000..6b38b043d9 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 052faaac586de48259a63d0c4782560b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials.meta b/Examples/NGO-N4E-Unified/Assets/Materials.meta new file mode 100644 index 0000000000..3c0675c266 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c16ac16c44675046b777e34fc86ec35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat new file mode 100644 index 0000000000..f4b9eba665 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Default + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _ScreenSpaceReflections: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &2980297282079257953 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta new file mode 100644 index 0000000000..70d3e56a72 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4c454c558b3cf384ea795205f3e0dc83 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat new file mode 100644 index 0000000000..d52d260419 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat @@ -0,0 +1,139 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Floor + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _ScreenSpaceReflections: 1 + - _Smoothness: 0.14 + - _SmoothnessTextureChannel: 1 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.009433985, g: 0.009433985, b: 0.009433985, a: 1} + - _Color: {r: 0.009433985, g: 0.009433985, b: 0.009433985, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &2980297282079257953 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta new file mode 100644 index 0000000000..b78f4ac3fe --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ab550260fb105b4b97d43ac0e573d25 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset new file mode 100644 index 0000000000..d5b61c2b58 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: abd30ee0214cf6a45b2d76765a4615b1, type: 3} + m_Name: NetcodeConfig + m_EditorClassIdentifier: Unity.NetCode::Unity.NetCode.NetCodeConfig + IsGlobalConfig: 1 + EnableClientServerBootstrap: 0 + HostWorldModeSelection: 1 + ClientServerTickRate: + SimulationTickRate: 60 + PredictedFixedStepSimulationTickRatio: 1 + NetworkTickRate: 0 + MaxSimulationStepsPerFrame: 1 + MaxSimulationStepBatchSize: 4 + TargetFrameRateMode: 0 + m_SendSnapshotsForCatchUpTicks: 0 + SnapshotAckMaskCapacity: 4096 + m_ClampPartialTicksThreshold: 5 + HandshakeApprovalTimeoutMS: 5000 + ClientTickRate: + InterpolationTimeNetTicks: 2 + InterpolationTimeMS: 0 + MaxExtrapolationTimeSimTicks: 20 + ForcedInputLatencyTicks: 0 + MaxPredictAheadTimeMS: 500 + NumAdditionalClientPredictedGhostLifetimeTicks: 0 + DefaultClassificationAllowableTickPeriod: 5 + TargetCommandSlack: 2 + NumAdditionalCommandsToSend: 2 + MaxPredictionStepBatchSizeRepeatedTick: 0 + MaxPredictionStepBatchSizeFirstTimeTick: 0 + PredictionLoopUpdateMode: 0 + InterpolationDelayJitterScale: 1.25 + InterpolationDelayMaxDeltaTicksFraction: 0.1 + InterpolationDelayCorrectionFraction: 0.1 + InterpolationTimeScaleMin: 0.85 + InterpolationTimeScaleMax: 1.1 + CommandAgeCorrectionFraction: 0.1 + PredictionTimeScaleMin: 0.9 + PredictionTimeScaleMax: 1.1 + GhostSendSystemData: + DefaultSnapshotPacketSize: 0 + PercentReservedForDespawnMessages: 0.33 + MinSendImportance: 0 + MinDistanceScaledSendImportance: 0 + MaxIterateChunks: 0 + MaxSendChunks: 0 + MaxSendEntities: 0 + m_ForceSingleBaseline: 0 + m_ForcePreSerialize: 0 + m_KeepSnapshotHistoryOnStructuralChange: 1 + m_EnablePerComponentProfiling: 0 + CleanupConnectionStatePerTick: 1 + m_FirstSendImportanceMultiplier: 1 + m_IrrelevantImportanceDownScale: 1 + m_TempStreamSize: 8192 + m_UseCustomSerializer: 0 + ConnectTimeoutMS: 1000 + MaxConnectAttempts: 60 + DisconnectTimeoutMS: 30000 + HeartbeatTimeoutMS: 500 + ReconnectionTimeoutMS: 2000 + ClientSendQueueCapacity: 64 + ClientReceiveQueueCapacity: 64 + ServerSendQueueCapacity: 512 + ServerReceiveQueueCapacity: 512 + MaxMessageSize: 1400 diff --git a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta new file mode 100644 index 0000000000..acef5b4241 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 70e9b26fe069d0a449180c6f69a25b8e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs.meta new file mode 100644 index 0000000000..cd808a8a99 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: afb5197ab0e89c249a3b2d33ab7edc08 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab new file mode 100644 index 0000000000..fadc717fa1 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &2668897094866269667 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: m_Name + value: NGOPHybridPrefab + objectReference: {fileID: 0} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: HasGhost + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: HadBridge + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: GhostAdapter + value: + objectReference: {fileID: -6696674705205069518} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: GlobalObjectIdHash + value: 662866294 + objectReference: {fileID: 0} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: NetworkObjectBridge + value: + objectReference: {fileID: -8073807847180285787} + - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + propertyPath: SynchronizeTransform + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + insertIndex: 1 + addedObject: {fileID: -6696674705205069518} + - targetCorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + insertIndex: 2 + addedObject: {fileID: -8073807847180285787} + m_SourcePrefab: {fileID: 100100000, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} +--- !u!1 &3028950850322519543 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + m_PrefabInstance: {fileID: 2668897094866269667} + m_PrefabAsset: {fileID: 0} +--- !u!114 &-6696674705205069518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3028950850322519543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e8f668e4690f4a86838c7135ee10c69a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode::Unity.NetCode.GhostAdapter + HasOwner: 0 + SupportAutoCommandTarget: 1 + TrackInterpolationDelay: 0 + GhostGroup: 0 + UsePreSerialization: 0 + UseSingleBaseline: 0 + RollbackPredictedSpawnedGhostState: 0 + RollbackPredictionOnStructuralChanges: 1 + DefaultGhostMode: 0 + SupportedGhostModes: 3 + OptimizationMode: 0 + Importance: 1 + MaxSendRate: 0 + prefabId: cdc4eeee20e3cb24da5874c6542f24d9 + prefabReference: {fileID: 0} + SkipAutomaticPrefabRegistration: 0 + m_AllBehaviours: + - {fileID: -8073807847180285787} +--- !u!114 &-8073807847180285787 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3028950850322519543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 510c5bb08d2f5724e85aa4fb66a8a4ff, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObjectBridge + m_Sorted: 1 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta new file mode 100644 index 0000000000..9a4bbb4434 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cdc4eeee20e3cb24da5874c6542f24d9 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab new file mode 100644 index 0000000000..393142b851 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab @@ -0,0 +1,237 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1081194882393186324 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 387956770341509842} + - component: {fileID: 4887312478845455083} + - component: {fileID: 4044729452182671775} + - component: {fileID: 5308326158253439111} + - component: {fileID: 4971893297530899185} + - component: {fileID: -1091923731965832849} + - component: {fileID: 4335934421289274907} + - component: {fileID: 6891221924026336373} + m_Layer: 0 + m_Name: NGOPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &387956770341509842 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4887312478845455083 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 1211280656 + InScenePlacedSourceGlobalObjectIdHash: 0 + GhostAdapter: {fileID: 0} + HasGhost: 0 + HadBridge: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 + NetworkObjectBridge: {fileID: 0} +--- !u!33 &4044729452182671775 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5308326158253439111 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 4c454c558b3cf384ea795205f3e0dc83, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!54 &4971893297530899185 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + serializedVersion: 5 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 1 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!135 &-1091923731965832849 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &4335934421289274907 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform + ShowTopMostFoldoutHeaderGroup: 1 + NetworkTransformExpanded: 0 + AutoOwnerAuthorityTickOffset: 1 + PositionInterpolationType: 1 + RotationInterpolationType: 1 + ScaleInterpolationType: 1 + PositionLerpSmoothing: 1 + PositionMaxInterpolationTime: 0.75 + RotationLerpSmoothing: 1 + RotationMaxInterpolationTime: 0.75 + ScaleLerpSmoothing: 1 + ScaleMaxInterpolationTime: 0.75 + AuthorityMode: 0 + TickSyncChildren: 0 + UseUnreliableDeltas: 0 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0.01 + RotAngleThreshold: 0.01 + ScaleThreshold: 0.01 + UseQuaternionSynchronization: 1 + UseQuaternionCompression: 1 + UseHalfFloatPrecision: 0 + InLocalSpace: 0 + SwitchTransformSpaceWhenParented: 0 + Interpolate: 1 + SlerpPosition: 0 +--- !u!114 &6891221924026336373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1081194882393186324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f6c0be61502bb534f922ebb746851216, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkRigidbody + ShowTopMostFoldoutHeaderGroup: 1 + NetworkRigidbodyBaseExpanded: 0 + UseRigidBodyForMotion: 1 + AutoUpdateKinematicState: 1 + AutoSetKinematicOnDespawn: 1 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta new file mode 100644 index 0000000000..7aa7d5ad88 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 49d6ca40767839f4e9b0b9461dc2a7a5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab new file mode 100644 index 0000000000..51d20beaf7 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab @@ -0,0 +1,118 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &758486372397951634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6832356762183308804} + - component: {fileID: -7775554403155284590} + - component: {fileID: -1723422341158045418} + m_Layer: 0 + m_Name: NetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6832356762183308804 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 758486372397951634} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &-7775554403155284590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 758486372397951634} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3b9b9fa03bea2a7469cf28788bef1223, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ExtendedNetworkManager + NetworkManagerExpanded: 1 + NetworkConfig: + ProtocolVersion: 0 + NetworkTransport: {fileID: -1723422341158045418} + PlayerPrefab: {fileID: 0} + Prefabs: + NetworkPrefabsLists: [] + TickRate: 30 + ClientConnectionBufferTimeout: 10 + ConnectionApproval: 0 + ConnectionData: + EnableTimeResync: 0 + TimeResyncInterval: 30 + EnsureNetworkVariableLengthSafety: 0 + EnableSceneManagement: 1 + ForceSamePrefabs: 1 + RecycleNetworkIds: 1 + NetworkIdRecycleDelay: 120 + RpcHashSize: 0 + LoadSceneTimeOut: 120 + SpawnTimeout: 10 + EnableNetworkLogs: 1 + NetworkTopology: 0 + UseCMBService: 0 + AutoSpawnPlayerPrefabClientSide: 1 + NetworkProfilingMetrics: 1 + OldPrefabList: [] + RunInBackground: 1 + LogLevel: 1 + NetworkManagerBootstrapperExpanded: 0 + TargetFrameRate: 100 + EnableVSync: 0 + UseDAHost: 1 + AuthenticateWithServices: 1 + m_OriginalVSyncCount: 0 + m_ServicesRegistered: 1 + m_UsingHybridSpawning: 0 + GravityMultiplier: 3 + ProgressBar: {fileID: 0} + ByPassPoolLoading: 0 + CustomHeader: +--- !u!114 &-1723422341158045418 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 758486372397951634} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Transports.UTP.UnityTransport + m_ProtocolType: 0 + m_UseWebSockets: 0 + m_UseEncryption: 0 + m_MaxPacketQueueSize: 128 + m_MaxPayloadSize: 6144 + m_HeartbeatTimeoutMS: 500 + m_ConnectTimeoutMS: 1000 + m_MaxConnectAttempts: 60 + m_DisconnectTimeoutMS: 30000 + ConnectionData: + Address: 127.0.0.1 + Port: 7777 + ServerListenAddress: 127.0.0.1 + ClientBindPort: 0 + DebugSimulator: + PacketDelayMS: 0 + PacketJitterMS: 0 + PacketDropRate: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta new file mode 100644 index 0000000000..4b95cde12a --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bcd6914dbac4146429b9c27113844b83 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab new file mode 100644 index 0000000000..5bc9ae7cd2 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab @@ -0,0 +1,594 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &467542547172540648 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4038304607712843414} + - component: {fileID: 8918527578376366212} + - component: {fileID: 7729777220788956213} + - component: {fileID: 4781818097215889214} + m_Layer: 0 + m_Name: Wall (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4038304607712843414 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467542547172540648} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.009460998, y: 0, z: 4.990539} + m_LocalScale: {x: 0.1, y: 0.19845001, z: 10.250001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1458844713925352543} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!33 &8918527578376366212 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467542547172540648} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &7729777220788956213 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467542547172540648} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &4781818097215889214 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467542547172540648} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &3453886764296983546 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5860544785372191957} + - component: {fileID: 5767181706892962636} + - component: {fileID: 1543669020394555015} + - component: {fileID: 170345526220950870} + m_Layer: 0 + m_Name: Wall (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5860544785372191957 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3453886764296983546} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0.009460998, y: 0, z: -4.9194613} + m_LocalScale: {x: 0.1, y: 0.19845001, z: 10.250001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1458844713925352543} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!33 &5767181706892962636 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3453886764296983546} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1543669020394555015 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3453886764296983546} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &170345526220950870 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3453886764296983546} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5269060278182735065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7316275697251164759} + - component: {fileID: 1109063800762097591} + - component: {fileID: 3858656344656365436} + - component: {fileID: 8339481737727997267} + m_Layer: 0 + m_Name: Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7316275697251164759 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5269060278182735065} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5.050539, y: -0.00080509187, z: 0.010539002} + m_LocalScale: {x: 0.1, y: 0.19845001, z: 9.833339} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1458844713925352543} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1109063800762097591 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5269060278182735065} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3858656344656365436 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5269060278182735065} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &8339481737727997267 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5269060278182735065} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7810017892433284147 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8839392687045787195} + - component: {fileID: 3394351341117732491} + - component: {fileID: 3321473208956563671} + - component: {fileID: 7528959553622805112} + m_Layer: 0 + m_Name: Wall (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8839392687045787195 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7810017892433284147} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.0694613, y: -0.00080509187, z: 0.010539002} + m_LocalScale: {x: 0.1, y: 0.19845001, z: 9.833339} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1458844713925352543} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3394351341117732491 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7810017892433284147} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3321473208956563671 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7810017892433284147} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &7528959553622805112 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7810017892433284147} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7913125339339818138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1458844713925352543} + - component: {fileID: 6792227805241954997} + - component: {fileID: 6807811170524320580} + - component: {fileID: 9059678504831679329} + - component: {fileID: 2049004318828787112} + m_Layer: 0 + m_Name: Platform + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1458844713925352543 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913125339339818138} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.69461, y: -20, z: 0.69461} + m_LocalScale: {x: 10, y: 10, z: 10} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7316275697251164759} + - {fileID: 8839392687045787195} + - {fileID: 4038304607712843414} + - {fileID: 5860544785372191957} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6792227805241954997 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913125339339818138} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6807811170524320580 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913125339339818138} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1ab550260fb105b4b97d43ac0e573d25, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &9059678504831679329 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913125339339818138} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 10, y: 0.1241951, z: 10} + m_Center: {x: 0, y: -0.06290245, z: 0} +--- !u!54 &2049004318828787112 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913125339339818138} + serializedVersion: 5 + m_Mass: 10000 + m_LinearDamping: 100 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 126 + m_CollisionDetection: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta new file mode 100644 index 0000000000..a74ab6696e --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e8ce062a44ddd3e459d1539c01ceb1e9 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes.meta b/Examples/NGO-N4E-Unified/Assets/Scenes.meta new file mode 100644 index 0000000000..80ae6a2786 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a08b5979dd79daa4b86a0c79927089b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset new file mode 100644 index 0000000000..05f0ac6405 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3} + m_Name: ExampleHybridSpawn + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList + IsDefault: 0 + List: + - Override: 0 + Prefab: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta new file mode 100644 index 0000000000..995722384d --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91b2555ab23f0114ca79e074632b5cf4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity new file mode 100644 index 0000000000..8a6ff39569 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity @@ -0,0 +1,661 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &330585543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 330585546} + - component: {fileID: 330585545} + - component: {fileID: 330585544} + - component: {fileID: 330585547} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &330585544 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 +--- !u!20 &330585545 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.14618191, g: 0.2537911, b: 0.4245283, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &330585546 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + serializedVersion: 2 + m_LocalRotation: {x: 0.1564345, y: 0, z: 0, w: 0.98768836} + m_LocalPosition: {x: 0, y: 10, z: -30} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 18, y: 0, z: 0} +--- !u!114 &330585547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 1 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!1 &410087039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 410087041} + - component: {fileID: 410087040} + - component: {fileID: 410087042} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &410087040 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 2 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 10, y: 10} + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 5000 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &410087041 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &410087042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_CustomShadowLayers: 0 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 + m_RenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_ShadowRenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_Version: 4 + m_LightLayerMask: 1 + m_ShadowLayerMask: 1 + m_RenderingLayers: 1 + m_ShadowRenderingLayers: 1 +--- !u!1 &832575517 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 832575519} + - component: {fileID: 832575518} + m_Layer: 0 + m_Name: Global Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &832575518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832575517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} +--- !u!4 &832575519 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832575517} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1579759821 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: UseDAHost + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_UsingHybridSpawning + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: AuthenticateWithServices + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: NetworkManagerBootstrapperExpanded + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: NetworkConfig.Prefabs.NetworkPrefabsLists.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: 'NetworkConfig.Prefabs.NetworkPrefabsLists.Array.data[0]' + value: + objectReference: {fileID: 11400000, guid: 91b2555ab23f0114ca79e074632b5cf4, type: 2} + - target: {fileID: 758486372397951634, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_Name + value: NetworkManager + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalPosition.x + value: -0.6946 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalPosition.z + value: 0.6946 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bcd6914dbac4146429b9c27113844b83, type: 3} +--- !u!1 &1860885329 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1860885331} + - component: {fileID: 1860885330} + - component: {fileID: 1860885332} + m_Layer: 0 + m_Name: PrefabSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1860885330 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860885329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 4059357279 + InScenePlacedSourceGlobalObjectIdHash: 0 + GhostAdapter: {fileID: 0} + HasGhost: 0 + HadBridge: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 0 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 + NetworkObjectBridge: {fileID: 0} +--- !u!4 &1860885331 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860885329} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 5.56, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1860885332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860885329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 65b77c0801af8d541b370f07c62ee59e, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::SpawnHybridPrefab + ShowTopMostFoldoutHeaderGroup: 1 + HybridPrefabToSpawn: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} + KeyToSpawn: 32 + KeyToDespawnAll: 127 + SpawnRadius: 5 +--- !u!1001 &7483895472622945903 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalPosition.x + value: -0.69461 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalPosition.y + value: -20 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalPosition.z + value: 0.69461 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7913125339339818138, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} + propertyPath: m_Name + value: Platform + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 330585546} + - {fileID: 410087041} + - {fileID: 832575519} + - {fileID: 1579759821} + - {fileID: 1860885331} + - {fileID: 7483895472622945903} diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta new file mode 100644 index 0000000000..9531828bcd --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99c9720ab356a0642a771bea13969a05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts.meta b/Examples/NGO-N4E-Unified/Assets/Scripts.meta new file mode 100644 index 0000000000..dd3497db8c --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1672b0e929204047b52399bd8e36e92 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta new file mode 100644 index 0000000000..52234632bb --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6987ed5a07241a548985089ab12eb0cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs new file mode 100644 index 0000000000..35a4850aef --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using Unity.Netcode; +using UnityEngine; + +public class SpawnHybridPrefab : NetworkBehaviour, INetworkUpdateSystem +{ + public GameObject HybridPrefabToSpawn; + public KeyCode KeyToSpawn = KeyCode.Space; + public KeyCode KeyToDespawnAll = KeyCode.Delete; + + [Range(1.0f, 10.0f)] + public float SpawnRadius = 5.0f; + + private List m_SpawnedObjects = new List(); + + protected override void OnNetworkPostSpawn() + { + if (IsServer) + { + NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.Update); + } + base.OnNetworkPostSpawn(); + } + + public override void OnNetworkPreDespawn() + { + if (IsServer) + { + NetworkUpdateLoop.UnregisterNetworkUpdate(this, NetworkUpdateStage.Update); + } + base.OnNetworkPreDespawn(); + } + + public void NetworkUpdate(NetworkUpdateStage updateStage) + { + if (Input.GetKeyDown(KeyToSpawn)) + { + var spawnpoint = GetRandomVector3(-SpawnRadius, SpawnRadius); + spawnpoint.y = transform.position.y; + var instance = NetworkObject.InstantiateAndSpawn(HybridPrefabToSpawn, NetworkManager, position: spawnpoint, rotation: transform.rotation); + var rigidBody = instance.GetComponent(); + rigidBody.position = spawnpoint; + rigidBody.rotation = transform.rotation; + + m_SpawnedObjects.Add(instance); + } + else if (Input.GetKeyDown(KeyToDespawnAll)) + { + foreach (var networkObject in m_SpawnedObjects) + { + networkObject.Despawn(); + } + m_SpawnedObjects.Clear(); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected Vector3 GetRandomVector3(float min, float max) + { + return new Vector3(Random.Range(min, max), Random.Range(min, max), Random.Range(min, max)); + } +} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta new file mode 100644 index 0000000000..9685cc9753 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 65b77c0801af8d541b370f07c62ee59e \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta new file mode 100644 index 0000000000..530edf896c --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9053006fb21c0dd4ab110032e85b8cdf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs new file mode 100644 index 0000000000..2f3126b8ba --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs @@ -0,0 +1,827 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Unity.Netcode; +using Unity.NetCode; +#if MULTIPLAYER_TOOLS +using Unity.Multiplayer.Tools.NetStatsMonitor; +#endif +using Unity.Services.Authentication; +using Unity.Services.Core; +using Unity.Services.Multiplayer; +using UnityEngine; +using UnityEngine.UI; +using SessionState = Unity.Services.Multiplayer.SessionState; +using UnityEngine.SceneManagement; + +#region ExtendedNetworkManagerEditor +#if UNITY_EDITOR +using Unity.Netcode.GameObjects.Editor; +using UnityEditor; +using UnityEditor.SceneManagement; +using WebSocketSharp; +/// +/// The custom editor for the component. +/// +[CustomEditor(typeof(ExtendedNetworkManager), true)] +[CanEditMultipleObjects] +public class ExtendedNetworkManagerEditor : NetworkManagerEditor +{ + private SerializedProperty m_TargetFrameRate; + private SerializedProperty m_EnableVSync; + private SerializedProperty m_UseDAHost; + private SerializedProperty m_AuthenticateWithServices; + private SerializedProperty m_GravityMultiplier; + + public override void OnEnable() + { + m_TargetFrameRate = serializedObject.FindProperty(nameof(ExtendedNetworkManager.TargetFrameRate)); + m_EnableVSync = serializedObject.FindProperty(nameof(ExtendedNetworkManager.EnableVSync)); + m_UseDAHost = serializedObject.FindProperty(nameof(ExtendedNetworkManager.UseDAHost)); + m_AuthenticateWithServices = serializedObject.FindProperty(nameof(ExtendedNetworkManager.AuthenticateWithServices)); + m_GravityMultiplier = serializedObject.FindProperty(nameof(ExtendedNetworkManager.GravityMultiplier)); + base.OnEnable(); + } + + private void DisplayNetworkManagerBootstrapperProperties() + { + var extendedNetworkManager = target as ExtendedNetworkManager; + EditorGUILayout.PropertyField(m_TargetFrameRate); + EditorGUILayout.PropertyField(m_EnableVSync); + var useDAHost = EditorGUILayout.PropertyField(m_UseDAHost); + if (extendedNetworkManager.UseDAHost) + { + extendedNetworkManager.AuthenticateWithServices = false; + } + GUI.enabled = !extendedNetworkManager.UseDAHost; + EditorGUILayout.PropertyField(m_AuthenticateWithServices); + GUI.enabled = true; + EditorGUILayout.PropertyField(m_GravityMultiplier); + } + + public override void OnInspectorGUI() + { + var extendedNetworkManager = target as ExtendedNetworkManager; + void SetExpanded(bool expanded) { extendedNetworkManager.NetworkManagerBootstrapperExpanded = expanded; } + ; + DrawFoldOutGroup(extendedNetworkManager.GetType(), DisplayNetworkManagerBootstrapperProperties, extendedNetworkManager.NetworkManagerBootstrapperExpanded, SetExpanded); + base.OnInspectorGUI(); + } +} +#endif +#endregion + +/// +/// An extended NetworkManager to handle the bootstrap loading process specific to a client-server +/// topology where one might want to have local server-side scenes, local client-side scenes, and shared (synchronized) scenes. +/// +/// +public class ExtendedNetworkManager : NetworkManager +{ + #region Validation +#if UNITY_EDITOR + + [InitializeOnLoadMethod] + private static void InitializeOnLoad() + { + if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "SampleScene") + { + UpdateServicesInfo(); + } + else + { + EditorSceneManager.sceneOpened -= SceneOpened; + EditorSceneManager.sceneOpened += SceneOpened; + } + } + + private static void SceneOpened(Scene scene, OpenSceneMode mode) + { + if (scene.name == "SampleScene") + { + UpdateServicesInfo(); + } + } + + private static void UpdateServicesInfo() + { + var extendedNetworkManager = GameObject.Find("ExtendedNetworkManager")?.GetComponent(); + if (extendedNetworkManager == null) + { + return; + } + extendedNetworkManager.CheckServiceStatus(); + } + + // Inspector view expand/collapse settings for this derived child class + [HideInInspector] + public bool NetworkManagerBootstrapperExpanded; + protected override void OnValidateComponent() + { + m_OriginalVSyncCount = QualitySettings.vSyncCount; + CheckServiceStatus(); + + m_UsingHybridSpawning = false; + if (NetworkConfig.Prefabs.NetworkPrefabsLists.Count > 0) + { + foreach (var prefabList in NetworkConfig.Prefabs.NetworkPrefabsLists) + { + foreach (var prefabEntry in prefabList.PrefabList) + { + if (prefabEntry.Prefab != null & prefabEntry.Prefab.GetComponent()) + { + m_UsingHybridSpawning = true; + break; + } + } + } + } + + base.OnValidateComponent(); + } + + private void CheckServiceStatus() + { + m_ServicesRegistered = CloudProjectSettings.organizationName != string.Empty && CloudProjectSettings.organizationId != string.Empty; + } +#endif + #endregion + + #region Properties + public static ExtendedNetworkManager Instance; + + public int TargetFrameRate = 100; + public bool EnableVSync = false; + public bool UseDAHost = true; + public bool AuthenticateWithServices = true; + + public SceneLoader SceneLoader => m_SceneLoader; + private SceneLoader m_SceneLoader; + + [HideInInspector] + [SerializeField] + private int m_OriginalVSyncCount; + + private enum ConnectionStates + { + None, + Connecting, + Connected, + } + + public bool IsConnectedToSession => m_ConnectionState == ConnectionStates.Connected; + + private ConnectionStates m_ConnectionState; + + [SerializeField] + private bool m_ServicesRegistered; + + [HideInInspector] + [SerializeField] + private bool m_UsingHybridSpawning; + + private ISession m_CurrentSession; + private string m_SessionName; + private string m_ProfileName; + private Task m_SessionTask; + [Range(0.1f, 10.0f)] + public float GravityMultiplier = 3.0f; + private float m_CurrentGravityMultiplier = 0.0f; + private Vector3 StandardGravity = new Vector3(0.0f, -9.81f, 0.0f); + #endregion + + #region Application Exit + public static Action OnExiting; + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] + private static void OnInitialize() + { +#if UNITY_EDITOR + EditorApplication.playModeStateChanged += PlayModeStateChanged; +#else + Application.wantsToQuit += Application_wantsToQuit; +#endif + } + + +#if UNITY_EDITOR + private static void PlayModeStateChanged(PlayModeStateChange state) + { + if (state == PlayModeStateChange.ExitingPlayMode) + { + OnExiting?.Invoke(); + } + } +#else + private static bool Application_wantsToQuit() + { + OnExiting?.Invoke(); + return true; + } +#endif + #endregion + + #region NetStats Monitor + +#if MULTIPLAYER_TOOLS + [Tooltip("Assign an in-scene placed net stats monitor prefab here for it to be available to other components.")] + public RuntimeNetStatsMonitor NetStatsMonitor; +#endif + public void ToggleNetStatsMonitor(bool disable = false) + { +#if MULTIPLAYER_TOOLS + if (NetStatsMonitor) + { + if (!NetworkConfig.NetworkMessageMetrics) + { + var checkForBuiltIn = false; + var defaultMetrics = Enum.GetNames(typeof(Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType)); + foreach (var elementConfig in NetStatsMonitor.Configuration.DisplayElements) + { + foreach (var stats in elementConfig.Stats) + { + if (defaultMetrics.Contains(stats.ToString())) + { + checkForBuiltIn = true; + break; + } + } + if (checkForBuiltIn) + { + break; + } + } + + // Log a warning if the messaging metrics is disabled + if (checkForBuiltIn) + { + Debug.LogWarning($"{nameof(NetworkManager)}'s {nameof(NetworkConfig.NetworkMessageMetrics)} property is not enabled. The default Built-In Metrics use {nameof(NetworkConfig.NetworkMessageMetrics)} and {nameof(NetStatsMonitor)} not be populates with values!"); + } + } + if (disable) + { + NetStatsMonitor.Visible = false; + } + else + { + NetStatsMonitor.Visible = !NetStatsMonitor.Visible; + } + + } +#else + Debug.LogWarning($"The multiplayer tools package is not installed!"); +#endif + } + #endregion + + #region Tracking Pool System Loading + + public ProgressFill ProgressBar; + public bool ByPassPoolLoading = false; + + + private Dictionary m_PoolSystemsLoading = new Dictionary(); + + /// + /// Used by ObjectPoolSystem to visually track the progress of instantiating its object pool + /// + public void TrackPoolSystemLoading(ObjectPoolSystem poolSystem, float progress, bool isLoading = true) + { + if (isLoading) + { + if (!m_PoolSystemsLoading.ContainsKey(poolSystem)) + { + m_PoolSystemsLoading.Add(poolSystem, progress); + } + else + { + m_PoolSystemsLoading[poolSystem] = progress; + } + } + else + { + m_PoolSystemsLoading.Remove(poolSystem); + } + } + + private void UpdateProgress() + { + if (ByPassPoolLoading) + { + return; + } + + var totalProgress = 0.0f; + foreach (var poolSystem in m_PoolSystemsLoading) + { + totalProgress += poolSystem.Value; + } + totalProgress = totalProgress / m_PoolSystemsLoading.Count; + ProgressBar.UpdateProgress(totalProgress); + if (totalProgress >= 1.0f) + { + m_PoolSystemsLoading.Clear(); + } + } + #endregion + + #region Initialization and Destroy + public static string GetRandomString(int length) + { + var r = new System.Random(); + return new string(Enumerable.Range(0, length).Select(_ => (char)r.Next('a', 'z')).ToArray()); + } + + public void SetFrameRate(int targetFrameRate, bool enableVsync) + { + Application.targetFrameRate = targetFrameRate; + QualitySettings.vSyncCount = enableVsync ? m_OriginalVSyncCount : 0; + } + + private async void Start() + { +#if UNITY_EDITOR + + if (!EditorApplication.isPlaying) + { + CheckServiceStatus(); + } +#endif + Screen.SetResolution((int)(Screen.currentResolution.width * 0.40f), (int)(Screen.currentResolution.height * 0.40f), FullScreenMode.Windowed); + SetFrameRate(TargetFrameRate, EnableVSync); + SetSingleton(); + m_SceneLoader = GetComponent(); + + OnClientConnectedCallback += OnClientConnected; + OnClientDisconnectCallback += OnClientDisconnect; + OnConnectionEvent += OnClientConnectionEvent; + try + { + // Check to see if the project has been registered with an organization before trying to sign in + if (m_ServicesRegistered && AuthenticateWithServices) + { + if (UnityServices.Instance != null && UnityServices.Instance.State != ServicesInitializationState.Initialized) + { + await UnityServices.InitializeAsync(); + } + if (!AuthenticationService.Instance.IsSignedIn) + { + AuthenticationService.Instance.SignInFailed += SignInFailed; + AuthenticationService.Instance.SignedIn += SignedIn; + if (string.IsNullOrEmpty(m_ProfileName)) + { + m_ProfileName = GetRandomString(5); + } + AuthenticationService.Instance.SwitchProfile(m_ProfileName); + await AuthenticationService.Instance.SignInAnonymouslyAsync(); + } + } + } + catch (Exception ex) + { + LogMessage($"This project might need to be registered with your services account.\n{ex.Message}\n{ex.StackTrace}"); + } + + // Handle bootstrap loading the main menu into main menu + // NOTE: A common issue is when you place the NetworkManager within the same "primary" scene to + // load. Using the bootstrap approach, the 1st scene loaded is the bootstrap scene that + // contains the NetworkManager and it is never reloaded for that application instance lifespan. + if (m_SceneLoader) + { + m_SceneLoader.LoadMainMenu(); + } + } + + private void OnDestroy() + { + OnClientConnectedCallback -= OnClientConnected; + OnClientDisconnectCallback -= OnClientDisconnect; + OnConnectionEvent -= OnClientConnectionEvent; + } + #endregion + + #region Session and Connection Event Handling + public Action OnShuttingDown; + + /// + /// Server and Clients all invoke this method + /// + private void OnClientConnectionEvent(NetworkManager networkManager, ConnectionEventData eventData) + { + LogMessage($"Connection event {eventData.EventType} for Client-{eventData.ClientId}."); + if (eventData.ClientId != LocalClientId) + { + return; + } + + switch (eventData.EventType) + { + case ConnectionEvent.ClientConnected: + { + m_ConnectionState = ConnectionStates.Connected; + break; + } + case ConnectionEvent.ClientDisconnected: + { + m_ConnectionState = ConnectionStates.None; + break; + } + } + } + + private void OnClientConnected(ulong clientId) + { + LogMessage($"Connected event invoked for Client-{clientId}."); + } + + private void OnClientDisconnect(ulong clientId) + { + LogMessage($"Disconnected event invoked for Client-{clientId}."); + } + + private void SignedIn() + { + AuthenticationService.Instance.SignedIn -= SignedIn; + Debug.Log($"Signed in anonymously with profile {m_ProfileName}"); + } + + private void SignInFailed(RequestFailedException error) + { + AuthenticationService.Instance.SignInFailed -= SignInFailed; + Debug.LogError($"Failed to sign in {m_ProfileName} anonymously: {error}"); + } + + private void SessionStarted() + { + + if (GravityMultiplier != m_CurrentGravityMultiplier) + { + m_CurrentGravityMultiplier = GravityMultiplier; + Physics.gravity = StandardGravity * m_CurrentGravityMultiplier; + } + + OnClientStarted -= SessionStarted; + m_ConnectionState = IsServer && !IsHost ? ConnectionStates.Connected : ConnectionStates.Connecting; + if (IsServer) + { + LogMessage($"Server started session."); + } + else + { + LogMessage($"Client connecting to session."); + } + if (DistributedAuthorityMode && (CMBServiceConnection || !DAHost)) + { + m_SceneLoader.DAClientStarted(); + } + } + + private void SessionStopped(bool isHost) + { + LogMessage($"NetworkManager has stopped."); + OnClientStopped -= SessionStopped; + m_ConnectionState = ConnectionStates.None; + } + + private async Task ConnectThroughLiveService() + { + try + { + var options = new SessionOptions() + { + Name = m_SessionName, + MaxPlayers = 32 + }.WithDistributedAuthorityNetwork(); + + m_CurrentSession = await MultiplayerService.Instance.CreateOrJoinSessionAsync(m_SessionName, options); + return m_CurrentSession; + } + catch (Exception e) + { + LogMessage($"{e.Message}"); + Debug.LogException(e); + } + return null; + } + #endregion + + #region GUI Menu + public void StartOrConnectToDistributedAuthoritySession() + { + m_SessionTask = ConnectThroughLiveService(); + m_ConnectionState = ConnectionStates.Connecting; + LogMessage($"Connecting to session {m_SessionName}..."); + } + + private void OnUpdateGUIDisconnected() + { + GUILayout.BeginArea(new Rect(10, 10, 300, 800)); + + if (NetworkConfig.NetworkTopology == NetworkTopologyTypes.DistributedAuthority) + { + if (!m_ServicesRegistered && AuthenticateWithServices) + { + GUILayout.Label("Project-Settings:Services-General-Settings is not configured."); + GUILayout.Label("Distributed authority requires project to be registered with your organization's services account for authentication purposes."); + } + else + { + if (UseDAHost) + { + if (GUILayout.Button("Start DAHost")) + { + OnServerStopped += SessionStopped; + OnServerStarted += SessionStarted; + StartHost(); + } + else + if (GUILayout.Button("Start DAClient")) + { + OnClientStopped += SessionStopped; + OnClientStarted += SessionStarted; + StartClient(); + } + } + else + { + if (AuthenticateWithServices) + { + m_SessionName = GUILayout.TextField(m_SessionName); + if (GUILayout.Button("Create or Connect To Session")) + { + NetworkConfig.UseCMBService = true; + OnClientStopped += SessionStopped; + OnClientStarted += SessionStarted; + StartOrConnectToDistributedAuthoritySession(); + } + } + else + { + if (GUILayout.Button("Connect To Local Service")) + { + NetworkConfig.UseCMBService = true; + OnClientStopped += SessionStopped; + OnClientStarted += SessionStarted; + StartClient(); + } + } + } + } + } + else + { + if (m_UsingHybridSpawning) + { + if (GUILayout.Button("Hybrid-Host")) + { + OnServerStopped += SessionStopped; + OnServerStarted += SessionStarted; + StartHost(); + } + + if (GUILayout.Button("Hybrid-Client")) + { + OnClientStopped += SessionStopped; + OnClientStarted += SessionStarted; + StartClient(); + } + } + else + { + if (GUILayout.Button("Start Server")) + { + OnServerStopped += SessionStopped; + OnServerStarted += SessionStarted; + StartServer(); + } + else + if (GUILayout.Button("Start Host")) + { + OnServerStopped += SessionStopped; + OnServerStarted += SessionStarted; + StartHost(); + } + else + if (GUILayout.Button("Start Client")) + { + OnClientStopped += SessionStopped; + OnClientStarted += SessionStarted; + StartClient(); + } + } + } + GUILayout.EndArea(); + } + + public string CustomHeader; + + public Func OnConnectedGUIUpdate; + + private int OnUpdateGUIConnected(int yAxisOffset) + { + #region Left side + GUILayout.BeginArea(new Rect(10, 10, 800, 800)); + if (CMBServiceConnection) + { + GUILayout.Label($"Distributed Authority Session: {m_SessionName}"); + if (LocalClient.IsSessionOwner) + { + GUILayout.Label("[Session Owner]"); + yAxisOffset += 20; + } + } + else + { + if (m_UsingHybridSpawning) + { + GUILayout.Label($"NGO & N4E Client-Server Hybrid Session"); + } + else + { + GUILayout.Label($"Client-Server Session"); + } + } + if (!string.IsNullOrEmpty(CustomHeader)) + { + GUILayout.Label($"{CustomHeader}"); + } + + yAxisOffset = OnConnectedGUIUpdate?.Invoke(yAxisOffset) ?? yAxisOffset; + GUILayout.EndArea(); + #endregion + + #region Right side + GUILayout.BeginArea(new Rect(Display.main.renderingWidth - 230, 10, 220, 300)); + var endSessionText = IsServer && !DistributedAuthorityMode ? "Shutdown" : "Disconnect"; + if (GUILayout.Button(endSessionText)) + { + OnShuttingDown?.Invoke(); + if (m_CurrentSession != null && m_CurrentSession.State == SessionState.Connected) + { + m_CurrentSession.LeaveAsync(); + m_CurrentSession = null; + } + else + { + Shutdown(); + } + } + if (m_SceneLoader && !m_SceneLoader.SceneLoadingInProgress) + { + GUILayout.Label($"Current Scene: {UnityEngine.SceneManagement.SceneManager.GetActiveScene().name}"); + var currentPlayerPrefab = m_SceneLoader.GetCurrentPrefabName(); + if (!string.IsNullOrEmpty(currentPlayerPrefab)) + { + GUILayout.Label($"Current player-prefab: {currentPlayerPrefab}"); + } + if (IsSessionAuthority()) + { + var currentSceneEntry = m_SceneLoader.CurrentSceneEntry; + if (currentSceneEntry != null) + { + var nextPlayerPrefab = m_SceneLoader.GetNextPrefabName(); + var nextScene = $"Load {m_SceneLoader.GetNextSceneName()}"; + var buttontext = string.IsNullOrEmpty(nextPlayerPrefab) ? nextScene : $"{nextScene}\nusing {nextPlayerPrefab}"; + if (GUILayout.Button(buttontext)) + { + m_SceneLoader.LoadNextScene(); + } + } + } + } + GUILayout.EndArea(); + #endregion + return yAxisOffset; + } + + private void OnGUI() + { + var yAxisOffset = 10; + switch (m_ConnectionState) + { + case ConnectionStates.None: + { + yAxisOffset = 80; + OnUpdateGUIDisconnected(); + break; + } + case ConnectionStates.Connected: + { + yAxisOffset = OnUpdateGUIConnected(40); + break; + } + } + + GUILayout.BeginArea(new Rect(10, yAxisOffset, 800, 800)); + if (m_MessageLogs.Count > 0) + { + GUILayout.Label("-----------(Log)-----------"); + // Display any messages logged to screen + foreach (var messageLog in m_MessageLogs) + { + GUILayout.Label(messageLog.Message); + } + GUILayout.Label("---------------------------"); + } + GUILayout.EndArea(); + } + #endregion + + #region Update and Status Methods + private void UpdateRuntimeMessageConsole() + { + if (m_MessageLogs.Count == 0) + { + return; + } + + for (int i = m_MessageLogs.Count - 1; i >= 0; i--) + { + if (m_MessageLogs[i].ExpirationTime < Time.realtimeSinceStartup) + { + m_MessageLogs.RemoveAt(i); + } + } + } + + public bool IsSessionAuthority() + { + if (!DistributedAuthorityMode) + { + return IsServer; + } + else + { + return LocalClientId == CurrentSessionOwner; + } + } + + /// + /// Invoked when a network session is active + /// + private void ConnectedUpdate() + { + UpdateRuntimeMessageConsole(); + } + + /// + /// Invoked when no network session is active + /// + private void DisconnectedUpdate() + { + if (m_PoolSystemsLoading.Count > 0) + { + UpdateProgress(); + } + } + + private void Update() + { + if (IsConnectedToSession) + { + ConnectedUpdate(); + } + else + { + DisconnectedUpdate(); + } + } + #endregion + + #region Message Logging + + private List m_MessageLogs = new List(); + + private class MessageLog + { + public string Message { get; private set; } + public float ExpirationTime { get; private set; } + + public MessageLog(string msg, float timeToLive) + { + Message = msg; + ExpirationTime = Time.realtimeSinceStartup + timeToLive; + } + } + + public void LogMessage(string msg, float timeToLive = 10.0f) + { + msg = $"[{Time.realtimeSinceStartup}] {msg}"; + if (m_MessageLogs.Count > 0) + { + m_MessageLogs.Insert(0, new MessageLog(msg, timeToLive)); + } + else + { + m_MessageLogs.Add(new MessageLog(msg, timeToLive)); + } + Debug.Log(msg); + } + #endregion + + public ExtendedNetworkManager() + { + Instance = this; + } +} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta new file mode 100644 index 0000000000..9dfbaf5568 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3b9b9fa03bea2a7469cf28788bef1223 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs new file mode 100644 index 0000000000..a3521c374c --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs @@ -0,0 +1,443 @@ +using System.Collections; +using System.Collections.Generic; +using Unity.Netcode; +using Unity.Netcode.Components; +using UnityEngine; +using UnityEngine.SceneManagement; + +#if UNITY_EDITOR +using UnityEditor; +using Unity.Netcode.Editor; +/// +/// The custom editor for the component. +/// +[CustomEditor(typeof(ObjectPoolSystem), true)] +public class ObjectPoolSystemEditor : NetcodeEditorBase +{ + private SerializedProperty m_NetworkPrefab; + private SerializedProperty m_ObjectPoolSize; + private SerializedProperty m_PoolInSystemScene; + private SerializedProperty m_UsePoolForSpawn; + private SerializedProperty m_DontDestroyOnSceneUnload; + private SerializedProperty m_ExtendedProperties; + private SerializedProperty m_UseUnreliableDeltas; + private SerializedProperty m_DebugHandlerDestroy; + private SerializedProperty m_EnableTransformOverrides; + private SerializedProperty m_HalfFloat; + private SerializedProperty m_QuaternionSynchronization; + private SerializedProperty m_QuaternionCompression; + private SerializedProperty m_Interpolate; + + public override void OnEnable() + { + m_NetworkPrefab = serializedObject.FindProperty(nameof(ObjectPoolSystem.NetworkPrefab)); + m_ObjectPoolSize = serializedObject.FindProperty(nameof(ObjectPoolSystem.ObjectPoolSize)); + m_PoolInSystemScene = serializedObject.FindProperty(nameof(ObjectPoolSystem.PoolInSystemScene)); + m_UsePoolForSpawn = serializedObject.FindProperty(nameof(ObjectPoolSystem.UsePoolForSpawn)); + m_DontDestroyOnSceneUnload = serializedObject.FindProperty(nameof(ObjectPoolSystem.DontDestroyOnSceneUnload)); + m_ExtendedProperties = serializedObject.FindProperty(nameof(ObjectPoolSystem.ExtendedProperties)); + m_UseUnreliableDeltas = serializedObject.FindProperty(nameof(ObjectPoolSystem.UseUnreliableDeltas)); + m_DebugHandlerDestroy = serializedObject.FindProperty(nameof(ObjectPoolSystem.DebugHandlerDestroy)); + m_EnableTransformOverrides = serializedObject.FindProperty(nameof(ObjectPoolSystem.EnableTransformOverrides)); + m_HalfFloat = serializedObject.FindProperty(nameof(ObjectPoolSystem.HalfFloat)); + m_QuaternionSynchronization = serializedObject.FindProperty(nameof(ObjectPoolSystem.QuaternionSynchronization)); + m_QuaternionCompression = serializedObject.FindProperty(nameof(ObjectPoolSystem.QuaternionCompression)); + m_Interpolate = serializedObject.FindProperty(nameof(ObjectPoolSystem.Interpolate)); + base.OnEnable(); + } + + private void DisplayObjectPoolSystemProperties() + { + var objectPoolSystem = target as ObjectPoolSystem; + EditorGUILayout.PropertyField(m_NetworkPrefab); + EditorGUILayout.PropertyField(m_ObjectPoolSize); + EditorGUILayout.PropertyField(m_PoolInSystemScene); + EditorGUILayout.PropertyField(m_UsePoolForSpawn); + EditorGUILayout.PropertyField(m_DontDestroyOnSceneUnload); + EditorGUILayout.PropertyField(m_ExtendedProperties); + if (objectPoolSystem.ExtendedProperties) + { + EditorGUILayout.PropertyField(m_UseUnreliableDeltas); + EditorGUILayout.PropertyField(m_DebugHandlerDestroy); + // Once the prefab is assigned + if (objectPoolSystem.NetworkPrefab) + { + // Check to see if it has a NetworkTransform (or derived from) component + var networkTransform = objectPoolSystem.NetworkPrefab.GetComponent(); + if (networkTransform) + { + // If so, then provide additional options + EditorGUILayout.PropertyField(m_EnableTransformOverrides); + if (objectPoolSystem.EnableTransformOverrides) + { + EditorGUILayout.PropertyField(m_HalfFloat); + EditorGUILayout.PropertyField(m_QuaternionSynchronization); + EditorGUILayout.PropertyField(m_QuaternionCompression); + EditorGUILayout.PropertyField(m_Interpolate); + } + } + } + } + } + + public override void OnInspectorGUI() + { + var objectPoolSystem = target as ObjectPoolSystem; + void SetExpanded(bool expanded) { objectPoolSystem.ObjectPoolSystemPropertiesVisible = expanded; }; + DrawFoldOutGroup(objectPoolSystem.GetType(), DisplayObjectPoolSystemProperties, objectPoolSystem.ObjectPoolSystemPropertiesVisible, SetExpanded); + base.OnInspectorGUI(); + } +} +#endif + +public interface IPoolSystemTracker +{ + void TrackPoolSystemLoading(ObjectPoolSystem poolSystem, float progress, bool isLoading = true); +} + +/// +/// Generic NetworkObject pool system used throughout the demo. +/// +public class ObjectPoolSystem : MonoBehaviour, INetworkPrefabInstanceHandler +{ +#if UNITY_EDITOR + public bool ObjectPoolSystemPropertiesVisible = false; +#endif + + public static Dictionary ExistingPoolSystems = new Dictionary(); + + private static List s_PoolSystemTrackers = new List(); + + public static void PoolSystemTrackerRegistration(IPoolSystemTracker tracker, bool register = true) + { + if (register) + { + if (!s_PoolSystemTrackers.Contains(tracker)) + { + s_PoolSystemTrackers.Add(tracker); + } + } + else + { + s_PoolSystemTrackers.Remove(tracker); + } + } + + private void UpdatePoolSystemTrackers(ObjectPoolSystem poolSystem, float progress, bool isLoading = true) + { + foreach (var tracker in s_PoolSystemTrackers) + { + tracker.TrackPoolSystemLoading(poolSystem, progress, isLoading); + } + } + + public static ObjectPoolSystem GetPoolSystem(GameObject gameObject) + { + if (ExistingPoolSystems.ContainsKey(gameObject)) + { + return ExistingPoolSystems[gameObject]; + } + return null; + } + + [Tooltip("The network prefab to pool.")] + public GameObject NetworkPrefab; + + [Tooltip("How many instances of the network prefab you want available")] + public int ObjectPoolSize; + + [Tooltip("For organization purposes: when true, non-spawned instances will be migrated to the object pool's scene. (default is true)")] + public bool PoolInSystemScene = true; + + [Tooltip("When enabled, the pool will be used to spawn/recylce NetworkObjects")] + public bool UsePoolForSpawn = true; + + [Tooltip("Enable this to persist the pool objects between sessions (after first load, the pool is pre-loaded).")] + public bool DontDestroyOnSceneUnload = false; + + [Tooltip("When true, an additional set of properties will be available that you can globally set on all pool object instances.")] + public bool ExtendedProperties = false; + + [Tooltip("When true, the spawned objects will be configured to use unreliable deltas. Use this option to prevent stutter if packets are dropped due to poor network conditions.")] + public bool UseUnreliableDeltas = true; + + [Tooltip("When true, debug info will be logged about when objects are despawned and returned to the pool.")] + public bool DebugHandlerDestroy = false; + + [Tooltip("When enabled, this will expose more transform settings are applied to all spawned NetworkObjects.")] + public bool EnableTransformOverrides; + [Tooltip("Enables half float precision.")] + public bool HalfFloat; + [Tooltip("Enables quaternion synchronization.")] + public bool QuaternionSynchronization; + [Tooltip("Enables quaternion compression.")] + public bool QuaternionCompression; + [Tooltip("Enables interpolation.")] + public bool Interpolate; + + [Tooltip("When enabled, this pool will rebuild itself each time it is initialized upon loading a scene.")] + public bool ForceRebuildPool; + + private Stack m_AvailableObjects = new Stack(); + + /// + /// When a pooled object's state changes (active to not-active in the scene hierarchy), this method is invoked. + /// + private void HandleInstanceStateChange(GameObject instance, bool isSpawning = false) + { + if (PoolInSystemScene) + { + if (!isSpawning) + { + if (instance.transform.parent != null) + { + instance.transform.SetParent(null); + } + if (gameObject.scene.IsValid()) + { + SceneManager.MoveGameObjectToScene(instance, gameObject.scene); + } + } + else + { + SceneManager.MoveGameObjectToScene(instance, SceneManager.GetActiveScene()); + } + } + instance.SetActive(isSpawning); + } + + private void Start() + { + ExtendedNetworkManager.OnExiting += OnExiting; + if (ForceRebuildPool && ExistingPoolSystems.ContainsKey(NetworkPrefab)) + { + NetworkManager.Singleton.OnClientStopped += OnClientStopped; + CleanOutPool(); + } + Initialize(); + } + + private void Initialize() + { + if (!ExistingPoolSystems.ContainsKey(NetworkPrefab)) + { + NetworkManager.Singleton.PrefabHandler.AddHandler(NetworkPrefab, this); + ExistingPoolSystems.Add(NetworkPrefab, this); + if (DontDestroyOnSceneUnload) + { + DontDestroyOnLoad(gameObject); + } + StartCoroutine(CreatePrefabPool()); + } + else + { + // This is registers the prefab handler with NetworkManager + NetworkManager.Singleton.PrefabHandler.AddHandler(NetworkPrefab, ExistingPoolSystems[NetworkPrefab]); + + // This provides the mechanism that tracks the status of the object pool instance when first instantiating all objects. + ExtendedNetworkManager.Instance.TrackPoolSystemLoading(ExistingPoolSystems[NetworkPrefab], 1.0f); + if (DontDestroyOnSceneUnload) + { + Destroy(gameObject); + } + } + } + + private void OnDestroy() + { + if ((ForceRebuildPool || !DontDestroyOnSceneUnload) && ExistingPoolSystems.ContainsKey(NetworkPrefab)) + { + CleanOutPool(); + } + } + + private void OnClientStarted() + { + NetworkManager.Singleton.OnClientStopped += OnClientStopped; + } + + private void OnExiting() + { + ExtendedNetworkManager.OnExiting -= OnExiting; + if (ExistingPoolSystems.ContainsKey(NetworkPrefab)) + { + if (ExtendedNetworkManager.Instance.IsListening) + { + ExtendedNetworkManager.Instance.PrefabHandler.RemoveHandler(NetworkPrefab); + CleanOutPool(); + } + } + } + + private void OnClientStopped(bool obj) + { + NetworkManager.Singleton.OnClientStopped -= OnClientStopped; + NetworkManager.Singleton.OnClientStarted += OnClientStarted; + if (ForceRebuildPool && ExistingPoolSystems.ContainsKey(NetworkPrefab)) + { + NetworkManager.Singleton.PrefabHandler.RemoveHandler(NetworkPrefab); + CleanOutPool(); + Initialize(); + } + } + + + /// + /// Coroutine that instantiates all of the objects over time + /// + private IEnumerator CreatePrefabPool() + { + var splitCount = (int)ObjectPoolSize * 0.1f; + + while (m_AvailableObjects.Count < ObjectPoolSize) + { + for (int i = 0; i < splitCount; i++) + { + var instance = Instantiate(NetworkPrefab); + instance.name = instance.name.Replace("(Clone)", ""); + instance.name += $"_{m_AvailableObjects.Count}"; + HandleInstanceStateChange(instance); + var networkObject = instance.GetComponent(); + networkObject.SetSceneObjectStatus(); + if (ExtendedProperties) + { + var networkTransforms = instance.GetComponentsInChildren(); + foreach (var networkTransform in networkTransforms) + { + networkTransform.UseUnreliableDeltas = UseUnreliableDeltas; + if (networkTransform != null && EnableTransformOverrides) + { + networkTransform.UseHalfFloatPrecision = HalfFloat; + networkTransform.UseQuaternionSynchronization = QuaternionSynchronization; + networkTransform.UseQuaternionCompression = QuaternionCompression; + networkTransform.Interpolate = Interpolate; + } + } + } + + m_AvailableObjects.Push(networkObject); + // When not being used, parent under the pool system to make heirarchy browsing easier + // Turn off AutoObjectParentSync to avoid any errors with parenting + networkObject.AutoObjectParentSync = false; + instance.transform.parent = transform; + if (m_AvailableObjects.Count >= ObjectPoolSize) + { + break; + } + UpdatePoolSystemTrackers(this, m_AvailableObjects.Count / (float)ObjectPoolSize); + } + yield return null; + } + UpdatePoolSystemTrackers(this, m_AvailableObjects.Count / (float)ObjectPoolSize); + } + + private void CleanOutPool() + { + foreach (var poolObject in m_AvailableObjects) + { + if (poolObject != null && poolObject.gameObject != null) + { + Destroy(poolObject.gameObject); + } + } + + m_AvailableObjects.Clear(); + ExistingPoolSystems.Remove(NetworkPrefab); + } + + /// + /// The owner will use this method to pull already existing objects from the pool + /// + + public NetworkObject GetInstance(bool isSpawningLocally = false) + { + var returnValue = (NetworkObject)null; + + if (m_AvailableObjects.TryPop(out NetworkObject instance)) + { + // When being used, remove the parent and turn AutoObjectParentSync back on again + instance.transform.parent = null; + instance.AutoObjectParentSync = true; + HandleInstanceStateChange(instance.gameObject, true); + instance.DeferredDespawnTick = 0; + returnValue = instance; + } + else + { + if (NetworkManager.Singleton.LogLevel >= LogLevel.Developer) + { + NetworkLog.LogWarningServer($"[Object Pool ({name}) Exhausted] Instantiating new instances during network session!"); + } + returnValue = Instantiate(NetworkPrefab).GetComponent(); + returnValue.gameObject.name += "_NP"; + } + + if (isSpawningLocally) + { + var networkTransform = returnValue.GetComponent(); + if (networkTransform != null && EnableTransformOverrides) + { + networkTransform.UseHalfFloatPrecision = HalfFloat; + networkTransform.UseQuaternionSynchronization = QuaternionSynchronization; + networkTransform.UseQuaternionCompression = QuaternionCompression; + networkTransform.Interpolate = Interpolate; + } + } + return returnValue; + } + + /// + /// Non-owners will have this method called when the object is spawned on their side. + /// + /// the object instance to spawn locally + public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation) + { + var instance = GetInstance(!NetworkManager.Singleton.DistributedAuthorityMode && NetworkManager.Singleton.LocalClientId == ownerClientId); + instance.transform.position = position; + instance.transform.rotation = rotation; + return instance; + } + + + + /// + /// Invoked when a spawned object from the pool is despawned and destroyed + /// + public void Destroy(NetworkObject networkObject) + { + if (networkObject.gameObject.name.Contains("_NP")) + { + Destroy(networkObject.gameObject); + } + else + { + if (!DebugHandlerDestroy) + { + HandleInstanceStateChange(networkObject.gameObject); + m_AvailableObjects.Push(networkObject); + } + else + { + if (networkObject.IsSpawned) + { + Debug.LogError($"[{networkObject.name}] Is still spawned but is being put back into pool!"); + } + if (!m_AvailableObjects.Contains(networkObject)) + { + HandleInstanceStateChange(networkObject.gameObject); + m_AvailableObjects.Push(networkObject); + } + else + { + Debug.LogError($"[ObjectPoolSystem] PrefabHandler invoked twice for {networkObject.name}!"); + } + } + networkObject.transform.position = Vector3.zero; + networkObject.transform.rotation = Quaternion.identity; + // When not being used, parent under the pool system to make heirarchy browsing easier + // Turn off AutoObjectParentSync to avoid any errors with parenting + networkObject.AutoObjectParentSync = false; + networkObject.transform.parent = transform; + } + } +} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta new file mode 100644 index 0000000000..0f1e653c04 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4c75fe3e1fafc3f4bb958a66c245cdc5 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs new file mode 100644 index 0000000000..b3992ea4e8 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using UnityEngine.UI; + +public class ProgressFill : MonoBehaviour +{ + private Image Progress; + + private void Start() + { + Progress = GetComponent(); + Progress.fillAmount = 0; + } + + public void UpdateProgress(float progress) + { + Progress.fillAmount = progress; + if (progress >= 1.0f && transform.parent != null) + { + transform.parent.gameObject.SetActive(false); + } + } +} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta new file mode 100644 index 0000000000..0dd84e136e --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 409ac761620f58245aed31ff8f84e7b1 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs new file mode 100644 index 0000000000..8f54b4af7f --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs @@ -0,0 +1,599 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Unity.Netcode; +#if UNITY_EDITOR +using UnityEditor; +#endif +using UnityEngine; +using UnityEngine.SceneManagement; +using static Unity.VectorGraphics.SVGParser; + +public class SceneLoader : MonoBehaviour +{ +#if UNITY_EDITOR + public SceneAsset MainMenu; + + [Serializable] + public class SceneEntryEditor + { + public SceneAsset Scene; + public List PlayerPrefabs; + } + private List m_SceneNames = new List(); + public List NetworkScenesToLoad; + private void OnValidate() + { + m_SceneEntryInfo.Clear(); + m_SceneNames.Clear(); + if (NetworkScenesToLoad != null) + { + foreach (SceneEntryEditor sceneEntryEditor in NetworkScenesToLoad) + { + if (sceneEntryEditor == null) + { + continue; + } + if (sceneEntryEditor.Scene == null) + { + continue; + } + if (m_SceneNames.Contains(sceneEntryEditor.Scene.name)) + { + sceneEntryEditor.Scene = null; + sceneEntryEditor.PlayerPrefabs?.Clear(); + continue; + } + + var sceneEntry = new SceneEntryInfo() + { + SceneToLoad = sceneEntryEditor.Scene.name, + PlayerPrefabs = new List(sceneEntryEditor.PlayerPrefabs), + }; + + m_SceneNames.Add(sceneEntryEditor.Scene.name); + m_SceneEntryInfo.Add(sceneEntry); + } + } + if (MainMenu) + { + m_MainMenuScene = MainMenu.name; + } + } +#endif + [Serializable] + public class SceneEntryInfo + { + // The scene name to load + public string SceneToLoad; + // The list of player prefabs to use. + // Each player prefab is used once per scene loaded event of SceneToLoad. + public List PlayerPrefabs; + } + + /// + /// Primary scene entry used to cycle through scenes and scenes with paired player prefabs + /// + public class SceneEntry + { + public SceneEntryInfo SceneInfo { get; private set; } + public string SceneName { get; private set; } + public string PlayerPrefabName { get; private set; } + public bool HasPlayerPrefab { get; private set; } + + /// + /// When true and once the associated scene has been loaded, + /// iterate to the next . + /// + public bool IsLastSceneLoad { get; private set; } + + // Defaults to no entries (-1) + private int m_PlayerPrefabIndex = -1; + + public NetworkObject GetCurrentPlayerPrefab() + { + if (!HasPlayerPrefab || m_PlayerPrefabIndex < 0) + { + return null; + } + + return SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex]; + } + + public NetworkObject GetPlayerPrefabFromGlobalObjectId(uint globalObjectId) + { + if (SceneInfo.PlayerPrefabs.Count == 0) + { + return null; + } + foreach (var prefab in SceneInfo.PlayerPrefabs) + { + if (prefab.PrefabIdHash == globalObjectId) + { + return prefab; + } + } + return null; + } + + /// + /// Returns the next player prefab to be used + /// + /// Either the player prefab or none. + public string GetNextPlayerPrefabName() + { + if (!HasPlayerPrefab) + { + return string.Empty; + } + + if ((m_PlayerPrefabIndex + 1) >= SceneInfo.PlayerPrefabs.Count) + { + return string.Empty; + } + + return SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex + 1].name; + } + + /// + /// Invoked every time the associated scene is loaded. + /// + public void SceneLoaded() + { + if (IsLastSceneLoad) + { + return; + } + UpdatePlayerPrefabIndex(); + } + + /// + /// Resets this entry to be re-used again. + /// + public void Reset() + { + m_PlayerPrefabIndex = -1; + IsLastSceneLoad = false; + if (SceneInfo.PlayerPrefabs.Count > 0) + { + PlayerPrefabName = SceneInfo.PlayerPrefabs[0].name; + } + } + + private void UpdatePlayerPrefabIndex() + { + if (!HasPlayerPrefab) + { + IsLastSceneLoad = true; + } + + m_PlayerPrefabIndex++; + PlayerPrefabName = SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex].name; + IsLastSceneLoad = (m_PlayerPrefabIndex + 1) >= SceneInfo.PlayerPrefabs.Count; + } + + public SceneEntry(SceneEntryInfo sceneEntryInfo) + { + SceneInfo = sceneEntryInfo; + HasPlayerPrefab = SceneInfo.PlayerPrefabs != null && SceneInfo.PlayerPrefabs.Count > 0; + SceneName = SceneInfo.SceneToLoad; + } + } + + public bool SceneLoadingInProgress { get; private set; } + + [HideInInspector] + [SerializeField] + private string m_MainMenuScene; + + private Dictionary m_SceneEntriesTable = new Dictionary(); + private List m_SceneEntries = new List(); + + + [HideInInspector] + [SerializeField] + private List m_SceneEntryInfo = new List(); + + + private ExtendedNetworkManager m_NetworkManager; + private Scene m_CurrentLoadedScene; + + private void Awake() + { + m_NetworkManager = GetComponent(); + } + + private void Start() + { + m_SceneEntriesTable.Clear(); + for (int i = 0; i < m_SceneEntryInfo.Count; i++) + { + var entry = m_SceneEntryInfo[i]; + var sceneEntry = new SceneEntry(m_SceneEntryInfo[i]); + m_SceneEntriesTable.Add(entry.SceneToLoad, i); + m_SceneEntries.Add(sceneEntry); + } + } + + private enum SceneLoaderState + { + PreLoading, + Loaded, + Synchronized + } + + public SceneEntry CurrentSceneEntry => GetCurrentSceneEntry(); + + private string m_PreviousSceneName; + private SceneEntry GetCurrentSceneEntry(bool usePrevious = false) + { + var sceneName = usePrevious ? m_PreviousSceneName : m_CurrentLoadedScene.name; + if (string.IsNullOrEmpty(sceneName)) + { + if (usePrevious && string.IsNullOrEmpty(sceneName)) + { + return null; + } + else if (!usePrevious) + { + return null; + } + } + if (!m_SceneEntriesTable.ContainsKey(sceneName)) + { + return null; + } + return m_SceneEntries[m_SceneEntriesTable[sceneName]]; + } + + /// + /// Handles scene entry progression and tracking. + /// + /// Type of update happening (i.e. what invoked it). + /// Only set when a client is synchronized to handle late joining clients. + private void UpdateCurrentScene(SceneLoaderState loaderState, ulong clientId = ulong.MaxValue) + { + var currentEntry = GetCurrentSceneEntry(true); + m_CurrentLoadedScene = SceneManager.GetActiveScene(); + m_PreviousSceneName = m_CurrentLoadedScene.name; + if (loaderState == SceneLoaderState.PreLoading || CurrentSceneEntry == null) + { + return; + } + + // Only switch to the next scene entry when the current one is considered complete + if (loaderState == SceneLoaderState.Loaded) + { + if (currentEntry != null && currentEntry != CurrentSceneEntry) + { + // Reset this scene entry for use next time aroujnd (i.e. round robin) + currentEntry.Reset(); + } + CurrentSceneEntry.SceneLoaded(); + } + + if (!m_NetworkManager.IsServer && !m_NetworkManager.DistributedAuthorityMode) + { + return; + } + + var playerPrefab = CurrentSceneEntry.GetCurrentPlayerPrefab(); + var isSynchronize = loaderState == SceneLoaderState.Synchronized; + var playerObject = (isSynchronize && clientId != ulong.MaxValue) ? m_NetworkManager.ConnectedClients[clientId].PlayerObject : m_NetworkManager.LocalClient.PlayerObject; + if (playerPrefab != null && (playerObject != null && playerObject.PrefabIdHash != playerPrefab.PrefabIdHash)) + { + if (m_NetworkManager.DistributedAuthorityMode) + { + m_NetworkManager.LocalClient.PlayerObject?.Despawn(); + m_NetworkManager.LocalClient.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, m_NetworkManager.LocalClientId, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); + } + else if (m_NetworkManager.IsServer) + { + if (loaderState == SceneLoaderState.Synchronized) + { + // Only if a client id is specified + if (clientId != ulong.MaxValue) + { + // Spawn the player prefab specific to this SceneEntry loaded state + var synchronizedClient = m_NetworkManager.ConnectedClients[clientId]; + synchronizedClient.PlayerObject?.Despawn(true); + synchronizedClient.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, clientId, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); + } + } + else + if (loaderState == SceneLoaderState.Loaded) + { + // Spawn new player prefabs for all connected clients + foreach (var connectedClient in m_NetworkManager.ConnectedClients) + { + connectedClient.Value.PlayerObject?.Despawn(true); + connectedClient.Value.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, connectedClient.Key, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); + } + } + } + } + } + + /// + /// Invoked when the NetworkManager is started + /// + private void OnStarted() + { + m_NetworkManager.OnClientStarted -= ClientStarted; + m_NetworkManager.OnServerStarted -= ServerStarted; + m_NetworkManager.OnServerStopped += OnServerStopped; + m_NetworkManager.OnClientStopped += OnClientStopped; + m_NetworkManager.SceneManager.OnSynchronizeComplete += OnSynchronizeComplete; + if (m_NetworkManager.DistributedAuthorityMode || m_NetworkManager.IsServer) + { + m_NetworkManager.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted; + } + else + { + m_NetworkManager.SceneManager.OnLoadComplete += OnLoadComplete; + } + + // Session authority is either the server or session owner + if (m_NetworkManager.IsSessionAuthority()) + { + LoadNextScene(); + } + } + + /// + /// Invoked by clients + /// + private void OnLoadComplete(ulong clientId, string sceneName, LoadSceneMode loadSceneMode) + { + if (m_NetworkManager.IsServer) + { + Debug.LogError("Server should never be invoking this!!!"); + return; + } + UpdateCurrentScene(SceneLoaderState.Loaded); + + + m_NetworkManager.LogMessage($"Scene loading event for {sceneName} completed!"); + } + + /// + /// Invoked by the server or da clients + /// + private void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List clientsCompleted, List clientsTimedOut) + { + SceneLoadingInProgress = false; + UpdateCurrentScene(SceneLoaderState.Loaded); + var completed = string.Join(",", clientsCompleted); + var timedOut = string.Join(",", clientsTimedOut); + m_NetworkManager.LogMessage($"Scene loading event for {sceneName} completed!\n Client ids that completed event ({completed}) \n Client ids that timed out ({timedOut})"); + } + + /// + /// Handle spawning the correct player prefab for this scene + /// + /// + private void OnSynchronizeComplete(ulong clientId) + { + m_NetworkManager.LogMessage($"Client-{clientId} synchronization completed."); + + // TODO (Fix me?): This won't work for distributed authority + if (!m_NetworkManager.IsServer) + { + return; + } + UpdateCurrentScene(SceneLoaderState.Synchronized, clientId); + } + + public void DAClientStarted() + { + // Use additive client synchronization. + m_NetworkManager.SceneManager.SetClientSynchronizationMode(LoadSceneMode.Additive); + // Unload any scenes not used once the client has finished synchronizing. + m_NetworkManager.SceneManager.PostSynchronizationSceneUnloading = true; + LoadNextScene(true); + } + + private void ClientStarted() + { + OnStarted(); + } + + private void ServerStarted() + { + if (m_NetworkManager.IsHost) + { + return; + } + OnStarted(); + } + + public void LoadMainMenu() + { + if (m_MainMenuScene != string.Empty) + { + SceneManager.sceneLoaded += OnSceneLoaded; + SceneManager.LoadScene(m_MainMenuScene, LoadSceneMode.Single); + } + } + private void OnSceneLoaded(Scene sceneLoaded, LoadSceneMode loadSceneMode) + { + if (sceneLoaded.name == m_MainMenuScene) + { + SceneManager.sceneLoaded -= OnSceneLoaded; + m_NetworkManager.OnServerStopped -= OnServerStopped; + m_NetworkManager.OnClientStopped -= OnClientStopped; + m_NetworkManager.OnClientStarted += ClientStarted; + m_NetworkManager.OnServerStarted += ServerStarted; + } + } + + private void OnStopped() + { + // Reset all scene entries for next session + foreach (var sceneEntry in m_SceneEntries) + { + sceneEntry.Reset(); + } + LoadMainMenu(); + } + + private void OnServerStopped(bool wasHost) + { + if (!wasHost) + { + OnStopped(); + } + } + + private void OnClientStopped(bool wasHost) + { + OnStopped(); + } + + private string m_NextSceneLoading; + public Action OnSceneLoadStart; + + /// + /// Loads the next scene and is invoked when the load scene button is clicked. + /// + /// For the main menu prior to loading any scenes synchronized. + public void LoadNextScene(bool isPreload = false) + { + if ((!m_NetworkManager.DistributedAuthorityMode && !m_NetworkManager.IsServer) || !m_NetworkManager.IsListening) + { + return; + } + + m_NextSceneLoading = GetNextSceneToLoad(); + if (isPreload) + { + SceneManager.sceneLoaded += OnPreSceneLoaded; + SceneManager.LoadScene(m_NextSceneLoading, LoadSceneMode.Single); + SceneLoadingInProgress = true; + } + else + { + OnSceneLoadStart?.Invoke(); + var loadStatus = m_NetworkManager.SceneManager.LoadScene(m_NextSceneLoading, LoadSceneMode.Single); + if (loadStatus != SceneEventProgressStatus.Started) + { + m_NetworkManager.LogMessage($"Failed to start scene loading event for {m_NextSceneLoading}! [Status: {loadStatus}]"); + } + else + { + SceneLoadingInProgress = true; + } + } + } + + private void OnPreSceneLoaded(Scene scene, LoadSceneMode loadSceneMode) + { + if (scene.name == m_NextSceneLoading) + { + SceneManager.sceneLoaded -= OnPreSceneLoaded; + SceneLoadingInProgress = false; + UpdateCurrentScene(SceneLoaderState.PreLoading); + } + } + + /// + /// Gets the next scene to be loaded. + /// If there are more than one player prefab to use on this scene then the same scene will be returned. + /// Look at for more information on how the + /// player prefab list is incremented. + /// + private string GetNextSceneToLoad() + { + if (CurrentSceneEntry != null) + { + if (CurrentSceneEntry.IsLastSceneLoad) + { + // This prepares this entry for the next time it is the current (i.e. round robin) + return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].SceneName; + } + else + { + return CurrentSceneEntry.SceneName; + } + } + + if (m_SceneEntries != null && m_SceneEntries.Count > 0) + { + return m_SceneEntries[0].SceneInfo.SceneToLoad; + } + + return string.Empty; + } + + /// + /// Returns back the next scne that will be loaded + /// + public string GetNextSceneName() + { + if (CurrentSceneEntry != null) + { + if (!CurrentSceneEntry.IsLastSceneLoad) + { + return CurrentSceneEntry.SceneName; + } + return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].SceneName; + } + + if (m_SceneEntries != null && m_SceneEntries.Count > 0) + { + return m_SceneEntries[0].SceneInfo.SceneToLoad; + } + + return string.Empty; + } + + /// + /// Returns back the current player prefab spawned for the local client + /// + public string GetCurrentPrefabName() + { + if (m_NetworkManager.IsSessionAuthority() && CurrentSceneEntry != null) + { + return CurrentSceneEntry.PlayerPrefabName; + } + + if (CurrentSceneEntry != null && m_NetworkManager != null && m_NetworkManager.LocalClient != null && m_NetworkManager.LocalClient.PlayerObject != null) + { + var prefab = CurrentSceneEntry.GetPlayerPrefabFromGlobalObjectId(m_NetworkManager.LocalClient.PlayerObject.PrefabIdHash); + if (prefab != null) + { + return prefab.name; + } + } + + if (m_NetworkManager != null && m_NetworkManager.NetworkConfig.PlayerPrefab != null) + { + return m_NetworkManager.NetworkConfig.PlayerPrefab.name; + } + + return string.Empty; + } + + /// + /// Returns back the next player prefab to be used in the next scene being loaded + /// + public string GetNextPrefabName() + { + if (CurrentSceneEntry != null) + { + if (!CurrentSceneEntry.IsLastSceneLoad) + { + return CurrentSceneEntry.GetNextPlayerPrefabName(); + } + return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].GetNextPlayerPrefabName(); + } + + if (m_NetworkManager != null && m_NetworkManager.NetworkConfig.PlayerPrefab != null) + { + return m_NetworkManager.NetworkConfig.PlayerPrefab.name; + } + + return string.Empty; + } +} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta new file mode 100644 index 0000000000..70f2149280 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ea9c6c84f8f4a5b46b680184b3cd28c3 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Settings.meta b/Examples/NGO-N4E-Unified/Assets/Settings.meta new file mode 100644 index 0000000000..39b94dd76b --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 709f11a7f3c4041caa4ef136ea32d874 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset new file mode 100644 index 0000000000..6fb1822003 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset @@ -0,0 +1,982 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-9167874883656233139 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5485954d14dfb9a4c8ead8edb0ded5b1, type: 3} + m_Name: LiftGammaGain + m_EditorClassIdentifier: + active: 1 + lift: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gamma: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gain: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} +--- !u!114 &-8270506406425502121 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 70afe9e12c7a7ed47911bb608a23a8ff, type: 3} + m_Name: SplitToning + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + highlights: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + balance: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-8104416584915340131 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent2 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent2 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 + p21: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-7750755424749557576 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60f3b30c03e6ba64d9a27dc9dba8f28d, type: 3} + m_Name: OutlineVolumeComponent + m_EditorClassIdentifier: + active: 1 + Enabled: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-7743500325797982168 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + quality: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + clamp: + m_OverrideState: 1 + m_Value: 0.05 +--- !u!114 &-7274224791359825572 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fd9ee276a1023e439cf7a9c393195fa, type: 3} + m_Name: TestAnimationCurveVolumeComponent + m_EditorClassIdentifier: + active: 1 + testParameter: + m_OverrideState: 1 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.5 + value: 10 + inSlope: 0 + outSlope: 10 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 15 + inSlope: 10 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &-6335409530604852063 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3} + m_Name: ColorAdjustments + m_EditorClassIdentifier: + active: 1 + postExposure: + m_OverrideState: 1 + m_Value: 0 + contrast: + m_OverrideState: 1 + m_Value: 0 + colorFilter: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + hueShift: + m_OverrideState: 1 + m_Value: 0 + saturation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-6288072647309666549 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 29fa0085f50d5e54f8144f766051a691, type: 3} + m_Name: FilmGrain + m_EditorClassIdentifier: + active: 1 + type: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + response: + m_OverrideState: 1 + m_Value: 0.8 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} +--- !u!114 &-5520245016509672950 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + neutralHDRRangeReductionMode: + m_OverrideState: 1 + m_Value: 2 + acesPreset: + m_OverrideState: 1 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 1 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 1 + m_Value: 0 + paperWhite: + m_OverrideState: 1 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 1 + m_Value: 1 + minNits: + m_OverrideState: 1 + m_Value: 0.005 + maxNits: + m_OverrideState: 1 + m_Value: 1000 +--- !u!114 &-5360449096862653589 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: VolumeComponentSupportedEverywhere + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedEverywhere + active: 1 +--- !u!114 &-5139089513906902183 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a00a63fdd6bd2a45ab1f2d869305ffd, type: 3} + m_Name: OasisFogVolumeComponent + m_EditorClassIdentifier: + active: 1 + Density: + m_OverrideState: 1 + m_Value: 0 + StartDistance: + m_OverrideState: 1 + m_Value: 0 + HeightRange: + m_OverrideState: 1 + m_Value: {x: 0, y: 50} + Tint: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + SunScatteringIntensity: + m_OverrideState: 1 + m_Value: 2 +--- !u!114 &-4463884970436517307 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb60a22f311433c4c962b888d1393f88, type: 3} + m_Name: PaniniProjection + m_EditorClassIdentifier: + active: 1 + distance: + m_OverrideState: 1 + m_Value: 0 + cropToFit: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &-1410297666881709256 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6bd486065ce11414fa40e631affc4900, type: 3} + m_Name: ProbeVolumesOptions + m_EditorClassIdentifier: + active: 1 + normalBias: + m_OverrideState: 1 + m_Value: 0.33 + viewBias: + m_OverrideState: 1 + m_Value: 0 + scaleBiasWithMinProbeDistance: + m_OverrideState: 1 + m_Value: 0 + samplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + animateSamplingNoise: + m_OverrideState: 1 + m_Value: 1 + leakReductionMode: + m_OverrideState: 1 + m_Value: 1 + minValidDotProductValue: + m_OverrideState: 1 + m_Value: 0.1 + occlusionOnlyReflectionNormalization: + m_OverrideState: 1 + m_Value: 1 + intensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + skyOcclusionIntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &-1216621516061285780 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + skipIterations: + m_OverrideState: 1 + m_Value: 1 + threshold: + m_OverrideState: 1 + m_Value: 0.9 + intensity: + m_OverrideState: 1 + m_Value: 0 + scatter: + m_OverrideState: 1 + m_Value: 0.7 + clamp: + m_OverrideState: 1 + m_Value: 65472 + tint: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + highQualityFiltering: + m_OverrideState: 1 + m_Value: 0 + downscale: + m_OverrideState: 1 + m_Value: 0 + maxIterations: + m_OverrideState: 1 + m_Value: 6 + dirtTexture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + dirtIntensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-1170528603972255243 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 221518ef91623a7438a71fef23660601, type: 3} + m_Name: WhiteBalance + m_EditorClassIdentifier: + active: 1 + temperature: + m_OverrideState: 1 + m_Value: 0 + tint: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-581120513425526550 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent3 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent3 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 + p31: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: DefaultVolumeProfile + m_EditorClassIdentifier: + components: + - {fileID: -9167874883656233139} + - {fileID: 1918650496244738858} + - {fileID: 853819529557874667} + - {fileID: 1052315754049611418} + - {fileID: -1170528603972255243} + - {fileID: -8270506406425502121} + - {fileID: -5520245016509672950} + - {fileID: 7173750748008157695} + - {fileID: 1666464333004379222} + - {fileID: 9001657382290151224} + - {fileID: -6335409530604852063} + - {fileID: -1216621516061285780} + - {fileID: 3959858460715838825} + - {fileID: -7743500325797982168} + - {fileID: 4644742534064026673} + - {fileID: -4463884970436517307} + - {fileID: -6288072647309666549} + - {fileID: 7518938298396184218} + - {fileID: -1410297666881709256} + - {fileID: -7750755424749557576} + - {fileID: -5139089513906902183} +--- !u!114 &853819529557874667 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 06437c1ff663d574d9447842ba0a72e4, type: 3} + m_Name: ScreenSpaceLensFlare + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + tintColor: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + bloomMip: + m_OverrideState: 1 + m_Value: 1 + firstFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + secondaryFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareScale: + m_OverrideState: 1 + m_Value: {x: 1, y: 1} + samples: + m_OverrideState: 1 + m_Value: 1 + sampleDimmer: + m_OverrideState: 1 + m_Value: 0.5 + vignetteEffect: + m_OverrideState: 1 + m_Value: 1 + startingPosition: + m_OverrideState: 1 + m_Value: 1.25 + scale: + m_OverrideState: 1 + m_Value: 1.5 + streaksIntensity: + m_OverrideState: 1 + m_Value: 0 + streaksLength: + m_OverrideState: 1 + m_Value: 0.5 + streaksOrientation: + m_OverrideState: 1 + m_Value: 0 + streaksThreshold: + m_OverrideState: 1 + m_Value: 0.25 + resolution: + m_OverrideState: 1 + m_Value: 4 + chromaticAbberationIntensity: + m_OverrideState: 1 + m_Value: 0.5 +--- !u!114 &1052315754049611418 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 558a8e2b6826cf840aae193990ba9f2e, type: 3} + m_Name: ShadowsMidtonesHighlights + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + midtones: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + highlights: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + shadowsStart: + m_OverrideState: 1 + m_Value: 0 + shadowsEnd: + m_OverrideState: 1 + m_Value: 0.3 + highlightsStart: + m_OverrideState: 1 + m_Value: 0.55 + highlightsEnd: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &1666464333004379222 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3eb4b772797da9440885e8bd939e9560, type: 3} + m_Name: ColorCurves + m_EditorClassIdentifier: + active: 1 + master: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + red: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + green: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + blue: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsHue: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + satVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + lumVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &1918650496244738858 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e021b4c809a781e468c2988c016ebbea, type: 3} + m_Name: ColorLookup + m_EditorClassIdentifier: + active: 1 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + contribution: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &3959858460715838825 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c01700fd266d6914ababb731e09af2eb, type: 3} + m_Name: DepthOfField + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + gaussianStart: + m_OverrideState: 1 + m_Value: 10 + gaussianEnd: + m_OverrideState: 1 + m_Value: 30 + gaussianMaxRadius: + m_OverrideState: 1 + m_Value: 1 + highQualitySampling: + m_OverrideState: 1 + m_Value: 0 + focusDistance: + m_OverrideState: 1 + m_Value: 10 + aperture: + m_OverrideState: 1 + m_Value: 5.6 + focalLength: + m_OverrideState: 1 + m_Value: 50 + bladeCount: + m_OverrideState: 1 + m_Value: 5 + bladeCurvature: + m_OverrideState: 1 + m_Value: 1 + bladeRotation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &4251301726029935498 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 74955a4b0b4243bc87231e8b59ed9140, type: 3} + m_Name: TestVolume + m_EditorClassIdentifier: + active: 1 + param: + m_OverrideState: 1 + m_Value: 123 +--- !u!114 &4644742534064026673 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 81180773991d8724ab7f2d216912b564, type: 3} + m_Name: ChromaticAberration + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &6940869943325143175 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: VolumeComponentSupportedOnAnySRP + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedOnAnySRP + active: 1 +--- !u!114 &7173750748008157695 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} + m_Name: Vignette + m_EditorClassIdentifier: + active: 1 + color: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + intensity: + m_OverrideState: 1 + m_Value: 0 + smoothness: + m_OverrideState: 1 + m_Value: 0.2 + rounded: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &7518938298396184218 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c5e1dc532bcb41949b58bc4f2abfbb7e, type: 3} + m_Name: LensDistortion + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + xMultiplier: + m_OverrideState: 1 + m_Value: 1 + yMultiplier: + m_OverrideState: 1 + m_Value: 1 + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + scale: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &9001657382290151224 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cdfbdbb87d3286943a057f7791b43141, type: 3} + m_Name: ChannelMixer + m_EditorClassIdentifier: + active: 1 + redOutRedIn: + m_OverrideState: 1 + m_Value: 100 + redOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + redOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + greenOutRedIn: + m_OverrideState: 1 + m_Value: 0 + greenOutGreenIn: + m_OverrideState: 1 + m_Value: 100 + greenOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + blueOutRedIn: + m_OverrideState: 1 + m_Value: 0 + blueOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + blueOutBlueIn: + m_OverrideState: 1 + m_Value: 100 +--- !u!114 &9122958982931076880 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent1 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent1 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta new file mode 100644 index 0000000000..53b314adfa --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab09877e2e707104187f6f83e2f62510 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset new file mode 100644 index 0000000000..521491ec74 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset @@ -0,0 +1,144 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: Mobile_RPAsset + m_EditorClassIdentifier: + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: 65bc7dbf4170f435aa868c779acfb082, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 0 + m_RequireOpaqueTexture: 0 + m_OpaqueDownsampling: 0 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_HDRColorBufferPrecision: 0 + m_MSAA: 1 + m_RenderScale: 0.8 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 1024 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 0 + m_AdditionalLightsShadowmapResolution: 2048 + m_AdditionalLightsShadowResolutionTierLow: 256 + m_AdditionalLightsShadowResolutionTierMedium: 512 + m_AdditionalLightsShadowResolutionTierHigh: 1024 + m_ReflectionProbeBlending: 1 + m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 1 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} + m_CascadeBorder: 0.2 + m_ShadowDepthBias: 1 + m_ShadowNormalBias: 1 + m_AnyShadowsSupported: 1 + m_SoftShadowsSupported: 0 + m_ConservativeEnclosingSphere: 1 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 2 + m_AdditionalLightsCookieResolution: 1024 + m_AdditionalLightsCookieFormat: 1 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 1 + m_StoreActionsOptimization: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 + m_UseFastSRGBLinearConversion: 1 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 3 + m_PrefilteringModeAdditionalLight: 4 + m_PrefilteringModeAdditionalLightShadows: 0 + m_PrefilterXRKeywords: 1 + m_PrefilteringModeForwardPlus: 1 + m_PrefilteringModeDeferredRendering: 0 + m_PrefilteringModeScreenSpaceOcclusion: 0 + m_PrefilteringModeScreenSpaceReflection: 1 + m_PrefilterWriteSmoothness: 1 + m_PrefilterDebugKeywords: 1 + m_PrefilterWriteRenderingLayers: 1 + m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 0 + m_PrefilterSSAODepthNormals: 1 + m_PrefilterSSAOSourceDepthLow: 1 + m_PrefilterSSAOSourceDepthMedium: 0 + m_PrefilterSSAOSourceDepthHigh: 1 + m_PrefilterSSAOInterleaved: 0 + m_PrefilterSSAOBlueNoise: 1 + m_PrefilterSSAOSampleCountLow: 1 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 1 + m_PrefilterDBufferMRT1: 1 + m_PrefilterDBufferMRT2: 1 + m_PrefilterDBufferMRT3: 1 + m_PrefilterSoftShadowsQualityLow: 1 + m_PrefilterSoftShadowsQualityMedium: 1 + m_PrefilterSoftShadowsQualityHigh: 1 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 + m_PrefilterNativeRenderPass: 1 + m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta new file mode 100644 index 0000000000..3660d1516d --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e6cbd92db86f4b18aec3ed561671858 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset new file mode 100644 index 0000000000..ea246b2594 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: Mobile_Renderer + m_EditorClassIdentifier: + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, + type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 0} + probeVolumeFragmentationDebugShader: {fileID: 0} + probeVolumeOffsetDebugShader: {fileID: 0} + probeVolumeSamplingDebugShader: {fileID: 0} + probeSamplingDebugMesh: {fileID: 0} + probeSamplingDebugTexture: {fileID: 0} + probeVolumeBlendStatesCS: {fileID: 0} + m_RendererFeatures: [] + m_RendererFeatureMap: + m_UseNativeRenderPass: 1 + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_AssetVersion: 2 + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 0 + stencilCompareFunction: 8 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 0 + m_RenderingMode: 0 + m_DepthPrimingMode: 0 + m_CopyDepthMode: 0 + m_AccurateGbufferNormals: 0 + m_IntermediateTextureMode: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta new file mode 100644 index 0000000000..a3588b1a9b --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65bc7dbf4170f435aa868c779acfb082 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset new file mode 100644 index 0000000000..73f9aa7cb9 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset @@ -0,0 +1,144 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: PC_RPAsset + m_EditorClassIdentifier: + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: f288ae1f4751b564a96ac7587541f7a2, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 1 + m_RequireOpaqueTexture: 1 + m_OpaqueDownsampling: 1 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_HDRColorBufferPrecision: 0 + m_MSAA: 1 + m_RenderScale: 1 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 2048 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 1 + m_AdditionalLightsShadowmapResolution: 2048 + m_AdditionalLightsShadowResolutionTierLow: 256 + m_AdditionalLightsShadowResolutionTierMedium: 512 + m_AdditionalLightsShadowResolutionTierHigh: 1024 + m_ReflectionProbeBlending: 1 + m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 4 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.12299999, y: 0.2926, z: 0.53599995} + m_CascadeBorder: 0.107758604 + m_ShadowDepthBias: 0.1 + m_ShadowNormalBias: 0.5 + m_AnyShadowsSupported: 1 + m_SoftShadowsSupported: 1 + m_ConservativeEnclosingSphere: 1 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 3 + m_AdditionalLightsCookieResolution: 2048 + m_AdditionalLightsCookieFormat: 3 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 1 + m_StoreActionsOptimization: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 + m_UseFastSRGBLinearConversion: 0 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 3 + m_PrefilteringModeAdditionalLight: 4 + m_PrefilteringModeAdditionalLightShadows: 0 + m_PrefilterXRKeywords: 1 + m_PrefilteringModeForwardPlus: 1 + m_PrefilteringModeDeferredRendering: 0 + m_PrefilteringModeScreenSpaceOcclusion: 1 + m_PrefilteringModeScreenSpaceReflection: 1 + m_PrefilterWriteSmoothness: 1 + m_PrefilterDebugKeywords: 1 + m_PrefilterWriteRenderingLayers: 0 + m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 0 + m_PrefilterSSAODepthNormals: 0 + m_PrefilterSSAOSourceDepthLow: 1 + m_PrefilterSSAOSourceDepthMedium: 1 + m_PrefilterSSAOSourceDepthHigh: 1 + m_PrefilterSSAOInterleaved: 1 + m_PrefilterSSAOBlueNoise: 0 + m_PrefilterSSAOSampleCountLow: 1 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 1 + m_PrefilterDBufferMRT1: 1 + m_PrefilterDBufferMRT2: 1 + m_PrefilterDBufferMRT3: 0 + m_PrefilterSoftShadowsQualityLow: 0 + m_PrefilterSoftShadowsQualityMedium: 0 + m_PrefilterSoftShadowsQualityHigh: 0 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 + m_PrefilterNativeRenderPass: 1 + m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta new file mode 100644 index 0000000000..e286b2fdd0 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b83569d67af61e458304325a23e5dfd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset new file mode 100644 index 0000000000..475b02e557 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset @@ -0,0 +1,95 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: PC_Renderer + m_EditorClassIdentifier: + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, + type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 4800000, guid: e5c6678ed2aaa91408dd3df699057aae, + type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 03cfc4915c15d504a9ed85ecc404e607, + type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: 53a11f4ebaebf4049b3638ef78dc9664, + type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: 8f96cd657dc40064aa21efcc7e50a2e7, + type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 57d7c4c16e2765b47a4d2069b311bffe, + type: 3} + probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, + type: 3} + probeVolumeBlendStatesCS: {fileID: 7200000, guid: b9a23f869c4fd45f19c5ada54dd82176, + type: 3} + m_RendererFeatures: + - {fileID: 7833122117494664109} + m_RendererFeatureMap: ad6b866f10d7b46c + m_UseNativeRenderPass: 1 + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_AssetVersion: 2 + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 1 + stencilCompareFunction: 3 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 1 + m_RenderingMode: 2 + m_DepthPrimingMode: 0 + m_CopyDepthMode: 0 + m_AccurateGbufferNormals: 0 + m_IntermediateTextureMode: 0 +--- !u!114 &7833122117494664109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3} + m_Name: ScreenSpaceAmbientOcclusion + m_EditorClassIdentifier: + m_Active: 1 + m_Settings: + AOMethod: 0 + Downsample: 0 + AfterOpaque: 0 + Source: 1 + NormalSamples: 1 + Intensity: 0.4 + DirectLightingStrength: 0.25 + Radius: 0.3 + Samples: 1 + BlurQuality: 0 + Falloff: 100 + SampleCount: -1 + m_BlueNoise256Textures: + - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} + - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} + - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} + - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} + - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} + - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} + - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} + m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta new file mode 100644 index 0000000000..ddae6a5f01 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f288ae1f4751b564a96ac7587541f7a2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset new file mode 100644 index 0000000000..c1b0f6319b --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7893295128165547882 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + skipIterations: + m_OverrideState: 1 + m_Value: 0 + threshold: + m_OverrideState: 1 + m_Value: 1 + intensity: + m_OverrideState: 1 + m_Value: 0.25 + scatter: + m_OverrideState: 1 + m_Value: 0.5 + clamp: + m_OverrideState: 0 + m_Value: 65472 + tint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + highQualityFiltering: + m_OverrideState: 1 + m_Value: 1 + downscale: + m_OverrideState: 0 + m_Value: 0 + maxIterations: + m_OverrideState: 0 + m_Value: 6 + dirtTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + dimension: 1 + dirtIntensity: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &-3357603926938260329 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} + m_Name: Vignette + m_EditorClassIdentifier: + active: 1 + color: + m_OverrideState: 0 + m_Value: {r: 0, g: 0, b: 0, a: 1} + center: + m_OverrideState: 0 + m_Value: {x: 0.5, y: 0.5} + intensity: + m_OverrideState: 1 + m_Value: 0.2 + smoothness: + m_OverrideState: 0 + m_Value: 0.2 + rounded: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: SampleSceneProfile + m_EditorClassIdentifier: + components: + - {fileID: 849379129802519247} + - {fileID: -7893295128165547882} + - {fileID: 7391319092446245454} + - {fileID: -3357603926938260329} +--- !u!114 &849379129802519247 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 1 + neutralHDRRangeReductionMode: + m_OverrideState: 0 + m_Value: 2 + acesPreset: + m_OverrideState: 0 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 0 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 1 + m_Value: 0 + paperWhite: + m_OverrideState: 1 + m_Value: 234 + detectBrightnessLimits: + m_OverrideState: 1 + m_Value: 1 + minNits: + m_OverrideState: 1 + m_Value: 0.005 + maxNits: + m_OverrideState: 1 + m_Value: 647 +--- !u!114 &7391319092446245454 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 0 + mode: + m_OverrideState: 0 + m_Value: 0 + quality: + m_OverrideState: 1 + m_Value: 2 + intensity: + m_OverrideState: 1 + m_Value: 0.6 + clamp: + m_OverrideState: 0 + m_Value: 0.05 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta new file mode 100644 index 0000000000..b82270c5b2 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10fc4df2da32a41aaa32d77bc913491c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset new file mode 100644 index 0000000000..3cda20b841 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -0,0 +1,462 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3} + m_Name: UniversalRenderPipelineGlobalSettings + m_EditorClassIdentifier: + m_ShaderStrippingSetting: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + m_URPShaderStrippingSetting: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + m_ShaderVariantLogLevel: 0 + m_ExportShaderVariants: 1 + m_StripDebugVariants: 1 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + supportRuntimeDebugDisplay: 0 + m_Settings: + m_SettingsList: + m_List: + - rid: 6852985685364965376 + - rid: 6852985685364965377 + - rid: 6852985685364965378 + - rid: 6852985685364965379 + - rid: 6852985685364965380 + - rid: 6852985685364965381 + - rid: 6852985685364965382 + - rid: 6852985685364965383 + - rid: 6852985685364965384 + - rid: 6852985685364965385 + - rid: 6852985685364965386 + - rid: 6852985685364965387 + - rid: 6852985685364965388 + - rid: 6852985685364965389 + - rid: 6852985685364965390 + - rid: 6852985685364965391 + - rid: 6852985685364965392 + - rid: 6852985685364965393 + - rid: 6852985685364965394 + - rid: 8712630790384254976 + - rid: 1499458198383362048 + - rid: 1499458198383362049 + - rid: 1499458198383362050 + - rid: 1499458198383362051 + - rid: 1499458198383362052 + - rid: 1499458198383362053 + - rid: 1499458198383362054 + - rid: 1499458198383362055 + - rid: 1499458198383362056 + - rid: 1499458198383362057 + - rid: 1499458198383362058 + - rid: 1499458198383362059 + - rid: 1499458198383362060 + - rid: 1499458198383362061 + - rid: 1499458198383362062 + - rid: 1499458198383362063 + - rid: 1499458198383362064 + m_RuntimeSettings: + m_List: [] + m_AssetVersion: 10 + m_ObsoleteDefaultVolumeProfile: {fileID: 0} + m_RenderingLayerNames: + - Light Layer default + - Light Layer 1 + - Light Layer 2 + - Light Layer 3 + - Light Layer 4 + - Light Layer 5 + - Light Layer 6 + - Light Layer 7 + m_ValidRenderingLayers: 0 + lightLayerName0: Light Layer default + lightLayerName1: Light Layer 1 + lightLayerName2: Light Layer 2 + lightLayerName3: Light Layer 3 + lightLayerName4: Light Layer 4 + lightLayerName5: Light Layer 5 + lightLayerName6: Light Layer 6 + lightLayerName7: Light Layer 7 + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + references: + version: 2 + RefIds: + - rid: 1499458198383362048 + type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime} + data: + m_Version: 1 + m_GeometryPoolKernels: {fileID: 7200000, guid: 98e3d58cae7210c4786f67f504c9e899, type: 3} + m_CopyBuffer: {fileID: 7200000, guid: 1b95b5dcf48d1914c9e1e7405c7660e3, type: 3} + m_CopyPositions: {fileID: 7200000, guid: 1ad53a96b58d3c3488dde4f14db1aaeb, type: 3} + m_BitHistogram: {fileID: 7200000, guid: 8670f7ce4b60cef43bed36148aa1b0a2, type: 3} + m_BlockReducePart: {fileID: 7200000, guid: 4e034cc8ea2635c4e9f063e5ddc7ea7a, type: 3} + m_BlockScan: {fileID: 7200000, guid: 4d6d5de35fa45ef4a92119397a045cc9, type: 3} + m_BuildHlbvh: {fileID: 7200000, guid: 2d70cd6be91bd7843a39a54b51c15b13, type: 3} + m_RestructureBvh: {fileID: 7200000, guid: 56641cb88dcb31a4398a4997ef7a7a8c, type: 3} + m_Scatter: {fileID: 7200000, guid: a2eaeefdac4637a44b734e85b7be9186, type: 3} + - rid: 1499458198383362049 + type: {class: UniversalRenderPipelineEditorAssets, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultSettingsVolumeProfile: {fileID: 11400000, guid: eda47df5b85f4f249abf7abd73db2cb2, type: 2} + - rid: 1499458198383362050 + type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_IncludeTerrainShaders: 1 + - rid: 1499458198383362051 + type: {class: MipGenRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_ColorPyramidPS: {fileID: 4800000, guid: 63b92baba208e314c8fdebe52ca0cc34, type: 3} + m_ColorPyramidCS: {fileID: 7200000, guid: 28969cfddd9ef3f4e94b971690146a4f, type: 3} + m_DepthPyramidCS: {fileID: 7200000, guid: 90a204702cd44e54cac7ed4fc6e5d86b, type: 3} + - rid: 1499458198383362052 + type: {class: OnTilePostProcessResource, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_UberPostShader: {fileID: 4800000, guid: fe4f13c1004a07d4ea1e30bfd0326d9e, type: 3} + - rid: 1499458198383362053 + type: {class: ScreenSpaceAmbientOcclusionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} + m_Version: 0 + - rid: 1499458198383362054 + type: {class: ScreenSpaceAmbientOcclusionDynamicResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_BlueNoise256Textures: + - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} + - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} + - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} + - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} + - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} + - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} + - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} + m_Version: 0 + - rid: 1499458198383362055 + type: {class: PostProcessData/TextureResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + blueNoise16LTex: + - {fileID: 2800000, guid: 81200413a40918d4d8702e94db29911c, type: 3} + - {fileID: 2800000, guid: d50c5e07c9911a74982bddf7f3075e7b, type: 3} + - {fileID: 2800000, guid: 1134690bf9216164dbc75050e35b7900, type: 3} + - {fileID: 2800000, guid: 7ce2118f74614a94aa8a0cdf2e6062c3, type: 3} + - {fileID: 2800000, guid: 2ca97df9d1801e84a8a8f2c53cb744f0, type: 3} + - {fileID: 2800000, guid: e63eef8f54aa9dc4da9a5ac094b503b5, type: 3} + - {fileID: 2800000, guid: 39451254daebd6d40b52899c1f1c0c1b, type: 3} + - {fileID: 2800000, guid: c94ad916058dff743b0f1c969ddbe660, type: 3} + - {fileID: 2800000, guid: ed5ea7ce59ca8ec4f9f14bf470a30f35, type: 3} + - {fileID: 2800000, guid: 071e954febf155243a6c81e48f452644, type: 3} + - {fileID: 2800000, guid: 96aaab9cc247d0b4c98132159688c1af, type: 3} + - {fileID: 2800000, guid: fc3fa8f108657e14486697c9a84ccfc5, type: 3} + - {fileID: 2800000, guid: bfed3e498947fcb4890b7f40f54d85b9, type: 3} + - {fileID: 2800000, guid: d512512f4af60a442ab3458489412954, type: 3} + - {fileID: 2800000, guid: 47a45908f6db0cb44a0d5e961143afec, type: 3} + - {fileID: 2800000, guid: 4dcc0502f8586f941b5c4a66717205e8, type: 3} + - {fileID: 2800000, guid: 9d92991794bb5864c8085468b97aa067, type: 3} + - {fileID: 2800000, guid: 14381521ff11cb74abe3fe65401c23be, type: 3} + - {fileID: 2800000, guid: d36f0fe53425e08499a2333cf423634c, type: 3} + - {fileID: 2800000, guid: d4044ea2490d63b43aa1765f8efbf8a9, type: 3} + - {fileID: 2800000, guid: c9bd74624d8070f429e3f46d161f9204, type: 3} + - {fileID: 2800000, guid: d5c9b274310e5524ebe32a4e4da3df1f, type: 3} + - {fileID: 2800000, guid: f69770e54f2823f43badf77916acad83, type: 3} + - {fileID: 2800000, guid: 10b6c6d22e73dea46a8ab36b6eebd629, type: 3} + - {fileID: 2800000, guid: a2ec5cbf5a9b64345ad3fab0912ddf7b, type: 3} + - {fileID: 2800000, guid: 1c3c6d69a645b804fa232004b96b7ad3, type: 3} + - {fileID: 2800000, guid: d18a24d7b4ed50f4387993566d9d3ae2, type: 3} + - {fileID: 2800000, guid: c989e1ed85cf7154caa922fec53e6af6, type: 3} + - {fileID: 2800000, guid: ff47e5a0f105eb34883b973e51f4db62, type: 3} + - {fileID: 2800000, guid: fa042edbfc40fbd4bad0ab9d505b1223, type: 3} + - {fileID: 2800000, guid: 896d9004736809c4fb5973b7c12eb8b9, type: 3} + - {fileID: 2800000, guid: 179f794063d2a66478e6e726f84a65bc, type: 3} + filmGrainTex: + - {fileID: 2800000, guid: 654c582f7f8a5a14dbd7d119cbde215d, type: 3} + - {fileID: 2800000, guid: dd77ffd079630404e879388999033049, type: 3} + - {fileID: 2800000, guid: 1097e90e1306e26439701489f391a6c0, type: 3} + - {fileID: 2800000, guid: f0b67500f7fad3b4c9f2b13e8f41ba6e, type: 3} + - {fileID: 2800000, guid: 9930fb4528622b34687b00bbe6883de7, type: 3} + - {fileID: 2800000, guid: bd9e8c758250ef449a4b4bfaad7a2133, type: 3} + - {fileID: 2800000, guid: 510a2f57334933e4a8dbabe4c30204e4, type: 3} + - {fileID: 2800000, guid: b4db8180660810945bf8d55ab44352ad, type: 3} + - {fileID: 2800000, guid: fd2fd78b392986e42a12df2177d3b89c, type: 3} + - {fileID: 2800000, guid: 5cdee82a77d13994f83b8fdabed7c301, type: 3} + smaaAreaTex: {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3} + smaaSearchTex: {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3} + m_TexturesResourcesVersion: 0 + - rid: 1499458198383362056 + type: {class: UniversalRenderPipelineRuntimeXRResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_xrOcclusionMeshPS: {fileID: 4800000, guid: 4431b1f1f743fbf4eb310a967890cbea, type: 3} + m_xrMirrorViewPS: {fileID: 4800000, guid: d5a307c014552314b9f560906d708772, type: 3} + m_xrMotionVector: {fileID: 4800000, guid: f89aac1e4f84468418fe30e611dff395, type: 3} + - rid: 1499458198383362057 + type: {class: ScreenSpaceReflectionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Shader: {fileID: 4800000, guid: 7b3e6785f5f6b634794df3a85a2a35da, type: 3} + m_Version: 0 + - rid: 1499458198383362058 + type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + - rid: 1499458198383362059 + type: {class: PostProcessData/ShaderResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + stopNanPS: {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3} + subpixelMorphologicalAntialiasingPS: {fileID: 4800000, guid: 63eaba0ebfb82cc43bde059b4a8c65f6, type: 3} + gaussianDepthOfFieldPS: {fileID: 4800000, guid: 5e7134d6e63e0bc47a1dd2669cedb379, type: 3} + bokehDepthOfFieldPS: {fileID: 4800000, guid: 2aed67ad60045d54ba3a00c91e2d2631, type: 3} + cameraMotionBlurPS: {fileID: 4800000, guid: 1edcd131364091c46a17cbff0b1de97a, type: 3} + paniniProjectionPS: {fileID: 4800000, guid: a15b78cf8ca26ca4fb2090293153c62c, type: 3} + lutBuilderLdrPS: {fileID: 4800000, guid: 65df88701913c224d95fc554db28381a, type: 3} + lutBuilderHdrPS: {fileID: 4800000, guid: ec9fec698a3456d4fb18cf8bacb7a2bc, type: 3} + bloomPS: {fileID: 4800000, guid: 5f1864addb451f54bae8c86d230f736e, type: 3} + temporalAntialiasingPS: {fileID: 4800000, guid: 9c70c1a35ff15f340b38ea84842358bf, type: 3} + LensFlareDataDrivenPS: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3} + LensFlareScreenSpacePS: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, type: 3} + scalingSetupPS: {fileID: 4800000, guid: e8ee25143a34b8c4388709ea947055d1, type: 3} + easuPS: {fileID: 4800000, guid: 562b7ae4f629f144aa97780546fce7c6, type: 3} + uberPostPS: {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3} + finalPostPassPS: {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3} + m_ShaderResourcesVersion: 0 + - rid: 1499458198383362060 + type: {class: URPReflectionProbeSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} + data: + version: 1 + useReflectionProbeRotation: 0 + - rid: 1499458198383362061 + type: {class: LightmapSamplingSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + m_UseBicubicLightmapSampling: 0 + - rid: 1499458198383362062 + type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_PanelSettings: {fileID: 0} + m_StyleSheets: + - {fileID: 7433441132597879392, guid: 0ff99fd36f66f1a41bcc1d3c90e0922a, type: 3} + - {fileID: 7433441132597879392, guid: 3a8aa4d508da46d4dace18b280f064aa, type: 3} + m_VisualTreeAsset: {fileID: 0} + - rid: 1499458198383362063 + type: {class: VrsRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_TextureComputeShader: {fileID: 7200000, guid: cacb30de6c40c7444bbc78cb0a81fd2a, type: 3} + m_VisualizationShader: {fileID: 4800000, guid: 620b55b8040a88d468e94abe55bed5ba, type: 3} + m_VisualizationLookupTable: + m_Data: + - {r: 0.785, g: 0.23, b: 0.2, a: 1} + - {r: 1, g: 0.8, b: 0.8, a: 1} + - {r: 0.4, g: 0.2, b: 0.2, a: 1} + - {r: 0.51, g: 0.8, b: 0.6, a: 1} + - {r: 0.6, g: 0.8, b: 1, a: 1} + - {r: 0.2, g: 0.4, b: 0.6, a: 1} + - {r: 0.8, g: 1, b: 0.8, a: 1} + - {r: 0.2, g: 0.4, b: 0.2, a: 1} + - {r: 0.125, g: 0.22, b: 0.36, a: 1} + m_ConversionLookupTable: + m_Data: + - {r: 0.785, g: 0.23, b: 0.2, a: 1} + - {r: 1, g: 0.8, b: 0.8, a: 1} + - {r: 0.4, g: 0.2, b: 0.2, a: 1} + - {r: 0.51, g: 0.8, b: 0.6, a: 1} + - {r: 0.6, g: 0.8, b: 1, a: 1} + - {r: 0.2, g: 0.4, b: 0.6, a: 1} + - {r: 0.8, g: 1, b: 0.8, a: 1} + - {r: 0.2, g: 0.4, b: 0.2, a: 1} + - {r: 0.125, g: 0.22, b: 0.36, a: 1} + - rid: 1499458198383362064 + type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime} + data: + _version: 3 + _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3} + _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3} + _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3} + _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3} + _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2} + _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2} + _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3} + - rid: 6852985685364965376 + type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + - rid: 6852985685364965377 + type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} + m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3} + m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3} + m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} + m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} + m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} + - rid: 6852985685364965378 + type: {class: UniversalRendererResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_CameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3} + m_StencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} + m_ClusterDeferred: {fileID: 4800000, guid: 222cce62363a44a380c36bf03b392608, type: 3} + m_StencilDitherMaskSeedPS: {fileID: 4800000, guid: 8c3ee818f2efa514c889881ccb2e95a2, type: 3} + m_DBufferClear: {fileID: 4800000, guid: f056d8bd2a1c7e44e9729144b4c70395, type: 3} + - rid: 6852985685364965379 + type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DebugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + m_HdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + m_ProbeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} + - rid: 6852985685364965380 + type: {class: UniversalRenderPipelineRuntimeShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_FallbackErrorShader: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} + m_BlitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} + m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} + m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3} + m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} + m_TerrainDetailLit: {fileID: 0} + m_TerrainDetailGrassBillboard: {fileID: 0} + m_TerrainDetailGrass: {fileID: 0} + - rid: 6852985685364965381 + type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 1 + m_BlueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + m_BayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} + m_DebugFontTex: {fileID: 2800000, guid: 26a413214480ef144b2915d6ff4d0beb, type: 3} + - rid: 6852985685364965382 + type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_LightShader: {fileID: 4800000, guid: 3f6c848ca3d7bca4bbe846546ac701a1, type: 3} + m_ProjectedShadowShader: {fileID: 4800000, guid: ce09d4a80b88c5a4eb9768fab4f1ee00, type: 3} + m_SpriteShadowShader: {fileID: 4800000, guid: 44fc62292b65ab04eabcf310e799ccf6, type: 3} + m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3} + m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3} + m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3} + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} + m_DefaultMesh2DLitMaterial: {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} + - rid: 6852985685364965383 + type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_SimpleLitMaterial: {fileID: 2100000, guid: 6a1143ee683302f4aa628c052723efc1, type: 2} + m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} + m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} + m_DefaultSpriteMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + - rid: 6852985685364965384 + type: {class: URPDefaultVolumeProfileSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_VolumeProfile: {fileID: 11400000, guid: ab09877e2e707104187f6f83e2f62510, type: 2} + - rid: 6852985685364965385 + type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + - rid: 6852985685364965386 + type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} + data: + m_Version: 0 + m_InstanceDataBufferCopyKernels: {fileID: 7200000, guid: f984aeb540ded8b4fbb8a2047ab5b2e2, type: 3} + m_InstanceDataBufferUploadKernels: {fileID: 7200000, guid: 53864816eb00f2343b60e1a2c5a262ef, type: 3} + m_TransformUpdaterKernels: {fileID: 7200000, guid: 2a567b9b2733f8d47a700c3c85bed75b, type: 3} + m_WindDataUpdaterKernels: {fileID: 7200000, guid: fde76746e4fd0ed418c224f6b4084114, type: 3} + m_OccluderDepthPyramidKernels: {fileID: 7200000, guid: 08b2b5fb307b0d249860612774a987da, type: 3} + m_InstanceOcclusionCullingKernels: {fileID: 7200000, guid: f6d223acabc2f974795a5a7864b50e6c, type: 3} + m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3} + m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3} + m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} + - rid: 6852985685364965387 + type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} + m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} + m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} + - rid: 6852985685364965388 + type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + dilationShader: {fileID: 7200000, guid: 6bb382f7de370af41b775f54182e491d, type: 3} + subdivideSceneCS: {fileID: 7200000, guid: bb86f1f0af829fd45b2ebddda1245c22, type: 3} + voxelizeSceneShader: {fileID: 4800000, guid: c8b6a681c7b4e2e4785ffab093907f9e, type: 3} + traceVirtualOffsetCS: {fileID: -6772857160820960102, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + traceVirtualOffsetRT: {fileID: -5126288278712620388, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + skyOcclusionCS: {fileID: -6772857160820960102, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + skyOcclusionRT: {fileID: -5126288278712620388, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + renderingLayerCS: {fileID: -6772857160820960102, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + - rid: 6852985685364965389 + type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + m_ProbeVolumeDisableStreamingAssets: 0 + - rid: 6852985685364965390 + type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeDebugShader: {fileID: 4800000, guid: 3b21275fd12d65f49babb5286f040f2d, type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 3a80877c579b9144ebdcc6d923bca303, type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: bf54e6528c79a224e96346799064c393, type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3} + numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} + - rid: 6852985685364965391 + type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_IncludeReferencedInScenes: 0 + m_IncludeAssetsByLabel: 0 + m_LabelToInclude: + - rid: 6852985685364965392 + type: {class: ShaderStrippingSetting, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + - rid: 6852985685364965393 + type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeBlendStatesCS: {fileID: 7200000, guid: a3f7b8c99de28a94684cb1daebeccf5d, type: 3} + probeVolumeUploadDataCS: {fileID: 7200000, guid: 0951de5992461754fa73650732c4954c, type: 3} + probeVolumeUploadDataL2CS: {fileID: 7200000, guid: 6196f34ed825db14b81fb3eb0ea8d931, type: 3} + - rid: 6852985685364965394 + type: {class: RenderGraphGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_EnableCompilationCaching: 1 + m_EnableValidityChecks: 1 + - rid: 8712630790384254976 + type: {class: RenderGraphUtilsResources, ns: UnityEngine.Rendering.RenderGraphModule.Util, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_CoreCopyPS: {fileID: 4800000, guid: 12dc59547ea167a4ab435097dd0f9add, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta new file mode 100644 index 0000000000..81b84f2ae1 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18dc0cd2c080841dea60987a38ce93fa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Packages/manifest.json b/Examples/NGO-N4E-Unified/Packages/manifest.json new file mode 100644 index 0000000000..f5b45a0fe6 --- /dev/null +++ b/Examples/NGO-N4E-Unified/Packages/manifest.json @@ -0,0 +1,56 @@ +{ + "dependencies": { + "com.unity.ai.navigation": "2.0.11", + "com.unity.collab-proxy": "2.11.4", + "com.unity.ide.rider": "3.0.38", + "com.unity.ide.visualstudio": "2.0.26", + "com.unity.inputsystem": "1.19.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.netcode": "6.6.0", + "com.unity.netcode.gameobjects": "file:../../../com.unity.netcode.gameobjects", + "com.unity.render-pipelines.universal": "17.6.0", + "com.unity.services.multiplayer": "2.1.3", + "com.unity.test-framework": "1.7.0", + "com.unity.timeline": "1.8.11", + "com.unity.ugui": "2.5.0", + "com.unity.visualscripting": "1.9.10", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.timelinefoundation": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + }, + "testables": [ + "com.unity.netcode.gameobjects" + ] +} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000000..27287fec5f --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json b/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json new file mode 100644 index 0000000000..6a932fa204 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json @@ -0,0 +1,19 @@ +{ + "MonoBehaviour": { + "Version": 5, + "EnableBurstCompilation": false, + "EnableOptimisations": false, + "EnableSafetyChecks": false, + "EnableDebugInAllBuilds": false, + "DebugDataKind": 1, + "EnableArmv9SecurityFeatures": false, + "CpuMinTargetX32": 0, + "CpuMaxTargetX32": 0, + "CpuMinTargetX64": 0, + "CpuMaxTargetX64": 0, + "CpuTargetsX32": 6, + "CpuTargetsX64": 72, + "OptimizeFor": 0, + "FloatMode": 0 + } +} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000000..e7886b266a --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json b/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json new file mode 100644 index 0000000000..a6a6297703 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json @@ -0,0 +1,6 @@ +{ + "MonoBehaviour": { + "Version": 5, + "DisabledWarnings": "" + } +} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000000..fc90ab9589 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000000..398d1e53f0 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/ExampleHybridSpawn.unity + guid: 99c9720ab356a0642a771bea13969a05 + m_configObjects: + com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000000..45126b427a --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 16 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerCacheSize: 10 + m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 + m_AsyncShaderCompilation: 1 + m_BlockShaders: 0 + m_UnlockBlockShaders: 0 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 1 + m_EnterPlayModeOptions: 0 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 + m_UseLegacyProbeSampleCount: 0 + m_DisableCookiesInLightmapper: 0 + m_ShadowmaskStitching: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableTls: 0 + m_CacheServerImportResultCachingEnabled: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 + m_ReferencedClipsExactNaming: 1 + m_ForceAssetUnloadAndGCOnSceneLoad: 1 + m_HideBuildProfileClassicPlatforms: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset new file mode 100644 index 0000000000..baf6668fde --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2ea235c1fcfe29488ed97c467a0da53, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Entities.Build::Unity.Entities.Build.EntitiesClientSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000000..dbc7252d4f --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,81 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 16 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_PreloadShadersBatchTimeLimit: -1 + m_GraphicsStateCollection: {fileID: 0} + m_CollectionStartupAction: 0 + m_TraceSavePath: TracedCollection + m_TraceSendToEditor: 1 + m_AdditionalWarmupCollections: [] + m_WarmupAsync: 1 + m_EnableCacheMissTracing: 0 + m_WarmupProgressivelyLimit: -1 + m_CacheMissCollectionPath: CacheMissCollection + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_BrgStripping: 0 + m_DefaultLightBaker: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_RenderPipelineGlobalSettingsMap: + UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, type: 2} + m_ShaderBuildSettings: + keywordDeclarationOverrides: [] + numInternalDefines: 0 + defines: [] + m_LightsUseLinearIntensity: 1 + m_LightsUseColorTemperature: 1 + m_LogWhenShaderIsCompiled: 0 + m_LightProbeOutsideHullStrategy: 0 + m_CameraRelativeLightCulling: 0 + m_CameraRelativeShadowCulling: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset new file mode 100644 index 0000000000..b16147e954 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000000..5b5facecac --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000000..f1d03dfbac --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: + 1: [] + 2: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000000..3b0b7c3d18 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset new file mode 100644 index 0000000000..f7669489e9 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4111970df3904877aade1a474116e5c2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeClientAndServerSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] + AdditionalScriptingDefines: [] + GlobalNetCodeConfig: {fileID: 11400000, guid: 70e9b26fe069d0a449180c6f69a25b8e, type: 2} + CurrentImportanceSuggestions: + - MinValue: 1 + MaxValue: 4 + Name: Low Importance + Tooltip: For cosmetic (i.e. visual-only) ghosts like glass bottles, signs, beach-balls, + and cones etc. Typically Static. + - MinValue: 5 + MaxValue: 40 + Name: Medium Importance + Tooltip: For common gameplay-affecting ghosts like trees, doors, explosive barrels, + dropped loot etc. Typically Static. + - MinValue: 50 + MaxValue: 250 + Name: High Importance + Tooltip: For per-player and objective-critical ghosts like Player Character Controllers + and CTF flags etc. Typically for Dynamic i.e. Predicted ghosts. + UsePreSerialization is likely a good fit. + - MinValue: 1000 + MaxValue: 0 + Name: Critical Importance + Tooltip: For gameplay critical singletons like the one keeping the current score, + or the one denoting whether or not the current round has started etc. Choose + UsePreSerialization, and use sparingly. diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset new file mode 100644 index 0000000000..58930c0c7b --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2e9c940b409a48c5acdcb17d07582bb1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeClientSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] + AdditionalScriptingDefines: [] + ClientTarget: 1 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset new file mode 100644 index 0000000000..88da96cee2 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 70bae3f5df04479cba47f4cd56a60d53, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeServerSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] + AdditionalScriptingDefines: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000000..c646e41a07 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_IsUnityRegistry: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_Data: -928 + m_OriginalEntityId: + m_Data: -930 + m_LoadAssets: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000000..6c5cf8a004 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 0 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 0000000000..049c7454b5 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000000..67a94daefe --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000000..4148ec39fe --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,948 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 28 + productGUID: 6fcde3c494e537b45adf2ff21120a1fa + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: N4ETestPad + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 1 + unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + adjustIOSFPSUsingThermalState: 1 + thermalStateSeriousIOSFPS: 30 + thermalStateCriticalIOSFPS: 15 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidRequestedVisibleInsets: 0 + androidSystemBarsBehavior: 2 + androidDisplayOptions: 1 + androidBlitType: 0 + androidResizeableActivity: 1 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 1 + androidApplicationEntry: 2 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + dedicatedServerOptimizations: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + meshDeformation: 2 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + metalUseMetalDisplayLink: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchMaxWorkerMultiple: 8 + switchNVNGraphicsFirmwareMemory: 32 + switchGraphicsJobsSyncAfterKick: 1 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 1 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 + bundleVersion: 0.1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.4 + androidMinAspectRatio: 1 + applicationIdentifier: + Android: com.UnityTechnologies.com.unity.template.urpblank + Standalone: com.Unity-Technologies.com.unity.template.urp-blank + iPhone: com.Unity-Technologies.com.unity.template.urp-blank + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 26 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + AndroidPreferredDataLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + androidSplitApplicationBinary: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSSimulatorArchitecture: 0 + iOSTargetOSVersionString: 15.0 + tvOSSdkVersion: 0 + tvOSSimulatorArchitecture: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 15.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 + xcodeProjectType: 0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + metalCompileShaderBinary: 0 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 3c72c65a16f0acb438eed22b8b16c24a + templatePackageId: com.unity.template.urp-blank@17.0.14 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 2 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + AndroidReportGooglePlayAppDependencies: 1 + androidSymbolsSizeThreshold: 800 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: iPhone + m_Icons: + - m_Textures: [] + m_Width: 180 + m_Height: 180 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 167 + m_Height: 167 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 152 + m_Height: 152 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 76 + m_Height: 76 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 87 + m_Height: 87 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 60 + m_Height: 60 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 20 + m_Height: 20 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 4 + m_SubKind: App Store + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + - m_BuildTarget: tvOS + m_Icons: + - m_Textures: [] + m_Width: 1280 + m_Height: 768 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 800 + m_Height: 480 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 400 + m_Height: 240 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 4640 + m_Height: 1440 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 2320 + m_Height: 720 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 3840 + m_Height: 1440 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 1920 + m_Height: 720 + m_Kind: 1 + m_SubKind: + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: [] + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 0 + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - serializedVersion: 2 + m_BuildTarget: Android + m_EncodingQuality: 1 + m_BuildTargetGroupHDRCubemapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: + - m_BuildTarget: Android + m_Encoding: 1 + m_BuildTargetDefaultTextureCompressionFormat: + - serializedVersion: 3 + m_BuildTarget: Android + m_Formats: 03000000 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 12.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchEnableFileSystemTrace: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchDisableHTCSPlayerConnection: 0 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + switchUpgradedPlayerSettingsToNMETA: 0 + switchCaStoreSource: 0 + switchCaStoreFilePath: + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 + webWasm2023: 1 + webEnableSubmoduleStrippingCompatibility: 0 + scriptingDefineSymbols: + Standalone: NETCODE_GAMEOBJECT_BRIDGE_EXPERIMENTAL;NETCODE_EXPERIMENTAL_SINGLE_WORLD_HOST;UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD;OUT_OF_BAND_RPC + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: + Android: 1 + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + il2cppLTOMode: {} + il2cppStacktraceInformation: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + editorAssembliesCompatibilityLevel: 1 + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: N4ETestPad + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: N4ETestPad + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 0 + hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: + apiCompatibilityLevel: 6 + captureStartupLogs: {} + activeInputHandler: 2 + windowsGamepadBackendHint: 0 + enableDirectStorage: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} + d3d12DeviceFilterListAsset: {fileID: 0} + allowedHttpConnections: 3 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000000..78dd0ec189 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 6000.6.0a1 +m_EditorVersionWithRevision: 6000.6.0a1 (ec1914e25129) diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000000..f55198a746 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset @@ -0,0 +1,134 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 1 + m_QualitySettings: + - serializedVersion: 4 + name: Mobile + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 + vSyncCount: 0 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 + lodBias: 1 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, + type: 2} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: + - Standalone + - serializedVersion: 4 + name: PC + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 2 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 + vSyncCount: 0 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 + lodBias: 2 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, + type: 2} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: + - Android + - iPhone + m_TextureMipmapLimitGroupNames: [] + m_PerPlatformDefaultQuality: + Android: 0 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Lumin: 0 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + Server: 0 + Stadia: 0 + Standalone: 1 + WebGL: 0 + Windows Store Apps: 0 + XboxOne: 0 + iPhone: 0 + tvOS: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json b/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000000..ede5887b3a --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset new file mode 100644 index 0000000000..ce8c243288 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3} + m_Name: + m_EditorClassIdentifier: + shaderVariantLimit: 128 + overrideShaderVariantLimit: 0 + customInterpolatorErrorThreshold: 32 + customInterpolatorWarningThreshold: 16 + customHeatmapValues: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset new file mode 100644 index 0000000000..6413d11ff5 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 + m_RenderingLayers: + - Default + - Light Layer 1 + - Light Layer 2 + - Light Layer 3 + - Light Layer 4 + - Light Layer 5 + - Light Layer 6 + - Light Layer 7 + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000000..558a017e1f --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset new file mode 100644 index 0000000000..6ad5631834 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LastMaterialVersion: 10 + m_ProjectSettingFolderPath: URPDefaultResources diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000000..029ad8b9e7 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + InsightsSettings: + m_EngineDiagnosticsEnabled: 1 + m_Enabled: 0 + CrashReportingSettings: + serializedVersion: 2 + m_EventUrl: https://perf-events.cloud.unity3d.com + m_EnableCloudDiagnosticsReporting: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000000..3a95c98bec --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000000..dca288142f --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json b/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json new file mode 100644 index 0000000000..41dd8fc08a --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json @@ -0,0 +1,4 @@ +{ + "PlayerTags": [], + "version": "6000.6.0a1" +} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000000..482590c196 --- /dev/null +++ b/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file From 78874ffcf1bf4e74ceebbfd5c4657a2f1744e1dc Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 8 Apr 2026 14:39:45 -0500 Subject: [PATCH 58/99] fix NetworkBehaviour entry fix for the child behaviours being converted to a table. --- com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index b360a5b069..43de83f0ce 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -2646,7 +2646,7 @@ internal void InvokeBehaviourNetworkSpawn() { if (NetworkManagerOwner.LogLevel <= LogLevel.Developer) { - NetworkLog.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour)}"); + NetworkLog.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour.Value)}"); } continue; } From 164a71356ab0af9e2032cf12aa7a0e1eae2c94a8 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 23 Apr 2026 14:54:42 -0500 Subject: [PATCH 59/99] Integration tests WIP --- .../Components/Helpers/NetworkObjectBridge.cs | 72 ++++-- .../Helpers/UnifiedUpdateConnections.cs | 98 ++++---- .../Runtime/Components/NetworkTransform.cs | 2 +- .../Runtime/Configuration/NetworkPrefabs.cs | 6 +- .../Connection/NetworkConnectionManager.cs | 3 + .../Runtime/Core/NetworkManager.cs | 17 +- .../Runtime/Core/NetworkObject.cs | 2 +- .../Messaging/NetworkMessageManager.cs | 4 + .../Unified/UnifiedNetcodeTransport.cs | 50 +++- .../UnifiedNetworkTransformTest.cs | 91 +++++++ .../UnifiedNetworkTransformTest.cs.meta | 3 + .../TestHelpers/NetcodeIntegrationTest.cs | 113 +++++++++ .../Unity.Netcode.Runtime.Tests.asmdef | 4 +- testproject/Assets/NetCodeConfig.asset | 76 ++++++ testproject/Assets/NetCodeConfig.asset.meta | 8 + testproject/Packages/manifest.json | 34 +-- testproject/Packages/packages-lock.json | 234 +++++++++++------- .../PackageManagerSettings.asset | 35 +-- .../ProjectSettings/ProjectSettings.asset | 39 +-- 19 files changed, 656 insertions(+), 235 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs.meta create mode 100644 testproject/Assets/NetCodeConfig.asset create mode 100644 testproject/Assets/NetCodeConfig.asset.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 103da29d6a..189aba00fd 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -2,10 +2,12 @@ using System; using Unity.Entities; using Unity.NetCode; +using UnityEngine; namespace Unity.Netcode { +#if UNIFIED_NETCODE /// /// TODO-UNIFIED: Needs further peer review and exploring alternate ways of handling this. /// @@ -15,7 +17,7 @@ namespace Unity.Netcode public partial class NetworkObjectBridge : GhostBehaviour { -#if UNITY_EDITOR +#if UNITY_EDITOR && !UNITY_INCLUDE_TESTS [UnityEngine.HideInInspector] [UnityEngine.SerializeField] private bool m_Sorted = false; @@ -52,6 +54,7 @@ public void SetNetworkObjectId(ulong value) NetworkObjectId.Value = value; } } +#endif /// /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. @@ -63,13 +66,20 @@ internal class UnifiedBootStrap : ClientServerBootstrap public static UnifiedBootStrap Instance { get; private set; } public static Action OnInitialized; public static ushort Port = 7979; + public static NetworkManager CurrentNetworkManagerForInitialization; - public static World World { get; private set; } + public static World LastCreatedWorld { get; private set; } + private static int WorldCounter = 0; + public override bool Initialize(string defaultWorldName) { - var networkManager = NetworkManager.Singleton; - Instance = this; + var networkManager = CurrentNetworkManagerForInitialization; + if (networkManager == NetworkManager.Singleton) + { + Instance = this; + } + AutoConnectPort = Port; if (base.Initialize(defaultWorldName)) { @@ -77,32 +87,44 @@ public override bool Initialize(string defaultWorldName) return true; } - World = networkManager.IsServer ? CreateSingleWorldHost("ClientAndServerWorld") : CreateClientWorld("ClientWorld"); - - if (World == null) + if (networkManager != null) { - UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); - return false; - } + Debug.Log($"Starting a world for {(networkManager.IsServer ? "Host" : "Client")}"); + LastCreatedWorld = networkManager.IsServer + ? CreateSingleWorldHost($"ClientAndServerWorld {WorldCounter++}") + : CreateClientWorld($"ClientWorld {WorldCounter++}"); - if (!World.IsCreated) - { - UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); - return false; - } + if (LastCreatedWorld == null) + { + UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); + return false; + } - if (networkManager.LogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Created world: {World.Name}"); - } + if (!LastCreatedWorld.IsCreated) + { + UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); + return false; + } - if (networkManager.NetworkConfig.Prefabs.HasPendingGhostPrefabs) - { - if (networkManager.LogLevel <= LogLevel.Developer) + //if (networkManager.LogLevel <= LogLevel.Developer) { - NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Registering hybrid prefabs..."); + NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Created world: {LastCreatedWorld.Name} / {LastCreatedWorld.SequenceNumber}"); } - networkManager.NetworkConfig.Prefabs.RegisterGhostPrefabs(networkManager); + + networkManager.NetcodeWorld = (NetcodeWorld)LastCreatedWorld; + if (networkManager.NetworkConfig.Prefabs.HasPendingGhostPrefabs) + { + if (networkManager.LogLevel <= LogLevel.Developer) + { + NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Registering hybrid prefabs..."); + } + + networkManager.NetworkConfig.Prefabs.RegisterGhostPrefabs(networkManager); + } + } + else + { + LastCreatedWorld = CreateLocalWorld("LocalWorld"); } OnInitialized?.Invoke(); @@ -112,7 +134,7 @@ public override bool Initialize(string defaultWorldName) ~UnifiedBootStrap() { - World = null; + LastCreatedWorld = null; Instance = null; } } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index faa1b12d67..b7730b49cd 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -3,6 +3,7 @@ using Unity.Collections; using Unity.Entities; using Unity.NetCode; +using UnityEngine; namespace Unity.Netcode.Components { @@ -36,64 +37,75 @@ protected override void OnUpdate() { var isServer = World.IsServer(); var commandBuffer = new EntityCommandBuffer(Allocator.Temp); - var networkManager = NetworkManager.Singleton; - - foreach (var (networkId, connectionState, entity) in SystemAPI.Query().WithNone().WithEntityAccess()) - { - commandBuffer.RemoveComponent(entity); - m_TempConnections.Add(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); - } - foreach (var con in m_TempConnections) +// var networkManager = NetworkManager.Singleton; + foreach (var networkManager in GameObject.FindObjectsByType()) { - NetworkManager.OnNetCodeDisconnect?.Invoke(con); - } - - m_TempConnections.Clear(); + foreach (var (networkId, connectionState, entity) in SystemAPI.Query() + .WithNone().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + m_TempConnections.Add(new NetcodeConnection + { World = World, Entity = entity, NetworkId = networkId.Value }); + } - // TODO: We should figure out how to associate the N4E NetworkId with the NGO ClientId - foreach (var (networkId, entity) in SystemAPI.Query().WithAll().WithNone().WithEntityAccess()) - { - if (!m_NewConnections.ContainsKey(networkId.Value)) + foreach (var con in m_TempConnections) { - var newConnection = new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }; - m_NewConnections.Add(networkId.Value, newConnection); + NetworkManager.OnNetCodeDisconnect?.Invoke(con); } - } - // If we have any pending connections - if (m_NewConnections.Count > 0) - { - foreach (var entry in m_NewConnections) + m_TempConnections.Clear(); + + // TODO: We should figure out how to associate the N4E NetworkId with the NGO ClientId + foreach (var (networkId, entity) in SystemAPI.Query().WithAll() + .WithNone().WithEntityAccess()) { - // Server: always connect - // Client: wait until we have synchronized before announcing we are ready to receive snapshots - if (networkManager.IsServer || (!networkManager.IsServer && networkManager.IsConnectedClient)) + if (!m_NewConnections.ContainsKey(networkId.Value)) { - // Set the connection in-game - commandBuffer.AddComponent(entry.Value.Entity); - commandBuffer.AddComponent(entry.Value.Entity, default(ConnectionState)); - NetworkManager.OnNetCodeConnect?.Invoke(entry.Value); - m_TempConnections.Add(entry.Value); + var newConnection = new NetcodeConnection + { World = World, Entity = entity, NetworkId = networkId.Value }; + m_NewConnections.Add(networkId.Value, newConnection); } } - // Remove any connections that have "gone in-game". - foreach (var connection in m_TempConnections) + + // If we have any pending connections + if (m_NewConnections.Count > 0) { - m_NewConnections.Remove(connection.NetworkId); + foreach (var entry in m_NewConnections) + { + // Server: always connect + // Client: wait until we have synchronized before announcing we are ready to receive snapshots + if (networkManager.IsServer || (!networkManager.IsServer && networkManager.IsConnectedClient)) + { + // Set the connection in-game + commandBuffer.AddComponent(entry.Value.Entity); + commandBuffer.AddComponent(entry.Value.Entity, default(ConnectionState)); + NetworkManager.OnNetCodeConnect?.Invoke(entry.Value); + m_TempConnections.Add(entry.Value); + } + } + + // Remove any connections that have "gone in-game". + foreach (var connection in m_TempConnections) + { + m_NewConnections.Remove(connection.NetworkId); + } } - } - m_TempConnections.Clear(); - // If the local NetworkManager is shutting down or no longer connected, then - // make sure we have disconnected all known connections. - if (networkManager.ShutdownInProgress || !networkManager.IsListening) - { - foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) + m_TempConnections.Clear(); + + // If the local NetworkManager is shutting down or no longer connected, then + // make sure we have disconnected all known connections. + if (networkManager.ShutdownInProgress || !networkManager.IsListening) { - commandBuffer.RemoveComponent(entity); - NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection { World = World, Entity = entity, NetworkId = networkId.Value }); + foreach (var (networkId, entity) in SystemAPI.Query().WithEntityAccess()) + { + commandBuffer.RemoveComponent(entity); + NetworkManager.OnNetCodeDisconnect?.Invoke(new NetcodeConnection + { World = World, Entity = entity, NetworkId = networkId.Value }); + } } } + commandBuffer.Playback(EntityManager); } diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs index 8474b3b415..e74d2e20d1 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs @@ -3741,7 +3741,7 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState() /// The internal initialzation method to allow for internal API adjustments /// /// - private void InternalInitialization(bool isOwnershipChange = false) + internal virtual void InternalInitialization(bool isOwnershipChange = false) { #if UNIFIED_NETCODE diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs index f414283c0d..c402adf04c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs @@ -362,7 +362,7 @@ internal void RegisterGhostPrefabs(NetworkManager networkManager) var networkPrefab = m_PendingGhostRegistration[i]; // Returns false if the single world is not available yet - if (NetCode.Netcode.RegisterPrefabSingleWorld(networkPrefab.Prefab, isHost)) + if (NetCode.Netcode.RegisterPrefabSingleWorld(networkPrefab.Prefab, isHost, networkManager.NetcodeWorld)) { Debug.Log($"[{nameof(NetworkPrefabs)}][{nameof(RegisterGhostPrefabs)}] Registered hybrid spawned object: {networkPrefab.Prefab.name}"); m_PendingGhostRegistration.RemoveAt(i); @@ -394,9 +394,9 @@ private bool AddPrefabRegistration(NetworkPrefab networkPrefab) #if UNIFIED_NETCODE if (networkPrefab.HasGhost) { - HasPendingGhostPrefabs = true; + //HasPendingGhostPrefabs = true; HasGhostPrefabs = true; - m_PendingGhostRegistration.Add(networkPrefab); + //m_PendingGhostRegistration.Add(networkPrefab); } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs index 058fb6a38b..eefb1e51da 100644 --- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs @@ -6,6 +6,9 @@ using System.Runtime.CompilerServices; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; +#if UNIFIED_NETCODE +using Unity.Netcode.Unified; +#endif using Unity.Profiling; using UnityEngine; using Debug = UnityEngine.Debug; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index b3bba1c4b4..5f8473d89c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1319,20 +1319,25 @@ private bool CanStart(StartType type) return true; } + public NetcodeWorld NetcodeWorld { get; internal set; } + #if UNIFIED_NETCODE private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) { - if (NetCode.Netcode.IsActive) + if (this == Singleton) { - NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point."); + if (NetCode.Netcode.IsActive) + { + NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point."); + } + /// !! Important !! + /// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session. + NetCode.Netcode.Reset(); } - /// !! Important !! - /// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session. - NetCode.Netcode.Reset(); - /// !! Initialize worlds here !! /// Worlds are created here: + UnifiedBootStrap.CurrentNetworkManagerForInitialization = this; DefaultWorldInitialization.Initialize("Default World", false); // This should not be needed at this point, but this is here in the event something changes. diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 43de83f0ce..803284ac45 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3886,7 +3886,7 @@ private void Start() private void InitGhost() { // All instances with Ghosts are automatically registered - if (HasGhost && NetworkObjectBridge) + if (HasGhost && NetworkObjectBridge && !GhostAdapter.IsPrefab()) { if (NetworkManager.LogLevel == LogLevel.Developer) { diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs index c66aa62273..40be416a00 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs @@ -228,6 +228,8 @@ internal void HandleIncomingData(ulong clientId, ArraySegment data, float { unsafe { + + //Debug.Log($"Receiving {data.Count} bytes: {ByteArrayToString(data.Array, data.Offset, data.Count)}"); fixed (byte* dataPtr = data.Array) { var batchReader = new FastBufferReader(dataPtr + data.Offset, Allocator.None, data.Count); @@ -394,6 +396,7 @@ public void HandleMessage(in NetworkMessageHeader header, FastBufferReader reade }; var type = m_ReverseTypeMap[header.MessageType]; + Debug.Log($"Got message of type {type}"); if (!CanReceive(senderId, type, reader, ref context)) { return; @@ -870,6 +873,7 @@ internal unsafe void ProcessSendQueues() try { + //Debug.Log($"Sending {queueItem.Writer.Length} bytes: {ByteArrayToString(queueItem.Writer.ToArray(), 0, queueItem.Writer.Length)}"); m_Sender.Send(clientId, queueItem.NetworkDelivery, queueItem.Writer); for (var hookIdx = 0; hookIdx < m_Hooks.Count; ++hookIdx) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index f8d97072fb..f95c10e721 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -253,8 +253,10 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; - - connectionInfo.Connection.SendOutOfBandMessage(rpc); + + var req = m_NetworkManager.NetcodeWorld.EntityManager.CreateEntity(ComponentType.ReadWrite(), ComponentType.ReadWrite()); + m_NetworkManager.NetcodeWorld.EntityManager.SetComponentData(req, new SendRpcCommandRequest{TargetConnection = connectionInfo.Connection.ConnectionEntity}); + m_NetworkManager.NetcodeWorld.EntityManager.SetComponentData(req, rpc); connectionInfo.SendQueue.Consume(amount); } @@ -369,41 +371,63 @@ private void OnServerClientDisconnected(Connection connection, NetCodeConnection { InvokeOnTransportEvent(NetworkEvent.Disconnect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); } + + private void OnClientConnectionEvent(Connection connection, NetCodeConnectionEvent connectionEvent) + { + switch (connectionEvent.State) + { + case ConnectionState.State.Connected: + OnClientConnectedToServer(connection, connectionEvent); + break; + case ConnectionState.State.Disconnected: + OnClientDisconnectFromServer(connection, connectionEvent); + break; + } + } + + private void OnServerConnectionEvent(Connection connection, NetCodeConnectionEvent connectionEvent) + { + switch (connectionEvent.State) + { + case ConnectionState.State.Connected: + OnServerNewClientConnection(connection, connectionEvent); + break; + case ConnectionState.State.Disconnected: + OnServerClientDisconnected(connection, connectionEvent); + break; + } + } public override bool StartClient() { - NetCode.Netcode.Client.OnConnect = OnClientConnectedToServer; - NetCode.Netcode.Client.OnDisconnect = OnClientDisconnectFromServer; - var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); + m_NetworkManager.NetcodeWorld.OnConnectionEvent += OnClientConnectionEvent; + var updateSystem = m_NetworkManager.NetcodeWorld.GetExistingSystemManaged(); updateSystem.Transport = this; return true; } public override bool StartServer() { - foreach (var connection in NetCode.Netcode.Server.Connections) + foreach (var connection in m_NetworkManager.NetcodeWorld.AllConnections) { OnServerNewClientConnection(connection, default); } - NetCode.Netcode.Server.OnConnect = OnServerNewClientConnection; - NetCode.Netcode.Server.OnDisconnect = OnServerClientDisconnected; - var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); + m_NetworkManager.NetcodeWorld.OnConnectionEvent += OnServerConnectionEvent; + var updateSystem = m_NetworkManager.NetcodeWorld.GetExistingSystemManaged(); updateSystem.Transport = this; return true; } public override void DisconnectRemoteClient(ulong clientId) { - var updateSystem = NetCode.Netcode.GetWorld(true).GetExistingSystemManaged(); - updateSystem.Disconnect(m_Connections[(int)clientId].Connection); + m_NetworkManager.NetcodeWorld.DisconnectAClient(m_Connections[(int)clientId].Connection); m_Connections.Remove((int)clientId); } public override void DisconnectLocalClient() { - var updateSystem = NetCode.Netcode.GetWorld(false).GetExistingSystemManaged(); - updateSystem.Disconnect(m_Connections[(int)ServerClientId].Connection); + m_NetworkManager.NetcodeWorld.RequestDisconnectFromServer(); m_Connections.Remove((int)ServerClientId); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs new file mode 100644 index 0000000000..fd41c89b00 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs @@ -0,0 +1,91 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using Unity.NetCode; +using Unity.Netcode.Components; +using Unity.Netcode.TestHelpers.Runtime; +using UnityEngine; +using UnityEngine.TestTools; + +namespace Unity.Netcode.RuntimeTests +{ + /// + /// Test class that deliberately removes some functionality from NetworkTransform that is conditionally disabled + /// by the presence of ghost objects in the base class. This is to help be certain that the network transform + /// is not doing the work, but that the work is being done by N4E's snapshots. + /// + public class DoNothingNetworkTransform : NetworkTransform + { + public override void OnNetworkSpawn() + { + // Deliberately left empty + } + + internal override void InternalInitialization(bool isOwnershipChange = false) + { + // Deliberately left empty + } + } + + public class UnifiedNetworkTransformTest : IntegrationTestWithApproximation + { + protected override int NumberOfClients => 2; + + private GameObject m_Prefab; + private NetworkObject m_Instance; + + protected override void OnServerAndClientsCreated() + { + m_Prefab = CreateNetworkObjectPrefab("Test prefab"); + SetupGhostAdapterForNetworkObjectPrefab(ref m_Prefab); + + m_Prefab.AddComponent(); + + /*NetCode.Netcode.RunOnServerStarted(() => + { + NetCode.Netcode.RegisterPrefabSingleWorld(m_PlayerPrefab, true); + });*/ + } + + protected override IEnumerator OnServerAndClientsConnected() + { + m_Instance = SpawnObject(m_Prefab, m_ServerNetworkManager).GetComponent(); + yield return WaitForConditionOrTimeOut(() => + { + foreach (var client in m_ClientNetworkManagers) + { + if (!s_GlobalNetworkObjects.ContainsKey(client.LocalClientId) || !s_GlobalNetworkObjects[client.LocalClientId].ContainsKey(m_Instance.NetworkObjectId)) + { + return false; + } + } + + return true; + }); + AssertOnTimeout($"Timed out waiting for objects to spawn!"); + yield return null; + } + + [UnityTest] + public IEnumerator BasicMovementTest() + { + var authority = GetAuthorityNetworkManager(); + var originalPos = authority.LocalClient.PlayerObject.transform.position; + var newPos = originalPos + new Vector3(1, 1, 1); + + m_Instance.transform.position = newPos; + + foreach (var client in m_ClientNetworkManagers) + { + Assert.IsTrue(Approximately(originalPos, s_GlobalNetworkObjects[client.LocalClientId][m_Instance.NetworkObjectId].transform.position)); + } + + yield return new WaitForSeconds(1); + + foreach (var client in m_ClientNetworkManagers) + { + Assert.IsTrue(Approximately(newPos, s_GlobalNetworkObjects[client.LocalClientId][m_Instance.NetworkObjectId].transform.position)); + } + } + } +} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs.meta new file mode 100644 index 0000000000..10d990cfa3 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0f26fa7bd5474b3f9947e0813374b50f +timeCreated: 1775078549 \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index 9e439ba098..49194efb71 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1,13 +1,17 @@ using System; using System.Collections; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using NUnit.Framework; +using Unity.Entities; +using Unity.NetCode; using Unity.Netcode.RuntimeTests; using Unity.Netcode.Transports.UTP; +using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestTools; @@ -2192,6 +2196,95 @@ protected GameObject CreateNetworkObjectPrefab(string baseName) return prefabObject; } +#if UNIFIED_NETCODE + + private GameObject CreatePrefab(string directoryPath, GameObject go) + { + if (!Directory.Exists(directoryPath)) + Directory.CreateDirectory(directoryPath); + var assetPath = $"{directoryPath}/{go.name}.prefab"; + if (AssetDatabase.AssetPathExists(assetPath)) + AssetDatabase.DeleteAsset(assetPath); + Assert.IsFalse(AssetDatabase.AssetPathExists(assetPath), $"path already exists for asset {assetPath}"); + var prefab = PrefabUtility.SaveAsPrefabAsset(go, assetPath); + + var networkPrefab = new NetworkPrefab() { Prefab = prefab }; + + var authorityNetworkManager = GetAuthorityNetworkManager(); + var clients = m_ClientNetworkManagers; + // We could refactor this test framework to share a NetworkPrefabList instance, but at this point it's + // probably more trouble than it's worth to verify these lists stay in sync across all tests... + authorityNetworkManager.NetworkConfig.Prefabs.Add(networkPrefab); + authorityNetworkManager.NetworkConfig.Prefabs.Remove(go); + foreach (var clientNetworkManager in clients) + { + if (clientNetworkManager == authorityNetworkManager) + { + continue; + } + clientNetworkManager.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Prefab = prefab }); + clientNetworkManager.NetworkConfig.Prefabs.Remove(go); + } + Object.DestroyImmediate(go); + + return prefab; + } + + protected void SetupGhostAdapterForNetworkObjectPrefab(ref GameObject prefabObject) + { + prefabObject.SetActive(false); + var adapter = prefabObject.AddComponent(); + var bridge = prefabObject.AddComponent(); + var no = prefabObject.GetComponent(); + no.HasGhost = true; + no.GhostAdapter = adapter; + no.HadBridge = true; + no.NetworkObjectBridge = bridge; + + /*prefabObject = CreatePrefab("Assets/Temp", prefabObject);*/ + + GhostPrefabReference.s_IsPostProcessing = true; + adapter.prefabReference = ScriptableObject.CreateInstance(); + adapter.prefabReference.name = "GhostPrefabReference"; + + adapter.prefabReference.Prefab = prefabObject; + adapter.prefabReference.Ghost = adapter; + GhostPrefabReference.s_IsPostProcessing = false; + + //prefabObject.SetActive(true); + UpdateGhostPrefabs(); + } + + void UpdateGhostPrefabs() + { + foreach (var prefabObject in GameObject.FindObjectsByType()) + { + var reference = prefabObject.GetComponent(); + if (!reference || reference.Prefab != prefabObject.gameObject) + { + continue; + } + + foreach (var world in World.All) + { + // check all possible worlds for the prefab that was just created and reenable it there too, since normal prefab creation would think the prefab is inactive + // and automatically set the associated entity disabled too + var link = GhostEntityMapping.LookupEntityReferencePrefab(prefabObject.GetEntityId(), world.Unmanaged); + if (link.WasInitialized) + { + link.World.EntityManager.SetEnabled(link.Entity, true); + // also have to override this in tests, since prefab registration will have had the wrong value during registration + var pendingGameObjectSpawn = + link.World.EntityManager.GetComponentData(link.Entity); + pendingGameObjectSpawn.ShouldBeActive = true; + link.World.EntityManager.SetComponentData(link.Entity, pendingGameObjectSpawn); + } + } + } + } + +#endif + /// /// Overloaded method /// @@ -2223,6 +2316,21 @@ protected GameObject SpawnPlayerObject(GameObject prefabGameObject, NetworkManag internal void SpawnInstanceWithOwnership(NetworkObject networkObjectToSpawn, NetworkManager spawnAuthority, ulong clientId, bool destroyWithScene = false, bool isPlayerObject = false) { + if (networkObjectToSpawn.HasGhost) + { + foreach(var type in networkObjectToSpawn.NetworkObjectBridge.ComponentTypes) + { + if (type.GetManagedType().Name == + $"{nameof(NetworkObjectBridge)}_{nameof(NetworkObjectBridge.NetworkObjectId)}_gen") + { + networkObjectToSpawn.NetworkObjectBridge.NetworkObjectId.Initialize( + networkObjectToSpawn.GhostAdapter.World, networkObjectToSpawn.GhostAdapter.Entity, type, + false); + } + + break; + } + } if (spawnAuthority.NetworkConfig.NetworkTopology == NetworkTopologyTypes.DistributedAuthority) { networkObjectToSpawn.NetworkManagerOwner = spawnAuthority; // Required to assure the client does the spawning @@ -2294,7 +2402,9 @@ protected void SpawnObjectInstance(NetworkObject networkObjectToSpawn, NetworkMa private GameObject SpawnObject(NetworkObject prefabNetworkObject, NetworkManager owner, bool destroyWithScene = false, bool isPlayerObject = false) { Assert.IsTrue(prefabNetworkObject.GlobalObjectIdHash > 0, $"{nameof(GameObject)} {prefabNetworkObject.name} has a {nameof(NetworkObject.GlobalObjectIdHash)} value of 0! Make sure to make it a valid prefab before trying to spawn!"); + NetCode.Netcode.Instance.m_ActiveWorld = owner.NetcodeWorld; var newInstance = Object.Instantiate(prefabNetworkObject.gameObject); + newInstance.SetActive(true); var networkObjectToSpawn = newInstance.GetComponent(); SpawnObjectInstance(networkObjectToSpawn, owner, destroyWithScene, isPlayerObject); return newInstance; @@ -2343,6 +2453,9 @@ public NetcodeIntegrationTest() { var topologyType = OnGetNetworkTopologyType(); InitializeTestConfiguration(topologyType, null); +#if UNIFIED_NETCODE + UnifiedBootStrap.OnInitialized += UpdateGhostPrefabs; +#endif } /// diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef index fa718f8b04..86b6bae95f 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Unity.Netcode.Runtime.Tests.asmdef @@ -13,7 +13,9 @@ "Unity.Netcode.TestHelpers.Runtime", "Unity.Mathematics", "UnityEngine.TestRunner", - "UnityEditor.TestRunner" + "UnityEditor.TestRunner", + "Unity.NetCode", + "Unity.Entities" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/testproject/Assets/NetCodeConfig.asset b/testproject/Assets/NetCodeConfig.asset new file mode 100644 index 0000000000..b0d1add6cc --- /dev/null +++ b/testproject/Assets/NetCodeConfig.asset @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: abd30ee0214cf6a45b2d76765a4615b1, type: 3} + m_Name: NetCodeConfig + m_EditorClassIdentifier: Unity.NetCode::Unity.NetCode.NetCodeConfig + IsGlobalConfig: 1 + EnableClientServerBootstrap: 0 + HostWorldModeSelection: 1 + ClientServerTickRate: + SimulationTickRate: 60 + PredictedFixedStepSimulationTickRatio: 1 + NetworkTickRate: 0 + MaxSimulationStepsPerFrame: 1 + MaxSimulationStepBatchSize: 4 + TargetFrameRateMode: 0 + m_SendSnapshotsForCatchUpTicks: 0 + SnapshotAckMaskCapacity: 4096 + m_ClampPartialTicksThreshold: 5 + HandshakeApprovalTimeoutMS: 5000 + ClientTickRate: + InterpolationTimeNetTicks: 2 + InterpolationTimeMS: 0 + MaxExtrapolationTimeSimTicks: 20 + ForcedInputLatencyTicks: 0 + MaxPredictAheadTimeMS: 500 + NumAdditionalClientPredictedGhostLifetimeTicks: 0 + DefaultClassificationAllowableTickPeriod: 5 + TargetCommandSlack: 2 + NumAdditionalCommandsToSend: 2 + MaxPredictionStepBatchSizeRepeatedTick: 0 + MaxPredictionStepBatchSizeFirstTimeTick: 0 + PredictionLoopUpdateMode: 0 + InterpolationDelayJitterScale: 1.25 + InterpolationDelayMaxDeltaTicksFraction: 0.1 + InterpolationDelayCorrectionFraction: 0.1 + InterpolationTimeScaleMin: 0.85 + InterpolationTimeScaleMax: 1.1 + CommandAgeCorrectionFraction: 0.1 + PredictionTimeScaleMin: 0.9 + PredictionTimeScaleMax: 1.1 + GhostSendSystemData: + DefaultSnapshotPacketSize: 0 + PercentReservedForDespawnMessages: 0.33 + MinSendImportance: 0 + MinDistanceScaledSendImportance: 0 + MaxIterateChunks: 0 + MaxSendChunks: 0 + MaxSendEntities: 0 + m_ForceSingleBaseline: 0 + m_ForcePreSerialize: 0 + m_KeepSnapshotHistoryOnStructuralChange: 1 + m_EnablePerComponentProfiling: 0 + CleanupConnectionStatePerTick: 1 + m_FirstSendImportanceMultiplier: 1 + m_IrrelevantImportanceDownScale: 1 + m_TempStreamSize: 8192 + m_UseCustomSerializer: 0 + ConnectTimeoutMS: 1000 + MaxConnectAttempts: 60 + DisconnectTimeoutMS: 30000 + HeartbeatTimeoutMS: 500 + ReconnectionTimeoutMS: 2000 + ClientSendQueueCapacity: 64 + ClientReceiveQueueCapacity: 64 + ServerSendQueueCapacity: 512 + ServerReceiveQueueCapacity: 512 + MaxMessageSize: 1400 diff --git a/testproject/Assets/NetCodeConfig.asset.meta b/testproject/Assets/NetCodeConfig.asset.meta new file mode 100644 index 0000000000..222ccfadf4 --- /dev/null +++ b/testproject/Assets/NetCodeConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c547acbddd81d32a0ba5e62ddfc4f4e3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index f7832aaad0..e64bb3bdad 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,23 +1,25 @@ { "disableProjectUpdate": false, "dependencies": { - "com.unity.addressables": "2.7.4", - "com.unity.ai.navigation": "2.0.9", - "com.unity.collab-proxy": "2.10.1", - "com.unity.ide.rider": "3.0.38", - "com.unity.ide.visualstudio": "2.0.25", - "com.unity.mathematics": "1.3.3", - "com.unity.multiplayer.tools": "2.2.6", + "com.unity.addressables": "2.9.1", + "com.unity.ai.navigation": "2.0.12", + "com.unity.collab-proxy": "2.12.4", + "com.unity.entities": "6.5.0", + "com.unity.ide.rider": "3.0.40", + "com.unity.ide.visualstudio": "2.0.26", + "com.unity.mathematics": "1.4.0", + "com.unity.multiplayer.tools": "2.2.8", + "com.unity.netcode": "6.6.0", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.package-validation-suite": "0.49.0-preview", - "com.unity.services.authentication": "3.5.2", - "com.unity.services.multiplayer": "1.2.0", - "com.unity.test-framework": "1.6.0", - "com.unity.test-framework.performance": "3.2.0", - "com.unity.timeline": "1.8.9", - "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.11", - "com.unity.ugui": "2.0.0", + "com.unity.services.authentication": "3.6.1", + "com.unity.services.multiplayer": "2.1.3", + "com.unity.test-framework": "1.8.0", + "com.unity.test-framework.performance": "3.4.0", + "com.unity.timeline": "1.8.12", + "com.unity.ugui": "2.6.0", "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -31,10 +33,12 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.timelinefoundation": "1.0.0", "com.unity.modules.ui": "1.0.0", "com.unity.modules.uielements": "1.0.0", "com.unity.modules.umbra": "1.0.0", @@ -44,9 +48,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" }, diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 675de94bf2..00988aa549 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,7 +1,7 @@ { "dependencies": { "com.unity.addressables": { - "version": "2.7.4", + "version": "2.9.1", "depth": 0, "source": "registry", "dependencies": { @@ -11,13 +11,13 @@ "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.scriptablebuildpipeline": "2.4.3", + "com.unity.scriptablebuildpipeline": "2.6.1", "com.unity.modules.unitywebrequestassetbundle": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.ai.navigation": { - "version": "2.0.9", + "version": "2.0.12", "depth": 0, "source": "registry", "dependencies": { @@ -26,7 +26,7 @@ "url": "https://packages.unity.com" }, "com.unity.burst": { - "version": "1.8.25", + "version": "1.8.29", "depth": 1, "source": "registry", "dependencies": { @@ -36,33 +36,52 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "2.10.1", + "version": "2.12.4", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "2.6.2", + "version": "6.5.0", "depth": 1, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.burst": "1.8.23", - "com.unity.mathematics": "1.3.2", + "com.unity.burst": "1.8.25", + "com.unity.nuget.mono-cecil": "1.11.6", "com.unity.test-framework": "1.4.6", - "com.unity.nuget.mono-cecil": "1.11.5", - "com.unity.test-framework.performance": "3.0.3" - }, - "url": "https://packages.unity.com" + "com.unity.test-framework.performance": "3.2.0" + } + }, + "com.unity.entities": { + "version": "6.5.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.burst": "1.8.25", + "com.unity.collections": "6.5.0", + "com.unity.nuget.mono-cecil": "1.11.6", + "com.unity.profiling.core": "1.0.3", + "com.unity.scriptablebuildpipeline": "1.23.1", + "com.unity.serialization": "6.5.0", + "com.unity.test-framework.performance": "3.2.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.hierarchy": "1.0.0" + } }, "com.unity.ext.nunit": { - "version": "2.0.5", + "version": "2.1.0", "depth": 1, "source": "builtin", "dependencies": {} }, "com.unity.ide.rider": { - "version": "3.0.38", + "version": "3.0.40", "depth": 0, "source": "registry", "dependencies": { @@ -71,23 +90,22 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.25", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.31" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, "com.unity.mathematics": { - "version": "1.3.3", + "version": "1.4.0", "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.multiplayer.tools": { - "version": "2.2.6", + "version": "2.2.8", "depth": 0, "source": "registry", "dependencies": { @@ -101,6 +119,16 @@ }, "url": "https://packages.unity.com" }, + "com.unity.netcode": { + "version": "6.6.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.transport": "6.5.0", + "com.unity.entities": "6.5.0", + "com.unity.modules.animation": "1.0.0" + } + }, "com.unity.netcode.gameobjects": { "version": "file:../../com.unity.netcode.gameobjects", "depth": 0, @@ -111,14 +139,14 @@ } }, "com.unity.nuget.mono-cecil": { - "version": "1.11.5", + "version": "1.11.6", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.nuget.newtonsoft-json": { - "version": "3.2.1", + "version": "3.2.2", "depth": 1, "source": "registry", "dependencies": {}, @@ -134,14 +162,14 @@ "url": "https://packages.unity.com" }, "com.unity.profiling.core": { - "version": "1.0.2", + "version": "1.0.3", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.scriptablebuildpipeline": { - "version": "2.4.3", + "version": "2.6.1", "depth": 1, "source": "registry", "dependencies": { @@ -150,8 +178,17 @@ }, "url": "https://packages.unity.com" }, + "com.unity.serialization": { + "version": "6.5.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.collections": "2.1.2", + "com.unity.burst": "1.7.2" + } + }, "com.unity.services.authentication": { - "version": "3.5.2", + "version": "3.6.1", "depth": 0, "source": "registry", "dependencies": { @@ -163,7 +200,7 @@ "url": "https://packages.unity.com" }, "com.unity.services.core": { - "version": "1.15.1", + "version": "1.16.0", "depth": 1, "source": "registry", "dependencies": { @@ -174,7 +211,7 @@ "url": "https://packages.unity.com" }, "com.unity.services.deployment": { - "version": "1.6.2", + "version": "1.7.2", "depth": 1, "source": "registry", "dependencies": { @@ -184,44 +221,44 @@ "url": "https://packages.unity.com" }, "com.unity.services.deployment.api": { - "version": "1.1.2", + "version": "1.1.3", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.services.multiplayer": { - "version": "1.2.0", + "version": "2.1.3", "depth": 0, "source": "registry", "dependencies": { - "com.unity.transport": "2.5.0", + "com.unity.transport": "2.6.0", "com.unity.collections": "2.2.1", - "com.unity.services.qos": "1.3.0", - "com.unity.services.core": "1.15.1", - "com.unity.services.wire": "1.4.0", - "com.unity.services.deployment": "1.6.2", - "com.unity.nuget.newtonsoft-json": "3.2.1", + "com.unity.services.qos": "1.4.1", + "com.unity.services.core": "1.16.0", + "com.unity.services.wire": "1.4.1", + "com.unity.services.deployment": "1.7.1", + "com.unity.nuget.newtonsoft-json": "3.2.2", "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.services.authentication": "3.5.1" + "com.unity.services.authentication": "3.6.0" }, "url": "https://packages.unity.com" }, "com.unity.services.qos": { - "version": "1.3.0", + "version": "1.4.1", "depth": 1, "source": "registry", "dependencies": { "com.unity.collections": "1.2.4", - "com.unity.services.core": "1.12.4", + "com.unity.services.core": "1.12.5", "com.unity.nuget.newtonsoft-json": "3.0.2", "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.services.authentication": "2.0.0" + "com.unity.services.authentication": "3.5.2" }, "url": "https://packages.unity.com" }, "com.unity.services.wire": { - "version": "1.4.0", + "version": "1.4.2", "depth": 1, "source": "registry", "dependencies": { @@ -231,34 +268,18 @@ }, "url": "https://packages.unity.com" }, - "com.unity.sysroot": { - "version": "2.0.10", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.sysroot.linux-x86_64": { - "version": "2.0.9", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.sysroot": "2.0.10" - }, - "url": "https://packages.unity.com" - }, "com.unity.test-framework": { - "version": "1.6.0", + "version": "1.8.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "2.0.3", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" } }, "com.unity.test-framework.performance": { - "version": "3.2.0", + "version": "3.4.0", "depth": 0, "source": "registry", "dependencies": { @@ -268,7 +289,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.8.9", + "version": "1.8.12", "depth": 0, "source": "registry", "dependencies": { @@ -279,34 +300,26 @@ }, "url": "https://packages.unity.com" }, - "com.unity.toolchain.win-x86_64-linux-x86_64": { - "version": "2.0.11", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.sysroot": "2.0.10", - "com.unity.sysroot.linux-x86_64": "2.0.9" - }, - "url": "https://packages.unity.com" - }, "com.unity.transport": { - "version": "2.6.0", + "version": "6.5.0", "depth": 1, - "source": "registry", + "source": "builtin", "dependencies": { + "com.unity.collections": "6.5.0", "com.unity.burst": "1.8.24", - "com.unity.collections": "2.2.1", - "com.unity.mathematics": "1.3.2" - }, - "url": "https://packages.unity.com" + "com.unity.mathematics": "1.4.0" + } }, "com.unity.ugui": { - "version": "2.0.0", + "version": "2.6.0", "depth": 0, "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" } }, "com.unity.modules.accessibility": { @@ -315,6 +328,14 @@ "source": "builtin", "dependencies": {} }, + "com.unity.modules.adaptiveperformance": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.subsystems": "1.0.0" + } + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, @@ -325,7 +346,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -362,6 +385,16 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchy": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, "com.unity.modules.hierarchycore": { "version": "1.0.0", "depth": 1, @@ -399,6 +432,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -443,6 +484,14 @@ "com.unity.modules.physics2d": "1.0.0" } }, + "com.unity.modules.timelinefoundation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, "com.unity.modules.ui": { "version": "1.0.0", "depth": 0, @@ -458,7 +507,8 @@ "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.hierarchycore": "1.0.0", - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -522,32 +572,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/testproject/ProjectSettings/PackageManagerSettings.asset b/testproject/ProjectSettings/PackageManagerSettings.asset index b01b2f8da9..6e57db2799 100644 --- a/testproject/ProjectSettings/PackageManagerSettings.asset +++ b/testproject/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 1 - m_EnablePackageDependencies: 1 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 1 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105584918791443 + m_OriginalEntityId: + m_rawData: 568105584918791444 + m_LoadAssets: 0 diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset index 3bb16ba357..06561ea008 100644 --- a/testproject/ProjectSettings/ProjectSettings.asset +++ b/testproject/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 28 + serializedVersion: 30 productGUID: bba99b16607b94720b7d04f7f1a82989 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1280 defaultScreenHeight: 720 defaultScreenWidthWeb: 960 @@ -66,10 +65,15 @@ PlayerSettings: useOSAutorotation: 1 use32BitDisplayBuffer: 1 preserveFramebufferAlpha: 0 + adjustIOSFPSUsingThermalState: 1 + thermalStateSeriousIOSFPS: 30 + thermalStateCriticalIOSFPS: 15 disableDepthAndStencilBuffers: 0 androidStartInFullscreen: 1 androidRenderOutsideSafeArea: 1 androidUseSwappy: 1 + androidRequestedVisibleInsets: 0 + androidSystemBarsBehavior: 2 androidDisplayOptions: 1 androidBlitType: 0 androidResizeableActivity: 0 @@ -84,6 +88,7 @@ PlayerSettings: defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 1 + callOnDisableOnAssetBundleUnload: 1 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 @@ -114,6 +119,7 @@ PlayerSettings: xboxEnableGuest: 0 xboxEnablePIXSampling: 0 metalFramebufferOnly: 0 + metalUseMetalDisplayLink: 0 xboxOneResolution: 0 xboxOneSResolution: 0 xboxOneXResolution: 3 @@ -147,12 +153,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -174,9 +178,10 @@ PlayerSettings: tvOS: 0 overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 23 + AndroidMinSdkVersion: 26 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 + AndroidPreferredDataLocation: 1 aotOptions: nimt-trampolines=1024 stripEngineCode: 1 iPhoneStrippingLevel: 0 @@ -191,13 +196,14 @@ PlayerSettings: VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 iOSSimulatorArchitecture: 0 - iOSTargetOSVersionString: 13.0 + iOSTargetOSVersionString: 15.0 tvOSSdkVersion: 0 tvOSSimulatorArchitecture: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 13.0 + tvOSTargetOSVersionString: 15.0 VisionOSSdkVersion: 0 VisionOSTargetOSVersionString: 1.0 + xcodeProjectType: 0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -451,12 +457,6 @@ PlayerSettings: - m_BuildTarget: WindowsStandaloneSupport m_APIs: 0200000012000000 m_Automatic: 0 - m_BuildTargetVRSettings: - - m_BuildTarget: Standalone - m_Enabled: 0 - m_Devices: - - Oculus - - OpenVR m_DefaultShaderChunkSizeInMB: 16 m_DefaultShaderChunkCount: 0 openGLRequireES31: 0 @@ -484,7 +484,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: - macOSTargetOSVersion: 11.0 + macOSTargetOSVersion: 12.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -630,6 +630,8 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 + switchCaStoreSource: 0 + switchCaStoreFilePath: ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -739,7 +741,7 @@ PlayerSettings: webWasm2023: 0 webEnableSubmoduleStrippingCompatibility: 0 scriptingDefineSymbols: - Standalone: UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT + Standalone: UNITY_NETCODE_NATIVE_COLLECTION_SUPPORT;NETCODE_GAMEOBJECT_BRIDGE_EXPERIMENTAL;NETCODE_EXPERIMENTAL_SINGLE_WORLD_HOST;OUT_OF_BAND_RPC additionalCompilerArguments: Standalone: - -warnaserror @@ -747,6 +749,7 @@ PlayerSettings: scriptingBackend: {} il2cppCompilerConfiguration: {} il2cppCodeGeneration: {} + il2cppLTOMode: {} il2cppStacktraceInformation: {} managedStrippingLevel: EmbeddedLinux: 1 @@ -794,8 +797,7 @@ PlayerSettings: metroDefaultTileSize: 1 metroTileForegroundText: 2 metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} - metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, - a: 1} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} metroSplashScreenUseBackgroundColor: 0 syncCapabilities: 0 platformCapabilities: {} @@ -831,7 +833,6 @@ PlayerSettings: XboxOneXTitleMemory: 8 XboxOneOverrideIdentityName: XboxOneOverrideIdentityPublisher: - vrEditorSettings: {} cloudServicesEnabled: Analytics: 0 Build: 0 @@ -862,6 +863,7 @@ PlayerSettings: captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 + enableDirectStorage: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] @@ -877,3 +879,4 @@ PlayerSettings: androidVulkanAllowFilterList: [] androidVulkanDeviceFilterListAsset: {fileID: 0} d3d12DeviceFilterListAsset: {fileID: 0} + allowedHttpConnections: 3 From 0cc6391bbd7ae4741ba161a76b3086014fc58fe9 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Thu, 23 Apr 2026 16:27:35 -0500 Subject: [PATCH 60/99] Removed SetActive calls --- .../TestHelpers/NetcodeIntegrationTest.cs | 72 ------------------- 1 file changed, 72 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index 49194efb71..fd28fda266 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -2197,42 +2197,8 @@ protected GameObject CreateNetworkObjectPrefab(string baseName) } #if UNIFIED_NETCODE - - private GameObject CreatePrefab(string directoryPath, GameObject go) - { - if (!Directory.Exists(directoryPath)) - Directory.CreateDirectory(directoryPath); - var assetPath = $"{directoryPath}/{go.name}.prefab"; - if (AssetDatabase.AssetPathExists(assetPath)) - AssetDatabase.DeleteAsset(assetPath); - Assert.IsFalse(AssetDatabase.AssetPathExists(assetPath), $"path already exists for asset {assetPath}"); - var prefab = PrefabUtility.SaveAsPrefabAsset(go, assetPath); - - var networkPrefab = new NetworkPrefab() { Prefab = prefab }; - - var authorityNetworkManager = GetAuthorityNetworkManager(); - var clients = m_ClientNetworkManagers; - // We could refactor this test framework to share a NetworkPrefabList instance, but at this point it's - // probably more trouble than it's worth to verify these lists stay in sync across all tests... - authorityNetworkManager.NetworkConfig.Prefabs.Add(networkPrefab); - authorityNetworkManager.NetworkConfig.Prefabs.Remove(go); - foreach (var clientNetworkManager in clients) - { - if (clientNetworkManager == authorityNetworkManager) - { - continue; - } - clientNetworkManager.NetworkConfig.Prefabs.Add(new NetworkPrefab() { Prefab = prefab }); - clientNetworkManager.NetworkConfig.Prefabs.Remove(go); - } - Object.DestroyImmediate(go); - - return prefab; - } - protected void SetupGhostAdapterForNetworkObjectPrefab(ref GameObject prefabObject) { - prefabObject.SetActive(false); var adapter = prefabObject.AddComponent(); var bridge = prefabObject.AddComponent(); var no = prefabObject.GetComponent(); @@ -2241,8 +2207,6 @@ protected void SetupGhostAdapterForNetworkObjectPrefab(ref GameObject prefabObje no.HadBridge = true; no.NetworkObjectBridge = bridge; - /*prefabObject = CreatePrefab("Assets/Temp", prefabObject);*/ - GhostPrefabReference.s_IsPostProcessing = true; adapter.prefabReference = ScriptableObject.CreateInstance(); adapter.prefabReference.name = "GhostPrefabReference"; @@ -2250,39 +2214,7 @@ protected void SetupGhostAdapterForNetworkObjectPrefab(ref GameObject prefabObje adapter.prefabReference.Prefab = prefabObject; adapter.prefabReference.Ghost = adapter; GhostPrefabReference.s_IsPostProcessing = false; - - //prefabObject.SetActive(true); - UpdateGhostPrefabs(); - } - - void UpdateGhostPrefabs() - { - foreach (var prefabObject in GameObject.FindObjectsByType()) - { - var reference = prefabObject.GetComponent(); - if (!reference || reference.Prefab != prefabObject.gameObject) - { - continue; - } - - foreach (var world in World.All) - { - // check all possible worlds for the prefab that was just created and reenable it there too, since normal prefab creation would think the prefab is inactive - // and automatically set the associated entity disabled too - var link = GhostEntityMapping.LookupEntityReferencePrefab(prefabObject.GetEntityId(), world.Unmanaged); - if (link.WasInitialized) - { - link.World.EntityManager.SetEnabled(link.Entity, true); - // also have to override this in tests, since prefab registration will have had the wrong value during registration - var pendingGameObjectSpawn = - link.World.EntityManager.GetComponentData(link.Entity); - pendingGameObjectSpawn.ShouldBeActive = true; - link.World.EntityManager.SetComponentData(link.Entity, pendingGameObjectSpawn); - } - } - } } - #endif /// @@ -2404,7 +2336,6 @@ private GameObject SpawnObject(NetworkObject prefabNetworkObject, NetworkManager Assert.IsTrue(prefabNetworkObject.GlobalObjectIdHash > 0, $"{nameof(GameObject)} {prefabNetworkObject.name} has a {nameof(NetworkObject.GlobalObjectIdHash)} value of 0! Make sure to make it a valid prefab before trying to spawn!"); NetCode.Netcode.Instance.m_ActiveWorld = owner.NetcodeWorld; var newInstance = Object.Instantiate(prefabNetworkObject.gameObject); - newInstance.SetActive(true); var networkObjectToSpawn = newInstance.GetComponent(); SpawnObjectInstance(networkObjectToSpawn, owner, destroyWithScene, isPlayerObject); return newInstance; @@ -2453,9 +2384,6 @@ public NetcodeIntegrationTest() { var topologyType = OnGetNetworkTopologyType(); InitializeTestConfiguration(topologyType, null); -#if UNIFIED_NETCODE - UnifiedBootStrap.OnInitialized += UpdateGhostPrefabs; -#endif } /// From 4308345b2db7209f5c5c3af54c37c897aaa8bab5 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sat, 25 Apr 2026 15:05:57 -0500 Subject: [PATCH 61/99] update Some potential fixes (etc) for hybrid spawn integration testing. --- .../Components/Helpers/NetworkObjectBridge.cs | 22 ++-- .../Connection/NetworkConnectionManager.cs | 3 - .../Runtime/Core/NetworkObject.cs | 33 ++++-- .../Messaging/Messages/CreateObjectMessage.cs | 2 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 10 ++ .../Unified/UnifiedNetcodeTransport.cs | 23 +++- .../UnifiedNetworkTransformTest.cs | 97 ++++++++++----- .../TestHelpers/NetcodeIntegrationTest.cs | 111 +++++++++++++----- 8 files changed, 217 insertions(+), 84 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 189aba00fd..8cb0f48a8f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -48,10 +48,10 @@ private void OnValidate() /// N4E-spawned hybrid prefab instances. /// internal GhostField NetworkObjectId = new GhostField(); - - public void SetNetworkObjectId(ulong value) + public void SetNetworkObjectId(ulong networkObjectId) { - NetworkObjectId.Value = value; + NetworkObjectId.PresetValue(networkObjectId); + NetworkObjectId.Value = networkObjectId; } } #endif @@ -70,7 +70,7 @@ internal class UnifiedBootStrap : ClientServerBootstrap public static World LastCreatedWorld { get; private set; } - private static int WorldCounter = 0; + private static int s_WorldCounter = 0; public override bool Initialize(string defaultWorldName) { @@ -83,26 +83,28 @@ public override bool Initialize(string defaultWorldName) AutoConnectPort = Port; if (base.Initialize(defaultWorldName)) { - UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); + Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); return true; } if (networkManager != null) { Debug.Log($"Starting a world for {(networkManager.IsServer ? "Host" : "Client")}"); - LastCreatedWorld = networkManager.IsServer - ? CreateSingleWorldHost($"ClientAndServerWorld {WorldCounter++}") - : CreateClientWorld($"ClientWorld {WorldCounter++}"); + s_WorldCounter++; + LastCreatedWorld = networkManager.IsServer ? CreateSingleWorldHost($"HostSingleWorld-{s_WorldCounter}") + : CreateClientWorld($"ClientWorld-{s_WorldCounter}"); if (LastCreatedWorld == null) { - UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); + s_WorldCounter--; + Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); return false; } if (!LastCreatedWorld.IsCreated) { - UnityEngine.Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); + s_WorldCounter--; + Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); return false; } diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs index eefb1e51da..058fb6a38b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs @@ -6,9 +6,6 @@ using System.Runtime.CompilerServices; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; -#if UNIFIED_NETCODE -using Unity.Netcode.Unified; -#endif using Unity.Profiling; using UnityEngine; using Debug = UnityEngine.Debug; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 803284ac45..53faae062f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -3852,9 +3852,13 @@ private void OnEnable() private void OnDisable() { Debug.Log("Disabled!"); - if (IsSpawned) + if (IsSpawned || HasGhost) { - enabled = true; + if (HasGhost && GhostAdapter.IsPrefab()) + { + return; + } + gameObject.SetActive(true); } try @@ -3870,13 +3874,6 @@ private void OnDisable() private void Start() { - // TODO-UNIFIED: Remove once the prefab registration is in place. - if (!enabled) - { - Debug.LogWarning($"[{nameof(NetworkObject)}][{name}] Was not enabled on start! Enabling."); - enabled = true; - } - InitGhost(); } [SerializeField] @@ -3892,7 +3889,7 @@ private void InitGhost() { Debug.Log($"[{nameof(NetworkObject)}] GhostBridge {name} detected and instantiated."); } - if (NetworkObjectBridge.NetworkObjectId.Value != 0) + if (GhostAdapter.WasInitialized && NetworkObjectBridge.NetworkObjectId.Value != 0) { RegisterGhostBridge(); } @@ -3904,9 +3901,23 @@ internal void RegisterGhostBridge() if (NetworkManager.LogLevel == LogLevel.Developer) { Debug.Log($"[{nameof(NetworkObject)}][{nameof(NetworkObjectId)}] NetworkObjectBridge notified instance exists with assigned ID of: {NetworkObjectBridge.NetworkObjectId.Value}"); + if (!NetworkManager.IsListening) + { + Debug.LogWarning($"[{nameof(NetworkObject)}] Did not register because there is no session in progress!"); + return; + } } - if (!NetworkManager.IsServer) + // Set when running through integration tests in order to initially bypass the + // normal registration. This is because at this point in the instantiation process, + // NetworkObject's NetworkManager is pointing to the singleton which means all instances + // (even if intended to be for a specific client) will end up registering with whichever + // NetworkManager instance is being pointed to by the singleton. + if (NetworkSpawnManager.RegisterPendingGhost != null) + { + NetworkSpawnManager.RegisterPendingGhost(this, NetworkObjectBridge.NetworkObjectId.Value); + } + else if (!NetworkManager.IsServer) { NetworkManager.SpawnManager.RegisterGhostPendingSpawn(this, NetworkObjectBridge.NetworkObjectId.Value); } diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index ac1c07efc0..4812c3680d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -131,7 +131,7 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int { if (networkManager.LogLevel == LogLevel.Developer) { - UnityEngine.Debug.Log($"Deferring {nameof(CreateObjectMessage)} to wait for Ghost."); + UnityEngine.Debug.Log($"[{nameof(NetworkObject)}-{ObjectInfo.NetworkObjectId}] Deferring {nameof(CreateObjectMessage)} to wait for Ghost."); } networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, ObjectInfo.NetworkObjectId, reader, ref context, k_Name); return false; diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index df40f2cdac..dc2a663b34 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -4,6 +4,8 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; +using Unity.Entities; +using Unity.NetCode; using UnityEngine; namespace Unity.Netcode @@ -35,6 +37,13 @@ public class NetworkSpawnManager internal readonly Dictionary GhostsPendingSpawn = new Dictionary(); + // TODO: We might want to make this a mock interfacebut temporary solution to validate + // the need to assure we are registering with the right NetworkManager instance when testing (everything + // will use the singleton during Awake and Start when we need to register). + internal delegate void RegisterPendingGhostDelegateHandler(NetworkObject networkObject, ulong networkObjectId); + + internal static RegisterPendingGhostDelegateHandler RegisterPendingGhost; + internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong networkObjectId) { if (NetworkManager.LogLevel == LogLevel.Developer) @@ -43,6 +52,7 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo } if (GhostsPendingSpawn.TryAdd(networkObjectId, networkObject)) { + // TODO-REVIEW-BELOW: *** This is very likely no longer an issue with the new connection sequence *** // TODO-UNIFIED: We need a better way to preserve any hybrid instances pending NGO spawn. // Edge-Case scenario: During initial client synchronization (i.e. !NetworkManager.IsConnectedClient). // diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index f95c10e721..85393e4759 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -427,8 +427,29 @@ public override void DisconnectRemoteClient(ulong clientId) public override void DisconnectLocalClient() { - m_NetworkManager.NetcodeWorld.RequestDisconnectFromServer(); + // Remove the connection 1st (the world might not be available) m_Connections.Remove((int)ServerClientId); + + // TODO-FIX-REVIEW-ME: + // This was causing errors to occur upon shutdown during an integration test. + // The cases being trapped for below yield no errors, but there might be some + // form of other underlying issue here: + + if (m_NetworkManager.NetcodeWorld == null || !m_NetworkManager.NetcodeWorld.IsCreated) + { + return; + } + + if (m_NetworkManager.IsServer || m_NetworkManager.NetcodeWorld.IsHost()) + { + if (m_NetworkManager.LogLevel <= LogLevel.Developer) + { + Debug.LogWarning("Host is attempting to shutdown the local client which is not required with a single world host."); + } + return; + } + m_NetworkManager.NetcodeWorld.RequestDisconnectFromServer(); + } public override ulong GetCurrentRtt(ulong clientId) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs index fd41c89b00..4325695783 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs @@ -1,12 +1,12 @@ using System.Collections; -using System.Collections.Generic; using NUnit.Framework; -using Unity.NetCode; using Unity.Netcode.Components; using Unity.Netcode.TestHelpers.Runtime; +using Unity.NetCode; using UnityEngine; using UnityEngine.TestTools; + namespace Unity.Netcode.RuntimeTests { /// @@ -14,7 +14,7 @@ namespace Unity.Netcode.RuntimeTests /// by the presence of ghost objects in the base class. This is to help be certain that the network transform /// is not doing the work, but that the work is being done by N4E's snapshots. /// - public class DoNothingNetworkTransform : NetworkTransform + internal class DoNothingNetworkTransform : NetworkTransform { public override void OnNetworkSpawn() { @@ -26,53 +26,93 @@ internal override void InternalInitialization(bool isOwnershipChange = false) // Deliberately left empty } } - - public class UnifiedNetworkTransformTest : IntegrationTestWithApproximation + + internal class UnifiedNetworkTransformTest : IntegrationTestWithApproximation { protected override int NumberOfClients => 2; private GameObject m_Prefab; private NetworkObject m_Instance; - protected override void OnServerAndClientsCreated() + protected override IEnumerator OnSetup() { - m_Prefab = CreateNetworkObjectPrefab("Test prefab"); - SetupGhostAdapterForNetworkObjectPrefab(ref m_Prefab); - + // Creates the hybrid prefab + m_Prefab = CreateHybridPrefab("HybridPrefab", true); m_Prefab.AddComponent(); + NetworkSpawnManager.RegisterPendingGhost = RegisterPendingGhost; + return base.OnSetup(); + } - /*NetCode.Netcode.RunOnServerStarted(() => - { - NetCode.Netcode.RegisterPrefabSingleWorld(m_PlayerPrefab, true); - });*/ + protected override IEnumerator OnTearDown() + { + NetworkSpawnManager.RegisterPendingGhost = null; + m_EnableVerboseDebug = false; + return base.OnTearDown(); } - protected override IEnumerator OnServerAndClientsConnected() + private void RegisterPendingGhost(NetworkObject networkObject, ulong networkObjectId) { - m_Instance = SpawnObject(m_Prefab, m_ServerNetworkManager).GetComponent(); - yield return WaitForConditionOrTimeOut(() => + var ghost = networkObject.GetComponent(); + Assert.IsNotNull(ghost, $"[RegisterPendingGhost][NetworkObject-{networkObjectId}] Has no {nameof(GhostAdapter)}!"); + foreach (var networkManager in m_NetworkManagers) { - foreach (var client in m_ClientNetworkManagers) + // If the world matches, then register the instance with this NetworkManager's spawn manager. + if (networkManager.NetcodeWorld == ghost.World) { - if (!s_GlobalNetworkObjects.ContainsKey(client.LocalClientId) || !s_GlobalNetworkObjects[client.LocalClientId].ContainsKey(m_Instance.NetworkObjectId)) - { - return false; - } + networkManager.SpawnManager.RegisterGhostPendingSpawn(networkObject, networkObjectId); + return; } + } + Debug.LogError($"Did not find a world for NetworkObject-{networkObjectId}!!"); + } + + protected override void OnServerAndClientsCreated() + { - return true; - }); - AssertOnTimeout($"Timed out waiting for objects to spawn!"); - yield return null; + // Add the hybrid prefab to the prefabs list for + // all NetworkManager instances. + // TODO: Emma and I discussed actually not making it + // a requirement to have NetworkManager instances. + // We can get that PR landed and merged back into the + // unified branch so this is no longer needed. + // (We can modify CreateHybridPrefab to use whatever list + // is used to handle this when using the normal prefab creation + // methods). + var networkPrefab = new NetworkPrefab() + { + Prefab = m_Prefab, + }; + foreach (var networkManager in m_NetworkManagers) + { + networkManager.LogLevel = LogLevel.Developer; + networkManager.NetworkConfig.Prefabs.Add(networkPrefab); + // Set the deferred message timeout to be 5 seconds for this test. + // (To see if the messages for the instances ever get processed.) + // Enable this to debug deferred + //networkManager.NetworkConfig.SpawnTimeout = 5; + } } [UnityTest] public IEnumerator BasicMovementTest() { + m_EnableVerboseDebug = true; var authority = GetAuthorityNetworkManager(); + m_Instance = SpawnObject(m_Prefab, m_ServerNetworkManager).GetComponent(); + + // Wait 5 seconds so we will dump any deferred messages if it failed on clients + // when checking to see if it spawned or not on the clients next. + // Enable this to debug deferred + //yield return new WaitForSeconds(5); + + yield return WaitForSpawnedOnAllOrTimeOut(m_Instance); + AssertOnTimeout($"Failed to spawn {m_Instance.name} on all clients!"); + + VerboseDebug("All clients spawned instance!"); + var originalPos = authority.LocalClient.PlayerObject.transform.position; var newPos = originalPos + new Vector3(1, 1, 1); - + m_Instance.transform.position = newPos; foreach (var client in m_ClientNetworkManagers) @@ -81,11 +121,12 @@ public IEnumerator BasicMovementTest() } yield return new WaitForSeconds(1); - + foreach (var client in m_ClientNetworkManagers) { Assert.IsTrue(Approximately(newPos, s_GlobalNetworkObjects[client.LocalClientId][m_Instance.NetworkObjectId].transform.position)); } + VerboseDebug("Test Passed!"); } } -} \ No newline at end of file +} diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index fd28fda266..6cd33dc89a 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1749,6 +1749,19 @@ protected void DestroySceneNetworkObjects() if (CanDestroyNetworkObject(networkObject)) { + // Handle removing the prefab reference and destroying it + // and then destroying the ghostAdapter prior to destroying + // a hybrid prefab. + var ghostAdapter = networkObject.GetComponent(); + if (ghostAdapter != null && ghostAdapter.prefabReference != null) + { + var prefabReference = ghostAdapter.prefabReference; + prefabReference.Prefab = null; + ghostAdapter.prefabReference = null; + Object.Destroy(prefabReference); + Object.Destroy(ghostAdapter); + } + // Destroy the GameObject that holds the NetworkObject component Object.DestroyImmediate(networkObject.gameObject); } @@ -2197,23 +2210,76 @@ protected GameObject CreateNetworkObjectPrefab(string baseName) } #if UNIFIED_NETCODE - protected void SetupGhostAdapterForNetworkObjectPrefab(ref GameObject prefabObject) - { - var adapter = prefabObject.AddComponent(); - var bridge = prefabObject.AddComponent(); - var no = prefabObject.GetComponent(); - no.HasGhost = true; - no.GhostAdapter = adapter; - no.HadBridge = true; - no.NetworkObjectBridge = bridge; - GhostPrefabReference.s_IsPostProcessing = true; - adapter.prefabReference = ScriptableObject.CreateInstance(); - adapter.prefabReference.name = "GhostPrefabReference"; + protected GameObject CreateHybridPrefab(string baseName, bool moveToDDOL = true) + { + // Prevent from trying to register/spawn when creating this hybrid prefab + GhostBehaviour.IsCreatingPrefab = true; + var gameObject = new GameObject + { + name = baseName + }; - adapter.prefabReference.Prefab = prefabObject; - adapter.prefabReference.Ghost = adapter; - GhostPrefabReference.s_IsPostProcessing = false; + // Wrap the rest in case a bug (or the like) is introduced and an exception is thrown + // so we can assure to set IsCreatingPrefab back to false. + try + { + // TODO: We might think if there is a better way to handle this, but GhostBehaviour is dependent + // upon GhostObject having run through its Awake prior to it and NetworkObject needs to access + // the NetowrkObjectId GhostField which depends upon GhostBehaviour. + + // Order of operations in how these execute is actually important. + // GhostObject should execute 1st. + // NetworkObjectBridge 2nd. + // NetworkObject 3rd. + // NetworkBehaviours will execute in the order they are arranged unless otherwise specified. + var adapter = gameObject.AddComponent(); + var bridge = gameObject.AddComponent(); + var no = gameObject.AddComponent(); + + // Ghost specific settings + no.HasGhost = true; + no.GhostAdapter = adapter; + no.HadBridge = true; + no.NetworkObjectBridge = bridge; + + // This gets automatically disabled when NetworkObject is validated. + no.SynchronizeTransform = false; + no.SceneMigrationSynchronization = false; + + // Make sure this is not a scene object + no.IsSceneObject = false; + + // TODO: This might be part of the CreateHybridPrefab parameters + // For now, just use normal interpolation until we get integration + // tests running. + // Once we have validated prediction works and have a working manual + // test, we can circle back to this (possibly make that a sub-task + // with the dependency to prediction manual test). + adapter.SupportedGhostModes = GhostModeMask.Interpolated; + + // Mark the reference as post processing to avoid registering this instance automatically + GhostPrefabReference.s_IsPostProcessing = true; + adapter.prefabReference = ScriptableObject.CreateInstance(); + adapter.prefabReference.name = "GhostPrefabReference"; + adapter.prefabReference.Prefab = gameObject; + adapter.prefabReference.Ghost = adapter; + GhostPrefabReference.s_IsPostProcessing = false; + + // Turn it into a test prefab + NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(no); + if (moveToDDOL) + { + Object.DontDestroyOnLoad(gameObject); + } + } + catch (Exception ex) + { + Debug.LogException(ex); + } + // Always reset + GhostBehaviour.IsCreatingPrefab = false; + return gameObject; } #endif @@ -2248,21 +2314,6 @@ protected GameObject SpawnPlayerObject(GameObject prefabGameObject, NetworkManag internal void SpawnInstanceWithOwnership(NetworkObject networkObjectToSpawn, NetworkManager spawnAuthority, ulong clientId, bool destroyWithScene = false, bool isPlayerObject = false) { - if (networkObjectToSpawn.HasGhost) - { - foreach(var type in networkObjectToSpawn.NetworkObjectBridge.ComponentTypes) - { - if (type.GetManagedType().Name == - $"{nameof(NetworkObjectBridge)}_{nameof(NetworkObjectBridge.NetworkObjectId)}_gen") - { - networkObjectToSpawn.NetworkObjectBridge.NetworkObjectId.Initialize( - networkObjectToSpawn.GhostAdapter.World, networkObjectToSpawn.GhostAdapter.Entity, type, - false); - } - - break; - } - } if (spawnAuthority.NetworkConfig.NetworkTopology == NetworkTopologyTypes.DistributedAuthority) { networkObjectToSpawn.NetworkManagerOwner = spawnAuthority; // Required to assure the client does the spawning From 2916b670f36273938b0344b859b96492fcdee9c4 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Sat, 25 Apr 2026 15:50:56 -0500 Subject: [PATCH 62/99] style removing unused namespace directives. --- .../Runtime/Spawning/NetworkSpawnManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index dc2a663b34..de8bc86192 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -4,8 +4,6 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; -using Unity.Entities; -using Unity.NetCode; using UnityEngine; namespace Unity.Netcode From 59f82086e29ee1e5e59170204445f62f665083ca Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 27 Apr 2026 16:39:19 -0500 Subject: [PATCH 63/99] update Adjustments based on earlier discussion. --- .../TestHelpers/NetcodeIntegrationTest.cs | 116 ++++++++---------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index 6cd33dc89a..0b383cc7c0 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1,17 +1,14 @@ using System; using System.Collections; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using NUnit.Framework; -using Unity.Entities; using Unity.NetCode; using Unity.Netcode.RuntimeTests; using Unity.Netcode.Transports.UTP; -using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestTools; @@ -2210,75 +2207,68 @@ protected GameObject CreateNetworkObjectPrefab(string baseName) } #if UNIFIED_NETCODE - protected GameObject CreateHybridPrefab(string baseName, bool moveToDDOL = true) { // Prevent from trying to register/spawn when creating this hybrid prefab - GhostBehaviour.IsCreatingPrefab = true; var gameObject = new GameObject { name = baseName }; - // Wrap the rest in case a bug (or the like) is introduced and an exception is thrown - // so we can assure to set IsCreatingPrefab back to false. - try - { - // TODO: We might think if there is a better way to handle this, but GhostBehaviour is dependent - // upon GhostObject having run through its Awake prior to it and NetworkObject needs to access - // the NetowrkObjectId GhostField which depends upon GhostBehaviour. - - // Order of operations in how these execute is actually important. - // GhostObject should execute 1st. - // NetworkObjectBridge 2nd. - // NetworkObject 3rd. - // NetworkBehaviours will execute in the order they are arranged unless otherwise specified. - var adapter = gameObject.AddComponent(); - var bridge = gameObject.AddComponent(); - var no = gameObject.AddComponent(); - - // Ghost specific settings - no.HasGhost = true; - no.GhostAdapter = adapter; - no.HadBridge = true; - no.NetworkObjectBridge = bridge; - - // This gets automatically disabled when NetworkObject is validated. - no.SynchronizeTransform = false; - no.SceneMigrationSynchronization = false; - - // Make sure this is not a scene object - no.IsSceneObject = false; - - // TODO: This might be part of the CreateHybridPrefab parameters - // For now, just use normal interpolation until we get integration - // tests running. - // Once we have validated prediction works and have a working manual - // test, we can circle back to this (possibly make that a sub-task - // with the dependency to prediction manual test). - adapter.SupportedGhostModes = GhostModeMask.Interpolated; - - // Mark the reference as post processing to avoid registering this instance automatically - GhostPrefabReference.s_IsPostProcessing = true; - adapter.prefabReference = ScriptableObject.CreateInstance(); - adapter.prefabReference.name = "GhostPrefabReference"; - adapter.prefabReference.Prefab = gameObject; - adapter.prefabReference.Ghost = adapter; - GhostPrefabReference.s_IsPostProcessing = false; - - // Turn it into a test prefab - NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(no); - if (moveToDDOL) - { - Object.DontDestroyOnLoad(gameObject); - } - } - catch (Exception ex) - { - Debug.LogException(ex); + // Order of operations in how these execute is actually important. + // GhostObject should execute 1st. + // NetworkObjectBridge 2nd. + // NetworkObject 3rd. + // NetworkBehaviours will execute in the order they are arranged unless otherwise specified. + + // When adding a Hybrid/Ghost prefab: + // - We disabled the GameObject prior to adding the GhostPrefabReference (so IsPrefab() == true). + // - Add the GhostAdapter and GhostPrefabReference + // - Then set it back to active. + gameObject.SetActive(false); + var adapter = gameObject.AddComponent(); + // Mark the reference as post processing to avoid registering this instance automatically. + GhostPrefabReference.s_IsPostProcessing = true; + adapter.prefabReference = ScriptableObject.CreateInstance(); + adapter.prefabReference.name = "GhostPrefabReference"; + adapter.prefabReference.Prefab = gameObject; + adapter.prefabReference.Ghost = adapter; + GhostPrefabReference.s_IsPostProcessing = false; + + // TODO: This might be part of the CreateHybridPrefab parameters + // For now, just use normal interpolation until we get integration + // tests running. + // Once we have validated prediction works and have a working manual + // test, we can circle back to this (possibly make that a sub-task + // with the dependency to prediction manual test). + adapter.SupportedGhostModes = GhostModeMask.Interpolated; + + // Once done with setting up the GhostAdapter, we can set it back to active in the hierarchy + gameObject.SetActive(true); + + // GhostBehaviours that are part of a prefab will not invoke Ghost.InternalAcquireEntityReference + // Add the bridge + var bridge = gameObject.AddComponent(); + + // Now add NGO components + var no = gameObject.AddComponent(); + + // NetworkObject Ghost specific settings + no.HasGhost = true; + no.GhostAdapter = adapter; + no.HadBridge = true; + no.NetworkObjectBridge = bridge; + + // Disable transform synchronization for NetworkObject serialization + // since that is handled by the GhostAdapter. + no.SynchronizeTransform = false; + + // Turn it into a test prefab + NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(no); + if (moveToDDOL) + { + Object.DontDestroyOnLoad(gameObject); } - // Always reset - GhostBehaviour.IsCreatingPrefab = false; return gameObject; } #endif From 453c8e2551234baa6d06f84f9226056e12740f0a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 10:36:38 -0500 Subject: [PATCH 64/99] update Resolving merge issues. --- .../NetcodeForGameObjectsProjectSettings.cs | 2 +- .../Configuration/NetcodeSettingsProvider.cs | 1 - .../Configuration/NetworkPrefabProcessor.cs | 1 - .../Runtime/Core/NetworkBehaviourUpdater.cs | 2 +- .../Runtime/Core/NetworkObject.cs | 32 +++++++++---------- .../Runtime/Spawning/NetworkSpawnManager.cs | 26 +++++++-------- .../Runtime/Timing/AnticipationSystem.cs | 2 +- .../Editor/NetworkPrefabProcessorTests.cs | 1 - 8 files changed, 30 insertions(+), 37 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs index 48ddd77fde..05f83876bd 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeForGameObjectsProjectSettings.cs @@ -1,7 +1,7 @@ using UnityEditor; using UnityEngine; -namespace Unity.Netcode.Editor.Configuration +namespace Unity.Netcode.GameObjects.Editor.Configuration { /// /// A of type . diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs index 826a5d58de..a8b521117c 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetcodeSettingsProvider.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.IO; -using Unity.Netcode.Editor.Configuration; using UnityEditor; using UnityEngine; using Directory = UnityEngine.Windows.Directory; diff --git a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs index 99f6b33c4b..cab11b3be1 100644 --- a/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs +++ b/com.unity.netcode.gameobjects/Editor/Configuration/NetworkPrefabProcessor.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using Unity.Netcode.Editor.Configuration; using UnityEditor; using UnityEngine; diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs index 37e5aed76b..4f12bca033 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviourUpdater.cs @@ -115,7 +115,7 @@ internal void ResetDirtyObject(NetworkObject dirtyObj, bool forceSend) { foreach (var behaviour in dirtyObj.ChildNetworkBehaviours.Values) { - behaviour.Value.PostNetworkVariableWrite(forceSend); + behaviour.PostNetworkVariableWrite(forceSend); } } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 2379b9c6cc..9c96f443a9 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -2087,7 +2087,7 @@ public void Despawn(bool destroy = true) foreach (var behavior in ChildNetworkBehaviours.Values) { - behavior.Value.MarkVariablesDirty(false); + behavior.MarkVariablesDirty(false); } NetworkManagerOwner.SpawnManager.DespawnObject(this, destroy); } @@ -2216,7 +2216,7 @@ internal void InvokeSessionOwnerPromoted(bool isSessionOwner) foreach (var childBehaviour in ChildNetworkBehaviours.Values) { - childBehaviour.Value.IsSessionOwner = isSessionOwner; + childBehaviour.IsSessionOwner = isSessionOwner; } } @@ -2228,7 +2228,6 @@ internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNe } foreach (var child in ChildNetworkBehaviours.Values) { - var behaviour = childBehaviour.Value; // Any NetworkBehaviour that is not spawned and the associated GameObject is disabled should be // skipped over (i.e. not supported). if (!child.IsSpawned && !child.gameObject.activeInHierarchy) @@ -2712,22 +2711,21 @@ internal void InvokeBehaviourNetworkSpawn() // - invocation of RPCs will work properly (and not throw exception under certain scenarios) foreach (var childBehaviour in ChildNetworkBehaviours.Values) { - if (!childBehaviour.Value.gameObject.activeInHierarchy) + if (!childBehaviour.gameObject.activeInHierarchy) { if (NetworkManagerOwner.LogLevel <= LogLevel.Developer) { - NetworkLog.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour.Value)}"); + NetworkLog.LogWarning($"{GenerateDisabledNetworkBehaviourWarning(childBehaviour)}"); } continue; } - childBehaviour.Value.InternalOnNetworkSpawn(); + childBehaviour.InternalOnNetworkSpawn(); } - // After initialization, we can then invoke OnNetworkSpawn on each child NetworkBehaviour. + // After internally spawning, we can then invoke OnNetworkSpawn on each child NetworkBehaviour. foreach (var childBehaviour in ChildNetworkBehaviours.Values) { - var behaviour = childBehaviour.Value; - if (!behaviour.gameObject.activeInHierarchy) + if (!childBehaviour.gameObject.activeInHierarchy) { if (NetworkManager.LogLevel <= LogLevel.Normal) { @@ -2735,7 +2733,7 @@ internal void InvokeBehaviourNetworkSpawn() } continue; } - behaviour.NetworkSpawn(); + childBehaviour.NetworkSpawn(); } } @@ -2870,7 +2868,7 @@ internal bool InitializeChildNetworkBehaviours() { for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) { - m_ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); + ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); Destroy(NetworkRigidbodies[i]); } NetworkRigidbodies.Clear(); @@ -2882,7 +2880,7 @@ internal bool InitializeChildNetworkBehaviours() { for (int i = NetworkTransforms.Count - 1; i >= 0; i--) { - m_ChildNetworkBehaviours.Remove(NetworkTransforms[i].NetworkBehaviourId); + ChildNetworkBehaviours.Remove(NetworkTransforms[i].NetworkBehaviourId); Destroy(NetworkTransforms[i]); } NetworkTransforms.Clear(); @@ -2892,7 +2890,7 @@ internal bool InitializeChildNetworkBehaviours() return true; } - #if UNIFIED_NETCODE +#if UNIFIED_NETCODE private void InitializeComponentMarkers(NetworkManager networkManager) { // TODO: Determine if this would be useful @@ -2945,7 +2943,7 @@ private void InitializeComponentMarkers(NetworkManager networkManager) { for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) { - m_ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); + ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); Destroy(NetworkRigidbodies[i]); } NetworkRigidbodies.Clear(); @@ -3476,7 +3474,7 @@ internal void SynchronizeNetworkBehaviours(ref BufferSerializer serializer var synchronizationCount = (byte)0; foreach (var childBehaviour in ChildNetworkBehaviours.Values) { - if (childBehaviour.Value.Synchronize(ref serializer, targetClientId)) + if (childBehaviour.Synchronize(ref serializer, targetClientId)) { synchronizationCount++; } @@ -3497,8 +3495,8 @@ internal void SynchronizeNetworkBehaviours(ref BufferSerializer serializer // Apply the network variable synchronization data foreach (var behaviour in ChildNetworkBehaviours.Values) { - behaviour.Value.InitializeVariables(); - behaviour.Value.SetNetworkVariableData(reader, targetClientId); + behaviour.InitializeVariables(); + behaviour.SetNetworkVariableData(reader, targetClientId); } // Read the number of NetworkBehaviours to synchronize diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index e487ba7318..e8f0ccf8cb 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -73,7 +73,7 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo // them into the currently active scene upon spawn. if (!NetworkManager.IsConnectedClient && !GhostsPendingSynchronization.ContainsKey(networkObjectId)) { - UnityEngine.Object.DontDestroyOnLoad(networkObject.gameObject); + Object.DontDestroyOnLoad(networkObject.gameObject); } else // There is matching spawn data for this pending Ghost, process the pending spawn for this hybrid instance. { @@ -98,7 +98,7 @@ internal NetworkObject GetGhostNetworkObjectForSpawn(ulong networkObjectId) return null; } var networkObject = GhostsPendingSpawn[networkObjectId]; - + GhostsPendingSpawn.Remove(networkObjectId); if (networkObject != null) { @@ -1138,17 +1138,14 @@ internal NetworkObject CreateLocalNetworkObject(NetworkObject.SerializedObject s networkObject = GetGhostNetworkObjectForSpawn(serializedObject.NetworkObjectId); if (networkObject == null) { - if (NetworkLog.CurrentLogLevel <= LogLevel.Error) - { - NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {globalObjectIdHash}!"); - } - - return null; + throw new Exception($"Failed to get spawned Ghost object!"); } - - // Since this NetworkObject is an in-scene placed NetworkObject, if it is disabled then enable it so - // NetworkBehaviours will have their OnNetworkSpawn method invoked - if (!networkObject.gameObject.activeInHierarchy) + } + else +#endif + { + // If scene management is disabled or the NetworkObject was dynamically spawned + if (!NetworkManager.NetworkConfig.EnableSceneManagement || !serializedObject.IsSceneObject) { networkObject = GetNetworkObjectToSpawn(serializedObject.Hash, serializedObject.OwnerClientId, position, rotation, serializedObject.IsSceneObject, instantiationData); } @@ -1161,17 +1158,18 @@ internal NetworkObject CreateLocalNetworkObject(NetworkObject.SerializedObject s { NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {globalObjectIdHash}!"); } + + return null; } // Since this NetworkObject is an in-scene placed NetworkObject, if it is disabled then enable it so // NetworkBehaviours will have their OnNetworkSpawn method invoked - if (networkObject != null && !networkObject.gameObject.activeInHierarchy) + if (!networkObject.gameObject.activeInHierarchy) { networkObject.gameObject.SetActive(true); } } } - if (networkObject == null) { return null; diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs b/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs index 04dc700f92..abf0dbd60a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs +++ b/com.unity.netcode.gameobjects/Runtime/Timing/AnticipationSystem.cs @@ -69,7 +69,7 @@ public void ProcessReanticipation() { foreach (var behaviour in item.OwnerObject.ChildNetworkBehaviours.Values) { - behaviour.Value.OnReanticipate(lastRoundTripTime); + behaviour.OnReanticipate(lastRoundTripTime); } item.ResetAnticipation(); } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs index 6d6bf1d6cf..0cd1ae134f 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkPrefabProcessorTests.cs @@ -1,5 +1,4 @@ using NUnit.Framework; -using Unity.Netcode.Editor.Configuration; using Unity.Netcode.GameObjects.Editor.Configuration; using UnityEditor; using UnityEngine; From a4e7bab4731f9cb5c0cb6c88bbfbe2c7abf67418 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 19:40:00 -0500 Subject: [PATCH 65/99] fix: We need to initialize prefabs prior to checking if we have Ghosts and need to use UnifiedNetcodeTransport. Fixing the logging and handling for users parenting NetworkManager during runtime. --- .../Runtime/Core/NetworkManager.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 3219fd0362..87ceaa1185 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1018,11 +1018,13 @@ internal bool NetworkManagerCheckForParent(bool ignoreNetworkManagerCache = fals { #if UNITY_EDITOR var isParented = NetworkManagerHelper.NotifyUserOfNestedNetworkManager(this, ignoreNetworkManagerCache); + + #else - var isParented = transform.root != transform; + var isParented = transform.parent != null; if (isParented) { - throw new Exception(GenerateNestedNetworkManagerMessage(transform)); + Log.Error(new Context(LogLevel.Error, GenerateNestedNetworkManagerMessage(transform))); } #endif return isParented; @@ -1038,7 +1040,17 @@ internal static string GenerateNestedNetworkManagerMessage(Transform transform) /// private void OnTransformParentChanged() { +#if UNITY_EDITOR + // During editor playmode, we log the message as a dialog box + // and that script sets the parent back to root/null. NetworkManagerCheckForParent(); +#else + if (NetworkManagerCheckForParent()) + { + // During runtime, we log the message and set our parent back to root/null. + transform.parent = null; + } +#endif } /// @@ -1227,6 +1239,7 @@ internal void Initialize(bool server) RealTimeProvider = ComponentFactory.Create(this); #if UNIFIED_NETCODE && OUT_OF_BAND_RPC + NetworkConfig.InitializePrefabs(); if (NetworkConfig.Prefabs.HasGhostPrefabs) { NetworkConfig.NetworkTransport = gameObject.AddComponent(); @@ -1279,8 +1292,9 @@ internal void Initialize(bool server) BehaviourUpdater = new NetworkBehaviourUpdater(); BehaviourUpdater.Initialize(this); - +#if !UNIFIED_NETCODE NetworkConfig.InitializePrefabs(); +#endif PrefabHandler.RegisterPlayerPrefab(); #if UNITY_EDITOR BeginNetworkSession(); @@ -1844,7 +1858,7 @@ internal void ShutdownInternal() #if UNIFIED_NETCODE // TODO-UNIFIED: Review and align on this being a way to handle knowing if the world should be created. - if (NetworkConfig.Prefabs.HasGhostPrefabs) + if (NetworkConfig != null && NetworkConfig.Prefabs != null && NetworkConfig.Prefabs.HasGhostPrefabs) { try { From 7c87a87772b9efc65342fee4f611f3c30cbecb2f Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 19:41:13 -0500 Subject: [PATCH 66/99] update removing debug log message that causes some tests to fail. --- .../Runtime/Messaging/NetworkMessageManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs index 40be416a00..2c09e56857 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs @@ -396,7 +396,6 @@ public void HandleMessage(in NetworkMessageHeader header, FastBufferReader reade }; var type = m_ReverseTypeMap[header.MessageType]; - Debug.Log($"Got message of type {type}"); if (!CanReceive(senderId, type, reader, ref context)) { return; From b80b0c3f146d46c8251a1567c85bb4d2ddeffc70 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 19:41:49 -0500 Subject: [PATCH 67/99] test-fix Handling a new scenario where a subSystemList can be null. --- .../Tests/Runtime/NetworkUpdateLoopTests.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkUpdateLoopTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkUpdateLoopTests.cs index ecaf3ec792..7f4dba5f16 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkUpdateLoopTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkUpdateLoopTests.cs @@ -1,6 +1,6 @@ using System; using System.Collections; -using System.Linq; +using System.Collections.Generic; using NUnit.Framework; using Unity.Netcode.TestHelpers.Runtime; using UnityEngine; @@ -41,9 +41,10 @@ public void RegisterCustomLoopInTheMiddle() PlayerLoop.SetPlayerLoop(curPlayerLoop); NetworkUpdateLoop.UnregisterLoopSystems(); - + var subSystemArray = PlayerLoop.GetCurrentPlayerLoop().subSystemList[0].subSystemList; + var lastType = subSystemArray[subSystemArray.Length - 1].type; // our custom `PlayerLoopSystem` with the type of `NetworkUpdateLoopTests` should still exist - Assert.AreEqual(typeof(NetworkUpdateLoopTests), PlayerLoop.GetCurrentPlayerLoop().subSystemList[0].subSystemList.Last().type); + Assert.AreEqual(typeof(NetworkUpdateLoopTests), lastType); } // replace the current PlayerLoop with the cached PlayerLoop after the test PlayerLoop.SetPlayerLoop(cachedPlayerLoop); @@ -94,7 +95,14 @@ public void UpdateStageSystems() for (int i = 0; i < currentPlayerLoop.subSystemList.Length; i++) { var playerLoopSystem = currentPlayerLoop.subSystemList[i]; - var subsystems = playerLoopSystem.subSystemList.ToList(); + // New behaviour (6000.6.x) + // Some PlayerLoopSystems can evidently now have no sub-system lists. + if (playerLoopSystem.subSystemList == null) + { + // Ignore any PlayerLoopSystem with no sub-system lists. + continue; + } + var subsystems = new List(playerLoopSystem.subSystemList); if (playerLoopSystem.type == typeof(Initialization)) { From 8c7650468ee3b789c594aa15e529f3a382da80ff Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 19:47:54 -0500 Subject: [PATCH 68/99] test-fix Commenting out log message in CreateObjectMessage (leaving it there for potential debug purposes while working on Unified stuff). --- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 4812c3680d..8e7ac5bd27 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -121,10 +121,11 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int } #if UNIFIED_NETCODE - if (networkManager.LogLevel == LogLevel.Developer) - { - UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); - } + // Leaving for debugging purposes + //if (networkManager.LogLevel == LogLevel.Developer) + //{ + // UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); + //} // For now, we will defer the create object message until the associated Ghost is spawned if (ObjectInfo.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(ObjectInfo.NetworkObjectId)) From 25576e33752d867fa619f8b4f0e5c6fe88cb5dfa Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 20:12:20 -0500 Subject: [PATCH 69/99] fix Some left over merge fixes. --- .../Runtime/Core/NetworkObject.cs | 161 +----------------- 1 file changed, 1 insertion(+), 160 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs index 9c96f443a9..4005627d6a 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs @@ -11,11 +11,7 @@ #if UNITY_EDITOR using UnityEditor; -#if UNITY_2021_2_OR_NEWER using UnityEditor.SceneManagement; -#else -using UnityEditor.Experimental.SceneManagement; -#endif #endif using UnityEngine; using UnityEngine.SceneManagement; @@ -2691,12 +2687,6 @@ internal void InvokeBehaviourNetworkPreSpawn() { childBehaviour.NetworkPreSpawn(ref networkManager, this); } - -#if UNIFIED_NETCODE - InitializeComponentMarkers(NetworkManager); -#endif - - } internal void InvokeBehaviourNetworkSpawn() @@ -2827,34 +2817,13 @@ internal bool InitializeChildNetworkBehaviours() networkTransform.IsNested = networkTransform.gameObject != gameObject; NetworkTransforms.Add(networkTransform); } - -#if UNIFIED_NETCODE - // For now, we will just destroy these components during runtime since they will not - // be supported in hybrid mode (don't add to the children). - if (HasGhost) - { - continue; - } -#endif - #if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D - var rigidbodyBase = behaviour as NetworkRigidbodyBase; if (rigidbodyBase != null) { NetworkRigidbodies.Add(behaviour as NetworkRigidbodyBase); } -#if UNIFIED_NETCODE - // For now, we will just destroy these components during runtime since they will not - // be supported in hybrid mode (don't add to the children). - if (HasGhost) - { - continue; - } #endif - -#endif - } #if UNIFIED_NETCODE // For now, cycle through all known NetworkTransform and NetworkRigidbodyBase derived components @@ -2886,138 +2855,10 @@ internal bool InitializeChildNetworkBehaviours() NetworkTransforms.Clear(); } } -#endif +#endif return true; } -#if UNIFIED_NETCODE - private void InitializeComponentMarkers(NetworkManager networkManager) - { - // TODO: Determine if this would be useful - //var networkBehaviours = GetComponentsInChildren(true); - //foreach(var networkBehaviour in networkBehaviours) - //{ - //} - - - var networkPrefab = GetPrefab(networkManager); - // Most likely an in-scene placed NetworkObject that is not a registered prefab - if (networkPrefab == null) - { - return; - } - - var rigidbodies = GetComponentsInChildren(); - var prefabRigidbodies = networkPrefab.Prefab.GetComponentsInChildren(); - - if (rigidbodies.Length != prefabRigidbodies.Length) - { - Debug.LogError($"[InitializeComponentTable][{name}][{GlobalObjectIdHash}] Rigidbody mismatch between prefab and prefab instance ({rigidbodies.Length} vs {prefabRigidbodies.Length}!"); - return; - } - - var hasAuthority = !NetworkManager.DistributedAuthorityMode ? NetworkManager.IsServer : IsOwner; - - var networkTransforms = GetComponentsInChildren(); - - if (!hasAuthority && !NetworkManager.DistributedAuthorityMode && networkTransforms != null && networkTransforms.Length > 0) - { - foreach (var networkTransform in networkTransforms) - { - var shouldHaveAuthority = networkTransform.AuthorityMode == NetworkTransform.AuthorityModes.Owner && NetworkManager.LocalClientId == OwnerClientId; - if (hasAuthority != shouldHaveAuthority) - { - hasAuthority = shouldHaveAuthority; - break; - } - } - } - - if (hasAuthority) - { - return; - } - - // Remove NetworkRigidbody components first. - if (NetworkRigidbodies != null && !NetworkManager.DistributedAuthorityMode) - { - for (int i = NetworkRigidbodies.Count - 1; i >= 0; i--) - { - ChildNetworkBehaviours.Remove(NetworkRigidbodies[i].NetworkBehaviourId); - Destroy(NetworkRigidbodies[i]); - } - NetworkRigidbodies.Clear(); - // Unregister any registered NetworkRigidbody components - if (NetworkTransforms != null) - { - foreach (var networkTransform in NetworkTransforms) - { - networkTransform.UnregisterRigidbody(); - } - } - } - - /// Mark all rigid bodies with the component marker. - /// This provides us with an automated way to remove or add rigid bodies - /// while preserving their state via . - for (int i = 0; i < rigidbodies.Length; i++) - { - var rigidbody = rigidbodies[i]; - var prefabRigidbody = prefabRigidbodies[i]; - - var componentMarker = rigidbody.gameObject.AddComponent(); - componentMarker.Initialize(networkManager, rigidbody, prefabRigidbody); - // If we are in client-server and not the server - if (!hasAuthority) - { - // Remove the rigid body. - componentMarker.Remove(); - componentMarker.Remove(); - } - } - } - - public void UpdateComponentStatus(bool shouldAdd) where T : Component - { - if (!IsSpawned) - { - return; - } - - var gameObjectsTable = ComponentMarker.RegisteredMarkers[NetworkManager]; - foreach (var gameObjectTable in gameObjectsTable) - { - foreach (var componentMarker in gameObjectTable.Value) - { - if (shouldAdd) - { - componentMarker.Add(); - } - else - { - componentMarker.Remove(); - } - } - } - } - - /// - /// POC Version of this. - /// Currently does not take overrides into consideration. - /// We could auto-register each instance's source prefab. - /// - /// - /// - private NetworkPrefab GetPrefab(NetworkManager networkManager) - { - if (networkManager && networkManager.NetworkConfig.Prefabs.PrefabTable.ContainsKey(GlobalObjectIdHash)) - { - return networkManager.NetworkConfig.Prefabs.PrefabTable[GlobalObjectIdHash]; - } - return null; - } -#endif - /// /// Used when changing ownership, this will mark any owner read permission base NetworkVariables as dirty /// and will check if any owner write permission NetworkVariables are dirty (primarily for collections) so From 61688b9922d8b2dd37b8936c596079c016b58563 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 20:12:49 -0500 Subject: [PATCH 70/99] update Removing legacy component marker from early POC. --- .../Components/Helpers/ComponentMarker.cs | 100 ------------------ .../Helpers/ComponentMarker.cs.meta | 2 - 2 files changed, 102 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs delete mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs deleted file mode 100644 index e11978281e..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs +++ /dev/null @@ -1,100 +0,0 @@ -#if UNIFIED_NETCODE -using System.Collections.Generic; -using UnityEngine; - -namespace Unity.Netcode -{ - /// - /// Can be used to remove and add back a component that is being tracked. - /// Requires invoking before a component is marked to be tracked. - /// - [HideInInspector] - internal class ComponentMarker : MonoBehaviour - { - internal static Dictionary>> RegisteredMarkers = new Dictionary>>(); - - private static void AddInstance(NetworkManager networkManager, ComponentMarker instance) - { - if (!RegisteredMarkers.ContainsKey(networkManager)) - { - RegisteredMarkers.Add(networkManager, new Dictionary>()); - } - - if (!RegisteredMarkers[networkManager].ContainsKey(instance.gameObject)) - { - RegisteredMarkers[networkManager].Add(instance.gameObject, new HashSet()); - } - RegisteredMarkers[networkManager][instance.gameObject].Add(instance); - } - - private static void RemoveInstance(NetworkManager networkManager, ComponentMarker instance) - { - if (!RegisteredMarkers.ContainsKey(networkManager)) - { - return; - } - - if (!RegisteredMarkers[networkManager].ContainsKey(instance.gameObject)) - { - return; - } - RegisteredMarkers[networkManager][instance.gameObject].Remove(instance); - - if (RegisteredMarkers[networkManager][instance.gameObject].Count == 0) - { - RegisteredMarkers[networkManager].Remove(instance.gameObject); - } - - if (RegisteredMarkers[networkManager].Count == 0) - { - RegisteredMarkers.Remove(networkManager); - } - } - - internal NetworkManager NetworkManager { get; private set; } - - internal Component PrefabInstance { get; private set; } - internal Component CurrentInstance { get; private set; } - - internal void Add() where T : Component - { - if (CurrentInstance) - { - return; - } - var instanceAsType = (T)PrefabInstance; - CurrentInstance = ComponentHelpers.AddAndCopy(gameObject, instanceAsType); - } - - internal void Remove() where T : Component - { - if (!CurrentInstance) - { - return; - } - Destroy(CurrentInstance); - CurrentInstance = null; - } - - /// - /// Initializes this marker to track the current component instance paired with the prefab's instance of the component. - /// - /// The type of component being marked. - /// To help with integration testing (tracking which NetworkManager instance a registered marker belongs to. - /// The current active comonent instance. - /// The prefab's instance of the component (used to replicate the setttings when adding back). - internal void Initialize(NetworkManager networkManager, T currentInstance, T prefabInstance) where T : Component - { - CurrentInstance = currentInstance; - PrefabInstance = prefabInstance; - NetworkManager = networkManager; - AddInstance(networkManager, this); - } - - internal void OnDestroy() - { - RemoveInstance(NetworkManager, this); - } - } -} -#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta deleted file mode 100644 index 5202ad04ce..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentMarker.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2ee4eade8cd29c0429f6ed606aa9141f \ No newline at end of file From 481ff8e289df8cc20a15a578fd4d250fb17bdd3b Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 28 Apr 2026 20:20:27 -0500 Subject: [PATCH 71/99] fix When no player prefab, don't throw an exception (needs a test) --- .../Runtime/Connection/NetworkConnectionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs index bcdb8ba05a..4c9a416c98 100644 --- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs @@ -972,7 +972,7 @@ internal void HandleConnectionApproval(ulong ownerClientId, bool createPlayerObj } // Server-side spawning (only if there is a prefab hash or player prefab provided) - var idHashToSpawn = playerPrefabHash ?? NetworkManager.NetworkConfig.PlayerPrefab?.GetComponent()?.GlobalObjectIdHash; + var idHashToSpawn = (playerPrefabHash != null && playerPrefabHash.HasValue) ? playerPrefabHash.Value : NetworkManager.NetworkConfig.PlayerPrefab != null ? NetworkManager.NetworkConfig.PlayerPrefab.GetComponent()?.GlobalObjectIdHash : null; if (!NetworkManager.DistributedAuthorityMode && createPlayerObject && idHashToSpawn.HasValue) { var playerObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(idHashToSpawn.Value, ownerClientId, playerPosition, playerRotation); From 779afef0a2d86256270e795c77970955412fc7ab Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 10:56:52 -0500 Subject: [PATCH 72/99] update - remove NGO-N4E-Example Removing the example from this specific branch to make reviewing easier. --- Examples/NGO-N4E-Unified/.gitignore | 76 -- Examples/NGO-N4E-Unified/.vsconfig | 6 - .../Assets/DefaultNetworkPrefabs.asset | 31 - .../Assets/DefaultNetworkPrefabs.asset.meta | 8 - .../Assets/InputSystem_Actions.inputactions | 1057 ----------------- .../InputSystem_Actions.inputactions.meta | 14 - .../NGO-N4E-Unified/Assets/Materials.meta | 8 - .../Assets/Materials/Default.mat | 138 --- .../Assets/Materials/Default.mat.meta | 8 - .../Assets/Materials/Floor.mat | 139 --- .../Assets/Materials/Floor.mat.meta | 8 - .../Assets/NetcodeConfig.asset | 76 -- .../Assets/NetcodeConfig.asset.meta | 8 - Examples/NGO-N4E-Unified/Assets/Prefabs.meta | 8 - .../Assets/Prefabs/NGOPHybridPrefab.prefab | 137 --- .../Prefabs/NGOPHybridPrefab.prefab.meta | 7 - .../Assets/Prefabs/NGOPrefab.prefab | 237 ---- .../Assets/Prefabs/NGOPrefab.prefab.meta | 7 - .../Assets/Prefabs/NetworkManager.prefab | 118 -- .../Assets/Prefabs/NetworkManager.prefab.meta | 7 - .../Assets/Prefabs/Platform.prefab | 594 --------- .../Assets/Prefabs/Platform.prefab.meta | 7 - Examples/NGO-N4E-Unified/Assets/Scenes.meta | 8 - .../Assets/Scenes/ExampleHybridSpawn.asset | 26 - .../Scenes/ExampleHybridSpawn.asset.meta | 8 - .../Assets/Scenes/ExampleHybridSpawn.unity | 661 ----------- .../Scenes/ExampleHybridSpawn.unity.meta | 7 - Examples/NGO-N4E-Unified/Assets/Scripts.meta | 8 - .../Assets/Scripts/ExampleHybridSpawn.meta | 8 - .../ExampleHybridSpawn/SpawnHybridPrefab.cs | 63 - .../SpawnHybridPrefab.cs.meta | 2 - .../Assets/Scripts/General.meta | 8 - .../Scripts/General/ExtendedNetworkManager.cs | 827 ------------- .../General/ExtendedNetworkManager.cs.meta | 2 - .../Scripts/General/ObjectPoolSystem.cs | 443 ------- .../Scripts/General/ObjectPoolSystem.cs.meta | 2 - .../Assets/Scripts/General/ProgressFill.cs | 22 - .../Scripts/General/ProgressFill.cs.meta | 2 - .../Assets/Scripts/General/SceneLoader.cs | 599 ---------- .../Scripts/General/SceneLoader.cs.meta | 2 - Examples/NGO-N4E-Unified/Assets/Settings.meta | 8 - .../Settings/DefaultVolumeProfile.asset | 982 --------------- .../Settings/DefaultVolumeProfile.asset.meta | 8 - .../Assets/Settings/Mobile_RPAsset.asset | 144 --- .../Assets/Settings/Mobile_RPAsset.asset.meta | 8 - .../Assets/Settings/Mobile_Renderer.asset | 52 - .../Settings/Mobile_Renderer.asset.meta | 8 - .../Assets/Settings/PC_RPAsset.asset | 144 --- .../Assets/Settings/PC_RPAsset.asset.meta | 8 - .../Assets/Settings/PC_Renderer.asset | 95 -- .../Assets/Settings/PC_Renderer.asset.meta | 8 - .../Assets/Settings/SampleSceneProfile.asset | 159 --- .../Settings/SampleSceneProfile.asset.meta | 8 - ...niversalRenderPipelineGlobalSettings.asset | 462 ------- ...salRenderPipelineGlobalSettings.asset.meta | 8 - .../NGO-N4E-Unified/Packages/manifest.json | 56 - .../ProjectSettings/AudioManager.asset | 19 - .../BurstAotSettings_StandaloneWindows.json | 19 - .../ProjectSettings/ClusterInputManager.asset | 6 - .../CommonBurstAotSettings.json | 6 - .../ProjectSettings/DynamicsManager.asset | 36 - .../ProjectSettings/EditorBuildSettings.asset | 12 - .../ProjectSettings/EditorSettings.asset | 52 - .../EntitiesClientSettings.asset | 16 - .../ProjectSettings/GraphicsSettings.asset | 81 -- .../ProjectSettings/InputManager.asset | 487 -------- .../ProjectSettings/MemorySettings.asset | 35 - .../ProjectSettings/MultiplayerManager.asset | 9 - .../ProjectSettings/NavMeshAreas.asset | 91 -- .../NetCodeClientAndServerSettings.asset | 41 - .../NetCodeClientSettings.asset | 18 - .../NetCodeServerSettings.asset | 17 - .../PackageManagerSettings.asset | 44 - .../ProjectSettings/Physics2DSettings.asset | 56 - .../PhysicsCoreProjectSettings2D.asset | 6 - .../ProjectSettings/PresetManager.asset | 7 - .../ProjectSettings/ProjectSettings.asset | 948 --------------- .../ProjectSettings/ProjectVersion.txt | 2 - .../ProjectSettings/QualitySettings.asset | 134 --- .../SceneTemplateSettings.json | 121 -- .../ProjectSettings/ShaderGraphSettings.asset | 19 - .../ProjectSettings/TagManager.asset | 76 -- .../ProjectSettings/TimeManager.asset | 9 - .../ProjectSettings/URPProjectSettings.asset | 16 - .../UnityConnectSettings.asset | 40 - .../ProjectSettings/VFXManager.asset | 12 - .../VersionControlSettings.asset | 8 - .../VirtualProjectsConfig.json | 4 - .../ProjectSettings/XRSettings.asset | 10 - 89 files changed, 10012 deletions(-) delete mode 100644 Examples/NGO-N4E-Unified/.gitignore delete mode 100644 Examples/NGO-N4E-Unified/.vsconfig delete mode 100644 Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions delete mode 100644 Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Materials.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Default.mat delete mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat delete mode 100644 Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab delete mode 100644 Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs delete mode 100644 Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta delete mode 100644 Examples/NGO-N4E-Unified/Packages/manifest.json delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json delete mode 100644 Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset diff --git a/Examples/NGO-N4E-Unified/.gitignore b/Examples/NGO-N4E-Unified/.gitignore deleted file mode 100644 index cfa242cd09..0000000000 --- a/Examples/NGO-N4E-Unified/.gitignore +++ /dev/null @@ -1,76 +0,0 @@ -# This .gitignore file should be placed at the root of your Unity project directory -# -# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore -# -.utmp/ -/[Ll]ibrary/ -/[Tt]emp/ -/[Oo]bj/ -/[Bb]uild/ -/[Bb]uilds/ -/[Ll]ogs/ -/[Uu]ser[Ss]ettings/ -*.log -packages-lock.* - -# MemoryCaptures can get excessive in size. -# They also could contain extremely sensitive data -/[Mm]emoryCaptures/ - -# Recordings can get excessive in size -/[Rr]ecordings/ - -# Uncomment this line if you wish to ignore the asset store tools plugin -# /[Aa]ssets/AssetStoreTools* - -# Autogenerated Jetbrains Rider plugin -/[Aa]ssets/Plugins/Editor/JetBrains* - -# Visual Studio cache directory -.vs/ - -# Gradle cache directory -.gradle/ - -# Autogenerated VS/MD/Consulo solution and project files -ExportedObj/ -.consulo/ -*.csproj -*.unityproj -*.sln -*.suo -*.tmp -*.user -*.userprefs -*.pidb -*.booproj -*.svd -*.pdb -*.mdb -*.opendb -*.VC.db - -# Unity3D generated meta files -*.pidb.meta -*.pdb.meta -*.mdb.meta - -# Unity3D generated file on crash reports -sysinfo.txt - -# Builds -*.apk -*.aab -*.unitypackage -*.unitypackage.meta -*.app - -# Crashlytics generated file -crashlytics-build.properties - -# Packed Addressables -/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* - -# Temporary auto-generated Android Assets -/[Aa]ssets/[Ss]treamingAssets/aa.meta -/[Aa]ssets/[Ss]treamingAssets/aa/* diff --git a/Examples/NGO-N4E-Unified/.vsconfig b/Examples/NGO-N4E-Unified/.vsconfig deleted file mode 100644 index f019fd0ad1..0000000000 --- a/Examples/NGO-N4E-Unified/.vsconfig +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0", - "components": [ - "Microsoft.VisualStudio.Workload.ManagedGame" - ] -} diff --git a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset deleted file mode 100644 index 6425f6827e..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset +++ /dev/null @@ -1,31 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3} - m_Name: DefaultNetworkPrefabs - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList - IsDefault: 1 - List: - - Override: 0 - Prefab: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} - - Override: 0 - Prefab: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} - - Override: 0 - Prefab: {fileID: 3779494614364547505, guid: 437919e16bbd28f459dd5277adea9585, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta b/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta deleted file mode 100644 index ac649b9453..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/DefaultNetworkPrefabs.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d763116c8b64ac34d92697d81281483a -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions deleted file mode 100644 index 1a12cb91b6..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions +++ /dev/null @@ -1,1057 +0,0 @@ -{ - "name": "InputSystem_Actions", - "maps": [ - { - "name": "Player", - "id": "df70fa95-8a34-4494-b137-73ab6b9c7d37", - "actions": [ - { - "name": "Move", - "type": "Value", - "id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408", - "expectedControlType": "Vector2", - "processors": "", - "interactions": "", - "initialStateCheck": true - }, - { - "name": "Look", - "type": "Value", - "id": "6b444451-8a00-4d00-a97e-f47457f736a8", - "expectedControlType": "Vector2", - "processors": "", - "interactions": "", - "initialStateCheck": true - }, - { - "name": "Attack", - "type": "Button", - "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Interact", - "type": "Button", - "id": "852140f2-7766-474d-8707-702459ba45f3", - "expectedControlType": "Button", - "processors": "", - "interactions": "Hold", - "initialStateCheck": false - }, - { - "name": "Crouch", - "type": "Button", - "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Jump", - "type": "Button", - "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Previous", - "type": "Button", - "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Next", - "type": "Button", - "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Sprint", - "type": "Button", - "id": "641cd816-40e6-41b4-8c3d-04687c349290", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - } - ], - "bindings": [ - { - "name": "", - "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", - "path": "/leftStick", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "WASD", - "id": "00ca640b-d935-4593-8157-c05846ea39b3", - "path": "Dpad", - "interactions": "", - "processors": "", - "groups": "", - "action": "Move", - "isComposite": true, - "isPartOfComposite": false - }, - { - "name": "up", - "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", - "path": "/w", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "up", - "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", - "path": "/upArrow", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", - "path": "/s", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", - "path": "/downArrow", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", - "path": "/a", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", - "path": "/leftArrow", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", - "path": "/d", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", - "path": "/rightArrow", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Move", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "", - "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", - "path": "/{Primary2DAxis}", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "3ea4d645-4504-4529-b061-ab81934c3752", - "path": "/stick", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Move", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", - "path": "/rightStick", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8c8e490b-c610-4785-884f-f04217b23ca4", - "path": "/delta", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse;Touch", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "3e5f5442-8668-4b27-a940-df99bad7e831", - "path": "/{Hatswitch}", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Look", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", - "path": "/buttonWest", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", - "path": "/leftButton", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", - "path": "/primaryTouch/tap", - "interactions": "", - "processors": "", - "groups": ";Touch", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", - "path": "/trigger", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8255d333-5683-4943-a58a-ccb207ff1dce", - "path": "/{PrimaryAction}", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", - "path": "/enter", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Attack", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", - "path": "/2", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Next", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", - "path": "/dpad/right", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Next", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "f2e9ba44-c423-42a7-ad56-f20975884794", - "path": "/leftShift", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Sprint", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", - "path": "/leftStickPress", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Sprint", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", - "path": "/trigger", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Sprint", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", - "path": "/space", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Jump", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", - "path": "/buttonSouth", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Jump", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "603f3daf-40bd-4854-8724-93e8017f59e3", - "path": "/secondaryButton", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Jump", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", - "path": "/1", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Previous", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", - "path": "/dpad/left", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Previous", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", - "path": "/e", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Interact", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", - "path": "/buttonNorth", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Interact", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", - "path": "/buttonEast", - "interactions": "", - "processors": "", - "groups": "Gamepad", - "action": "Crouch", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", - "path": "/c", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Crouch", - "isComposite": false, - "isPartOfComposite": false - } - ] - }, - { - "name": "UI", - "id": "272f6d14-89ba-496f-b7ff-215263d3219f", - "actions": [ - { - "name": "Navigate", - "type": "PassThrough", - "id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b", - "expectedControlType": "Vector2", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Submit", - "type": "Button", - "id": "7607c7b6-cd76-4816-beef-bd0341cfe950", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Cancel", - "type": "Button", - "id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "Point", - "type": "PassThrough", - "id": "32b35790-4ed0-4e9a-aa41-69ac6d629449", - "expectedControlType": "Vector2", - "processors": "", - "interactions": "", - "initialStateCheck": true - }, - { - "name": "Click", - "type": "PassThrough", - "id": "3c7022bf-7922-4f7c-a998-c437916075ad", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": true - }, - { - "name": "RightClick", - "type": "PassThrough", - "id": "44b200b1-1557-4083-816c-b22cbdf77ddf", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "MiddleClick", - "type": "PassThrough", - "id": "dad70c86-b58c-4b17-88ad-f5e53adf419e", - "expectedControlType": "Button", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "ScrollWheel", - "type": "PassThrough", - "id": "0489e84a-4833-4c40-bfae-cea84b696689", - "expectedControlType": "Vector2", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "TrackedDevicePosition", - "type": "PassThrough", - "id": "24908448-c609-4bc3-a128-ea258674378a", - "expectedControlType": "Vector3", - "processors": "", - "interactions": "", - "initialStateCheck": false - }, - { - "name": "TrackedDeviceOrientation", - "type": "PassThrough", - "id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be", - "expectedControlType": "Quaternion", - "processors": "", - "interactions": "", - "initialStateCheck": false - } - ], - "bindings": [ - { - "name": "Gamepad", - "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", - "path": "2DVector", - "interactions": "", - "processors": "", - "groups": "", - "action": "Navigate", - "isComposite": true, - "isPartOfComposite": false - }, - { - "name": "up", - "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", - "path": "/leftStick/up", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "up", - "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", - "path": "/rightStick/up", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "2db08d65-c5fb-421b-983f-c71163608d67", - "path": "/leftStick/down", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "58748904-2ea9-4a80-8579-b500e6a76df8", - "path": "/rightStick/down", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", - "path": "/leftStick/left", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", - "path": "/rightStick/left", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "fcd248ae-a788-4676-a12e-f4d81205600b", - "path": "/leftStick/right", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", - "path": "/rightStick/right", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "", - "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", - "path": "/dpad", - "interactions": "", - "processors": "", - "groups": ";Gamepad", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "Joystick", - "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", - "path": "2DVector", - "interactions": "", - "processors": "", - "groups": "", - "action": "Navigate", - "isComposite": true, - "isPartOfComposite": false - }, - { - "name": "up", - "id": "3db53b26-6601-41be-9887-63ac74e79d19", - "path": "/stick/up", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", - "path": "/stick/down", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", - "path": "/stick/left", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", - "path": "/stick/right", - "interactions": "", - "processors": "", - "groups": "Joystick", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "Keyboard", - "id": "ff527021-f211-4c02-933e-5976594c46ed", - "path": "2DVector", - "interactions": "", - "processors": "", - "groups": "", - "action": "Navigate", - "isComposite": true, - "isPartOfComposite": false - }, - { - "name": "up", - "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", - "path": "/w", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "up", - "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", - "path": "/upArrow", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", - "path": "/s", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "down", - "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", - "path": "/downArrow", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "74214943-c580-44e4-98eb-ad7eebe17902", - "path": "/a", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "left", - "id": "cea9b045-a000-445b-95b8-0c171af70a3b", - "path": "/leftArrow", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "8607c725-d935-4808-84b1-8354e29bab63", - "path": "/d", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "right", - "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", - "path": "/rightArrow", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Navigate", - "isComposite": false, - "isPartOfComposite": true - }, - { - "name": "", - "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", - "path": "*/{Submit}", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", - "action": "Submit", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", - "path": "*/{Cancel}", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", - "action": "Cancel", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", - "path": "/position", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Point", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", - "path": "/position", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "Point", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", - "path": "/touch*/position", - "interactions": "", - "processors": "", - "groups": "Touch", - "action": "Point", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", - "path": "/leftButton", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Click", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", - "path": "/tip", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "Click", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", - "path": "/touch*/press", - "interactions": "", - "processors": "", - "groups": "Touch", - "action": "Click", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", - "path": "/trigger", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "Click", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "38c99815-14ea-4617-8627-164d27641299", - "path": "/scroll", - "interactions": "", - "processors": "", - "groups": ";Keyboard&Mouse", - "action": "ScrollWheel", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "4c191405-5738-4d4b-a523-c6a301dbf754", - "path": "/rightButton", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "RightClick", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", - "path": "/middleButton", - "interactions": "", - "processors": "", - "groups": "Keyboard&Mouse", - "action": "MiddleClick", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", - "path": "/devicePosition", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "TrackedDevicePosition", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", - "path": "/deviceRotation", - "interactions": "", - "processors": "", - "groups": "XR", - "action": "TrackedDeviceOrientation", - "isComposite": false, - "isPartOfComposite": false - } - ] - } - ], - "controlSchemes": [ - { - "name": "Keyboard&Mouse", - "bindingGroup": "Keyboard&Mouse", - "devices": [ - { - "devicePath": "", - "isOptional": false, - "isOR": false - }, - { - "devicePath": "", - "isOptional": false, - "isOR": false - } - ] - }, - { - "name": "Gamepad", - "bindingGroup": "Gamepad", - "devices": [ - { - "devicePath": "", - "isOptional": false, - "isOR": false - } - ] - }, - { - "name": "Touch", - "bindingGroup": "Touch", - "devices": [ - { - "devicePath": "", - "isOptional": false, - "isOR": false - } - ] - }, - { - "name": "Joystick", - "bindingGroup": "Joystick", - "devices": [ - { - "devicePath": "", - "isOptional": false, - "isOR": false - } - ] - }, - { - "name": "XR", - "bindingGroup": "XR", - "devices": [ - { - "devicePath": "", - "isOptional": false, - "isOR": false - } - ] - } - ] -} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta b/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta deleted file mode 100644 index 6b38b043d9..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/InputSystem_Actions.inputactions.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: 052faaac586de48259a63d0c4782560b -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} - generateWrapperCode: 0 - wrapperCodePath: - wrapperClassName: - wrapperCodeNamespace: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials.meta b/Examples/NGO-N4E-Unified/Assets/Materials.meta deleted file mode 100644 index 3c0675c266..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Materials.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7c16ac16c44675046b777e34fc86ec35 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat deleted file mode 100644 index f4b9eba665..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat +++ /dev/null @@ -1,138 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Default - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _ScreenSpaceReflections: 1 - - _Smoothness: 0.5 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 1, g: 1, b: 1, a: 1} - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &2980297282079257953 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta b/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta deleted file mode 100644 index 70d3e56a72..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Materials/Default.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4c454c558b3cf384ea795205f3e0dc83 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat deleted file mode 100644 index d52d260419..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat +++ /dev/null @@ -1,139 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Floor - m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: - - _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: - RenderType: Opaque - disabledShaderPasses: - - MOTIONVECTORS - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BaseMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 0 - - _AlphaToMask: 0 - - _Blend: 0 - - _BlendModePreserveSpecular: 1 - - _BumpScale: 1 - - _ClearCoatMask: 0 - - _ClearCoatSmoothness: 0 - - _Cull: 2 - - _Cutoff: 0.5 - - _DetailAlbedoMapScale: 1 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _DstBlendAlpha: 0 - - _EnvironmentReflections: 1 - - _GlossMapScale: 0 - - _Glossiness: 0 - - _GlossyReflections: 0 - - _Metallic: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.005 - - _QueueOffset: 0 - - _ReceiveShadows: 1 - - _ScreenSpaceReflections: 1 - - _Smoothness: 0.14 - - _SmoothnessTextureChannel: 1 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _SrcBlendAlpha: 1 - - _Surface: 0 - - _WorkflowMode: 1 - - _XRMotionVectorsPass: 1 - - _ZWrite: 1 - m_Colors: - - _BaseColor: {r: 0.009433985, g: 0.009433985, b: 0.009433985, a: 1} - - _Color: {r: 0.009433985, g: 0.009433985, b: 0.009433985, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &2980297282079257953 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion - version: 10 diff --git a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta b/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta deleted file mode 100644 index b78f4ac3fe..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Materials/Floor.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1ab550260fb105b4b97d43ac0e573d25 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset deleted file mode 100644 index d5b61c2b58..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset +++ /dev/null @@ -1,76 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: abd30ee0214cf6a45b2d76765a4615b1, type: 3} - m_Name: NetcodeConfig - m_EditorClassIdentifier: Unity.NetCode::Unity.NetCode.NetCodeConfig - IsGlobalConfig: 1 - EnableClientServerBootstrap: 0 - HostWorldModeSelection: 1 - ClientServerTickRate: - SimulationTickRate: 60 - PredictedFixedStepSimulationTickRatio: 1 - NetworkTickRate: 0 - MaxSimulationStepsPerFrame: 1 - MaxSimulationStepBatchSize: 4 - TargetFrameRateMode: 0 - m_SendSnapshotsForCatchUpTicks: 0 - SnapshotAckMaskCapacity: 4096 - m_ClampPartialTicksThreshold: 5 - HandshakeApprovalTimeoutMS: 5000 - ClientTickRate: - InterpolationTimeNetTicks: 2 - InterpolationTimeMS: 0 - MaxExtrapolationTimeSimTicks: 20 - ForcedInputLatencyTicks: 0 - MaxPredictAheadTimeMS: 500 - NumAdditionalClientPredictedGhostLifetimeTicks: 0 - DefaultClassificationAllowableTickPeriod: 5 - TargetCommandSlack: 2 - NumAdditionalCommandsToSend: 2 - MaxPredictionStepBatchSizeRepeatedTick: 0 - MaxPredictionStepBatchSizeFirstTimeTick: 0 - PredictionLoopUpdateMode: 0 - InterpolationDelayJitterScale: 1.25 - InterpolationDelayMaxDeltaTicksFraction: 0.1 - InterpolationDelayCorrectionFraction: 0.1 - InterpolationTimeScaleMin: 0.85 - InterpolationTimeScaleMax: 1.1 - CommandAgeCorrectionFraction: 0.1 - PredictionTimeScaleMin: 0.9 - PredictionTimeScaleMax: 1.1 - GhostSendSystemData: - DefaultSnapshotPacketSize: 0 - PercentReservedForDespawnMessages: 0.33 - MinSendImportance: 0 - MinDistanceScaledSendImportance: 0 - MaxIterateChunks: 0 - MaxSendChunks: 0 - MaxSendEntities: 0 - m_ForceSingleBaseline: 0 - m_ForcePreSerialize: 0 - m_KeepSnapshotHistoryOnStructuralChange: 1 - m_EnablePerComponentProfiling: 0 - CleanupConnectionStatePerTick: 1 - m_FirstSendImportanceMultiplier: 1 - m_IrrelevantImportanceDownScale: 1 - m_TempStreamSize: 8192 - m_UseCustomSerializer: 0 - ConnectTimeoutMS: 1000 - MaxConnectAttempts: 60 - DisconnectTimeoutMS: 30000 - HeartbeatTimeoutMS: 500 - ReconnectionTimeoutMS: 2000 - ClientSendQueueCapacity: 64 - ClientReceiveQueueCapacity: 64 - ServerSendQueueCapacity: 512 - ServerReceiveQueueCapacity: 512 - MaxMessageSize: 1400 diff --git a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta b/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta deleted file mode 100644 index acef5b4241..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/NetcodeConfig.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 70e9b26fe069d0a449180c6f69a25b8e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs.meta deleted file mode 100644 index cd808a8a99..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: afb5197ab0e89c249a3b2d33ab7edc08 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab deleted file mode 100644 index fadc717fa1..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab +++ /dev/null @@ -1,137 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1001 &2668897094866269667 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 387956770341509842, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: m_Name - value: NGOPHybridPrefab - objectReference: {fileID: 0} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: HasGhost - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: HadBridge - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: GhostAdapter - value: - objectReference: {fileID: -6696674705205069518} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: GlobalObjectIdHash - value: 662866294 - objectReference: {fileID: 0} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: NetworkObjectBridge - value: - objectReference: {fileID: -8073807847180285787} - - target: {fileID: 4887312478845455083, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - propertyPath: SynchronizeTransform - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: - - targetCorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - insertIndex: 1 - addedObject: {fileID: -6696674705205069518} - - targetCorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - insertIndex: 2 - addedObject: {fileID: -8073807847180285787} - m_SourcePrefab: {fileID: 100100000, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} ---- !u!1 &3028950850322519543 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - m_PrefabInstance: {fileID: 2668897094866269667} - m_PrefabAsset: {fileID: 0} ---- !u!114 &-6696674705205069518 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3028950850322519543} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e8f668e4690f4a86838c7135ee10c69a, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.NetCode::Unity.NetCode.GhostAdapter - HasOwner: 0 - SupportAutoCommandTarget: 1 - TrackInterpolationDelay: 0 - GhostGroup: 0 - UsePreSerialization: 0 - UseSingleBaseline: 0 - RollbackPredictedSpawnedGhostState: 0 - RollbackPredictionOnStructuralChanges: 1 - DefaultGhostMode: 0 - SupportedGhostModes: 3 - OptimizationMode: 0 - Importance: 1 - MaxSendRate: 0 - prefabId: cdc4eeee20e3cb24da5874c6542f24d9 - prefabReference: {fileID: 0} - SkipAutomaticPrefabRegistration: 0 - m_AllBehaviours: - - {fileID: -8073807847180285787} ---- !u!114 &-8073807847180285787 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3028950850322519543} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 510c5bb08d2f5724e85aa4fb66a8a4ff, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObjectBridge - m_Sorted: 1 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta deleted file mode 100644 index 9a4bbb4434..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPHybridPrefab.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: cdc4eeee20e3cb24da5874c6542f24d9 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab deleted file mode 100644 index 393142b851..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab +++ /dev/null @@ -1,237 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1081194882393186324 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 387956770341509842} - - component: {fileID: 4887312478845455083} - - component: {fileID: 4044729452182671775} - - component: {fileID: 5308326158253439111} - - component: {fileID: 4971893297530899185} - - component: {fileID: -1091923731965832849} - - component: {fileID: 4335934421289274907} - - component: {fileID: 6891221924026336373} - m_Layer: 0 - m_Name: NGOPrefab - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &387956770341509842 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - serializedVersion: 2 - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4887312478845455083 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1211280656 - InScenePlacedSourceGlobalObjectIdHash: 0 - GhostAdapter: {fileID: 0} - HasGhost: 0 - HadBridge: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 1 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 - NetworkObjectBridge: {fileID: 0} ---- !u!33 &4044729452182671775 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5308326158253439111 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 4c454c558b3cf384ea795205f3e0dc83, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!54 &4971893297530899185 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - serializedVersion: 5 - m_Mass: 1 - m_LinearDamping: 0 - m_AngularDamping: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 1 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!135 &-1091923731965832849 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &4335934421289274907 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform - ShowTopMostFoldoutHeaderGroup: 1 - NetworkTransformExpanded: 0 - AutoOwnerAuthorityTickOffset: 1 - PositionInterpolationType: 1 - RotationInterpolationType: 1 - ScaleInterpolationType: 1 - PositionLerpSmoothing: 1 - PositionMaxInterpolationTime: 0.75 - RotationLerpSmoothing: 1 - RotationMaxInterpolationTime: 0.75 - ScaleLerpSmoothing: 1 - ScaleMaxInterpolationTime: 0.75 - AuthorityMode: 0 - TickSyncChildren: 0 - UseUnreliableDeltas: 0 - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0.01 - RotAngleThreshold: 0.01 - ScaleThreshold: 0.01 - UseQuaternionSynchronization: 1 - UseQuaternionCompression: 1 - UseHalfFloatPrecision: 0 - InLocalSpace: 0 - SwitchTransformSpaceWhenParented: 0 - Interpolate: 1 - SlerpPosition: 0 ---- !u!114 &6891221924026336373 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1081194882393186324} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f6c0be61502bb534f922ebb746851216, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkRigidbody - ShowTopMostFoldoutHeaderGroup: 1 - NetworkRigidbodyBaseExpanded: 0 - UseRigidBodyForMotion: 1 - AutoUpdateKinematicState: 1 - AutoSetKinematicOnDespawn: 1 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta deleted file mode 100644 index 7aa7d5ad88..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NGOPrefab.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 49d6ca40767839f4e9b0b9461dc2a7a5 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab deleted file mode 100644 index 51d20beaf7..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab +++ /dev/null @@ -1,118 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &758486372397951634 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6832356762183308804} - - component: {fileID: -7775554403155284590} - - component: {fileID: -1723422341158045418} - m_Layer: 0 - m_Name: NetworkManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6832356762183308804 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 758486372397951634} - serializedVersion: 2 - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &-7775554403155284590 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 758486372397951634} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3b9b9fa03bea2a7469cf28788bef1223, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::ExtendedNetworkManager - NetworkManagerExpanded: 1 - NetworkConfig: - ProtocolVersion: 0 - NetworkTransport: {fileID: -1723422341158045418} - PlayerPrefab: {fileID: 0} - Prefabs: - NetworkPrefabsLists: [] - TickRate: 30 - ClientConnectionBufferTimeout: 10 - ConnectionApproval: 0 - ConnectionData: - EnableTimeResync: 0 - TimeResyncInterval: 30 - EnsureNetworkVariableLengthSafety: 0 - EnableSceneManagement: 1 - ForceSamePrefabs: 1 - RecycleNetworkIds: 1 - NetworkIdRecycleDelay: 120 - RpcHashSize: 0 - LoadSceneTimeOut: 120 - SpawnTimeout: 10 - EnableNetworkLogs: 1 - NetworkTopology: 0 - UseCMBService: 0 - AutoSpawnPlayerPrefabClientSide: 1 - NetworkProfilingMetrics: 1 - OldPrefabList: [] - RunInBackground: 1 - LogLevel: 1 - NetworkManagerBootstrapperExpanded: 0 - TargetFrameRate: 100 - EnableVSync: 0 - UseDAHost: 1 - AuthenticateWithServices: 1 - m_OriginalVSyncCount: 0 - m_ServicesRegistered: 1 - m_UsingHybridSpawning: 0 - GravityMultiplier: 3 - ProgressBar: {fileID: 0} - ByPassPoolLoading: 0 - CustomHeader: ---- !u!114 &-1723422341158045418 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 758486372397951634} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6960e84d07fb87f47956e7a81d71c4e6, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Transports.UTP.UnityTransport - m_ProtocolType: 0 - m_UseWebSockets: 0 - m_UseEncryption: 0 - m_MaxPacketQueueSize: 128 - m_MaxPayloadSize: 6144 - m_HeartbeatTimeoutMS: 500 - m_ConnectTimeoutMS: 1000 - m_MaxConnectAttempts: 60 - m_DisconnectTimeoutMS: 30000 - ConnectionData: - Address: 127.0.0.1 - Port: 7777 - ServerListenAddress: 127.0.0.1 - ClientBindPort: 0 - DebugSimulator: - PacketDelayMS: 0 - PacketJitterMS: 0 - PacketDropRate: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta deleted file mode 100644 index 4b95cde12a..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/NetworkManager.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: bcd6914dbac4146429b9c27113844b83 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab deleted file mode 100644 index 5bc9ae7cd2..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab +++ /dev/null @@ -1,594 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &467542547172540648 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4038304607712843414} - - component: {fileID: 8918527578376366212} - - component: {fileID: 7729777220788956213} - - component: {fileID: 4781818097215889214} - m_Layer: 0 - m_Name: Wall (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &4038304607712843414 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467542547172540648} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0.009460998, y: 0, z: 4.990539} - m_LocalScale: {x: 0.1, y: 0.19845001, z: 10.250001} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1458844713925352543} - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!33 &8918527578376366212 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467542547172540648} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7729777220788956213 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467542547172540648} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &4781818097215889214 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467542547172540648} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &3453886764296983546 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5860544785372191957} - - component: {fileID: 5767181706892962636} - - component: {fileID: 1543669020394555015} - - component: {fileID: 170345526220950870} - m_Layer: 0 - m_Name: Wall (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5860544785372191957 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3453886764296983546} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0.009460998, y: 0, z: -4.9194613} - m_LocalScale: {x: 0.1, y: 0.19845001, z: 10.250001} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1458844713925352543} - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!33 &5767181706892962636 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3453886764296983546} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1543669020394555015 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3453886764296983546} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &170345526220950870 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3453886764296983546} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &5269060278182735065 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7316275697251164759} - - component: {fileID: 1109063800762097591} - - component: {fileID: 3858656344656365436} - - component: {fileID: 8339481737727997267} - m_Layer: 0 - m_Name: Wall - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7316275697251164759 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5269060278182735065} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -5.050539, y: -0.00080509187, z: 0.010539002} - m_LocalScale: {x: 0.1, y: 0.19845001, z: 9.833339} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1458844713925352543} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1109063800762097591 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5269060278182735065} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3858656344656365436 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5269060278182735065} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &8339481737727997267 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5269060278182735065} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &7810017892433284147 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8839392687045787195} - - component: {fileID: 3394351341117732491} - - component: {fileID: 3321473208956563671} - - component: {fileID: 7528959553622805112} - m_Layer: 0 - m_Name: Wall (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8839392687045787195 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7810017892433284147} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 5.0694613, y: -0.00080509187, z: 0.010539002} - m_LocalScale: {x: 0.1, y: 0.19845001, z: 9.833339} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1458844713925352543} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &3394351341117732491 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7810017892433284147} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3321473208956563671 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7810017892433284147} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &7528959553622805112 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7810017892433284147} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &7913125339339818138 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1458844713925352543} - - component: {fileID: 6792227805241954997} - - component: {fileID: 6807811170524320580} - - component: {fileID: 9059678504831679329} - - component: {fileID: 2049004318828787112} - m_Layer: 0 - m_Name: Platform - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1458844713925352543 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7913125339339818138} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.69461, y: -20, z: 0.69461} - m_LocalScale: {x: 10, y: 10, z: 10} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7316275697251164759} - - {fileID: 8839392687045787195} - - {fileID: 4038304607712843414} - - {fileID: 5860544785372191957} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &6792227805241954997 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7913125339339818138} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6807811170524320580 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7913125339339818138} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 1ab550260fb105b4b97d43ac0e573d25, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &9059678504831679329 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7913125339339818138} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 10, y: 0.1241951, z: 10} - m_Center: {x: 0, y: -0.06290245, z: 0} ---- !u!54 &2049004318828787112 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7913125339339818138} - serializedVersion: 5 - m_Mass: 10000 - m_LinearDamping: 100 - m_AngularDamping: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 1 - m_Interpolate: 0 - m_Constraints: 126 - m_CollisionDetection: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta b/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta deleted file mode 100644 index a74ab6696e..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Prefabs/Platform.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e8ce062a44ddd3e459d1539c01ceb1e9 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes.meta b/Examples/NGO-N4E-Unified/Assets/Scenes.meta deleted file mode 100644 index 80ae6a2786..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a08b5979dd79daa4b86a0c79927089b4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset deleted file mode 100644 index 05f0ac6405..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset +++ /dev/null @@ -1,26 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e651dbb3fbac04af2b8f5abf007ddc23, type: 3} - m_Name: ExampleHybridSpawn - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkPrefabsList - IsDefault: 0 - List: - - Override: 0 - Prefab: {fileID: 1081194882393186324, guid: 49d6ca40767839f4e9b0b9461dc2a7a5, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} - - Override: 0 - Prefab: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta deleted file mode 100644 index 995722384d..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 91b2555ab23f0114ca79e074632b5cf4 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity deleted file mode 100644 index 8a6ff39569..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity +++ /dev/null @@ -1,661 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 10 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &330585543 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 330585546} - - component: {fileID: 330585545} - - component: {fileID: 330585544} - - component: {fileID: 330585547} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &330585544 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 ---- !u!20 &330585545 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.14618191, g: 0.2537911, b: 0.4245283, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &330585546 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - serializedVersion: 2 - m_LocalRotation: {x: 0.1564345, y: 0, z: 0, w: 0.98768836} - m_LocalPosition: {x: 0, y: 10, z: -30} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 18, y: 0, z: 0} ---- !u!114 &330585547 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_RenderShadows: 1 - m_RequiresDepthTextureOption: 2 - m_RequiresOpaqueTextureOption: 2 - m_CameraType: 0 - m_Cameras: [] - m_RendererIndex: -1 - m_VolumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - m_VolumeTrigger: {fileID: 0} - m_VolumeFrameworkUpdateModeOption: 2 - m_RenderPostProcessing: 1 - m_Antialiasing: 0 - m_AntialiasingQuality: 2 - m_StopNaN: 0 - m_Dithering: 0 - m_ClearDepth: 1 - m_AllowXRRendering: 1 - m_AllowHDROutput: 1 - m_UseScreenCoordOverride: 0 - m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} - m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} - m_RequiresDepthTexture: 0 - m_RequiresColorTexture: 0 - m_TaaSettings: - m_Quality: 3 - m_FrameInfluence: 0.1 - m_JitterScale: 1 - m_MipBias: 0 - m_VarianceClampScale: 0.9 - m_ContrastAdaptiveSharpening: 0 - m_Version: 2 ---- !u!1 &410087039 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 410087041} - - component: {fileID: 410087040} - - component: {fileID: 410087042} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &410087040 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - m_Enabled: 1 - serializedVersion: 13 - m_Type: 1 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 2 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize2D: {x: 10, y: 10} - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 5000 - m_UseColorTemperature: 1 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShapeRadius: 0 - m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 ---- !u!4 &410087041 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!114 &410087042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UsePipelineSettings: 1 - m_AdditionalLightsShadowResolutionTier: 2 - m_CustomShadowLayers: 0 - m_LightCookieSize: {x: 1, y: 1} - m_LightCookieOffset: {x: 0, y: 0} - m_SoftShadowQuality: 1 - m_RenderingLayersMask: - serializedVersion: 0 - m_Bits: 1 - m_ShadowRenderingLayersMask: - serializedVersion: 0 - m_Bits: 1 - m_Version: 4 - m_LightLayerMask: 1 - m_ShadowLayerMask: 1 - m_RenderingLayers: 1 - m_ShadowRenderingLayers: 1 ---- !u!1 &832575517 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 832575519} - - component: {fileID: 832575518} - m_Layer: 0 - m_Name: Global Volume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &832575518 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 832575517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 1 - priority: 0 - blendDistance: 0 - weight: 1 - sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} ---- !u!4 &832575519 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 832575517} - serializedVersion: 2 - 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_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1579759821 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: UseDAHost - value: 0 - objectReference: {fileID: 0} - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_UsingHybridSpawning - value: 1 - objectReference: {fileID: 0} - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: AuthenticateWithServices - value: 0 - objectReference: {fileID: 0} - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: NetworkManagerBootstrapperExpanded - value: 1 - objectReference: {fileID: 0} - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: NetworkConfig.Prefabs.NetworkPrefabsLists.Array.size - value: 1 - objectReference: {fileID: 0} - - target: {fileID: -7775554403155284590, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: 'NetworkConfig.Prefabs.NetworkPrefabsLists.Array.data[0]' - value: - objectReference: {fileID: 11400000, guid: 91b2555ab23f0114ca79e074632b5cf4, type: 2} - - target: {fileID: 758486372397951634, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_Name - value: NetworkManager - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalPosition.x - value: -0.6946 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalPosition.z - value: 0.6946 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6832356762183308804, guid: bcd6914dbac4146429b9c27113844b83, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: bcd6914dbac4146429b9c27113844b83, type: 3} ---- !u!1 &1860885329 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1860885331} - - component: {fileID: 1860885330} - - component: {fileID: 1860885332} - m_Layer: 0 - m_Name: PrefabSpawner - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1860885330 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1860885329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 4059357279 - InScenePlacedSourceGlobalObjectIdHash: 0 - GhostAdapter: {fileID: 0} - HasGhost: 0 - HadBridge: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 - NetworkObjectBridge: {fileID: 0} ---- !u!4 &1860885331 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1860885329} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 5.56, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1860885332 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1860885329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 65b77c0801af8d541b370f07c62ee59e, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::SpawnHybridPrefab - ShowTopMostFoldoutHeaderGroup: 1 - HybridPrefabToSpawn: {fileID: 3028950850322519543, guid: cdc4eeee20e3cb24da5874c6542f24d9, type: 3} - KeyToSpawn: 32 - KeyToDespawnAll: 127 - SpawnRadius: 5 ---- !u!1001 &7483895472622945903 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalPosition.x - value: -0.69461 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalPosition.y - value: -20 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalPosition.z - value: 0.69461 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1458844713925352543, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7913125339339818138, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} - propertyPath: m_Name - value: Platform - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e8ce062a44ddd3e459d1539c01ceb1e9, type: 3} ---- !u!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 330585546} - - {fileID: 410087041} - - {fileID: 832575519} - - {fileID: 1579759821} - - {fileID: 1860885331} - - {fileID: 7483895472622945903} diff --git a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta b/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta deleted file mode 100644 index 9531828bcd..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scenes/ExampleHybridSpawn.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 99c9720ab356a0642a771bea13969a05 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts.meta b/Examples/NGO-N4E-Unified/Assets/Scripts.meta deleted file mode 100644 index dd3497db8c..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c1672b0e929204047b52399bd8e36e92 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta deleted file mode 100644 index 52234632bb..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6987ed5a07241a548985089ab12eb0cf -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs deleted file mode 100644 index 35a4850aef..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using Unity.Netcode; -using UnityEngine; - -public class SpawnHybridPrefab : NetworkBehaviour, INetworkUpdateSystem -{ - public GameObject HybridPrefabToSpawn; - public KeyCode KeyToSpawn = KeyCode.Space; - public KeyCode KeyToDespawnAll = KeyCode.Delete; - - [Range(1.0f, 10.0f)] - public float SpawnRadius = 5.0f; - - private List m_SpawnedObjects = new List(); - - protected override void OnNetworkPostSpawn() - { - if (IsServer) - { - NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.Update); - } - base.OnNetworkPostSpawn(); - } - - public override void OnNetworkPreDespawn() - { - if (IsServer) - { - NetworkUpdateLoop.UnregisterNetworkUpdate(this, NetworkUpdateStage.Update); - } - base.OnNetworkPreDespawn(); - } - - public void NetworkUpdate(NetworkUpdateStage updateStage) - { - if (Input.GetKeyDown(KeyToSpawn)) - { - var spawnpoint = GetRandomVector3(-SpawnRadius, SpawnRadius); - spawnpoint.y = transform.position.y; - var instance = NetworkObject.InstantiateAndSpawn(HybridPrefabToSpawn, NetworkManager, position: spawnpoint, rotation: transform.rotation); - var rigidBody = instance.GetComponent(); - rigidBody.position = spawnpoint; - rigidBody.rotation = transform.rotation; - - m_SpawnedObjects.Add(instance); - } - else if (Input.GetKeyDown(KeyToDespawnAll)) - { - foreach (var networkObject in m_SpawnedObjects) - { - networkObject.Despawn(); - } - m_SpawnedObjects.Clear(); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected Vector3 GetRandomVector3(float min, float max) - { - return new Vector3(Random.Range(min, max), Random.Range(min, max), Random.Range(min, max)); - } -} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta deleted file mode 100644 index 9685cc9753..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/ExampleHybridSpawn/SpawnHybridPrefab.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 65b77c0801af8d541b370f07c62ee59e \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta deleted file mode 100644 index 530edf896c..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9053006fb21c0dd4ab110032e85b8cdf -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs deleted file mode 100644 index 2f3126b8ba..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs +++ /dev/null @@ -1,827 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Unity.Netcode; -using Unity.NetCode; -#if MULTIPLAYER_TOOLS -using Unity.Multiplayer.Tools.NetStatsMonitor; -#endif -using Unity.Services.Authentication; -using Unity.Services.Core; -using Unity.Services.Multiplayer; -using UnityEngine; -using UnityEngine.UI; -using SessionState = Unity.Services.Multiplayer.SessionState; -using UnityEngine.SceneManagement; - -#region ExtendedNetworkManagerEditor -#if UNITY_EDITOR -using Unity.Netcode.GameObjects.Editor; -using UnityEditor; -using UnityEditor.SceneManagement; -using WebSocketSharp; -/// -/// The custom editor for the component. -/// -[CustomEditor(typeof(ExtendedNetworkManager), true)] -[CanEditMultipleObjects] -public class ExtendedNetworkManagerEditor : NetworkManagerEditor -{ - private SerializedProperty m_TargetFrameRate; - private SerializedProperty m_EnableVSync; - private SerializedProperty m_UseDAHost; - private SerializedProperty m_AuthenticateWithServices; - private SerializedProperty m_GravityMultiplier; - - public override void OnEnable() - { - m_TargetFrameRate = serializedObject.FindProperty(nameof(ExtendedNetworkManager.TargetFrameRate)); - m_EnableVSync = serializedObject.FindProperty(nameof(ExtendedNetworkManager.EnableVSync)); - m_UseDAHost = serializedObject.FindProperty(nameof(ExtendedNetworkManager.UseDAHost)); - m_AuthenticateWithServices = serializedObject.FindProperty(nameof(ExtendedNetworkManager.AuthenticateWithServices)); - m_GravityMultiplier = serializedObject.FindProperty(nameof(ExtendedNetworkManager.GravityMultiplier)); - base.OnEnable(); - } - - private void DisplayNetworkManagerBootstrapperProperties() - { - var extendedNetworkManager = target as ExtendedNetworkManager; - EditorGUILayout.PropertyField(m_TargetFrameRate); - EditorGUILayout.PropertyField(m_EnableVSync); - var useDAHost = EditorGUILayout.PropertyField(m_UseDAHost); - if (extendedNetworkManager.UseDAHost) - { - extendedNetworkManager.AuthenticateWithServices = false; - } - GUI.enabled = !extendedNetworkManager.UseDAHost; - EditorGUILayout.PropertyField(m_AuthenticateWithServices); - GUI.enabled = true; - EditorGUILayout.PropertyField(m_GravityMultiplier); - } - - public override void OnInspectorGUI() - { - var extendedNetworkManager = target as ExtendedNetworkManager; - void SetExpanded(bool expanded) { extendedNetworkManager.NetworkManagerBootstrapperExpanded = expanded; } - ; - DrawFoldOutGroup(extendedNetworkManager.GetType(), DisplayNetworkManagerBootstrapperProperties, extendedNetworkManager.NetworkManagerBootstrapperExpanded, SetExpanded); - base.OnInspectorGUI(); - } -} -#endif -#endregion - -/// -/// An extended NetworkManager to handle the bootstrap loading process specific to a client-server -/// topology where one might want to have local server-side scenes, local client-side scenes, and shared (synchronized) scenes. -/// -/// -public class ExtendedNetworkManager : NetworkManager -{ - #region Validation -#if UNITY_EDITOR - - [InitializeOnLoadMethod] - private static void InitializeOnLoad() - { - if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "SampleScene") - { - UpdateServicesInfo(); - } - else - { - EditorSceneManager.sceneOpened -= SceneOpened; - EditorSceneManager.sceneOpened += SceneOpened; - } - } - - private static void SceneOpened(Scene scene, OpenSceneMode mode) - { - if (scene.name == "SampleScene") - { - UpdateServicesInfo(); - } - } - - private static void UpdateServicesInfo() - { - var extendedNetworkManager = GameObject.Find("ExtendedNetworkManager")?.GetComponent(); - if (extendedNetworkManager == null) - { - return; - } - extendedNetworkManager.CheckServiceStatus(); - } - - // Inspector view expand/collapse settings for this derived child class - [HideInInspector] - public bool NetworkManagerBootstrapperExpanded; - protected override void OnValidateComponent() - { - m_OriginalVSyncCount = QualitySettings.vSyncCount; - CheckServiceStatus(); - - m_UsingHybridSpawning = false; - if (NetworkConfig.Prefabs.NetworkPrefabsLists.Count > 0) - { - foreach (var prefabList in NetworkConfig.Prefabs.NetworkPrefabsLists) - { - foreach (var prefabEntry in prefabList.PrefabList) - { - if (prefabEntry.Prefab != null & prefabEntry.Prefab.GetComponent()) - { - m_UsingHybridSpawning = true; - break; - } - } - } - } - - base.OnValidateComponent(); - } - - private void CheckServiceStatus() - { - m_ServicesRegistered = CloudProjectSettings.organizationName != string.Empty && CloudProjectSettings.organizationId != string.Empty; - } -#endif - #endregion - - #region Properties - public static ExtendedNetworkManager Instance; - - public int TargetFrameRate = 100; - public bool EnableVSync = false; - public bool UseDAHost = true; - public bool AuthenticateWithServices = true; - - public SceneLoader SceneLoader => m_SceneLoader; - private SceneLoader m_SceneLoader; - - [HideInInspector] - [SerializeField] - private int m_OriginalVSyncCount; - - private enum ConnectionStates - { - None, - Connecting, - Connected, - } - - public bool IsConnectedToSession => m_ConnectionState == ConnectionStates.Connected; - - private ConnectionStates m_ConnectionState; - - [SerializeField] - private bool m_ServicesRegistered; - - [HideInInspector] - [SerializeField] - private bool m_UsingHybridSpawning; - - private ISession m_CurrentSession; - private string m_SessionName; - private string m_ProfileName; - private Task m_SessionTask; - [Range(0.1f, 10.0f)] - public float GravityMultiplier = 3.0f; - private float m_CurrentGravityMultiplier = 0.0f; - private Vector3 StandardGravity = new Vector3(0.0f, -9.81f, 0.0f); - #endregion - - #region Application Exit - public static Action OnExiting; - - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] - private static void OnInitialize() - { -#if UNITY_EDITOR - EditorApplication.playModeStateChanged += PlayModeStateChanged; -#else - Application.wantsToQuit += Application_wantsToQuit; -#endif - } - - -#if UNITY_EDITOR - private static void PlayModeStateChanged(PlayModeStateChange state) - { - if (state == PlayModeStateChange.ExitingPlayMode) - { - OnExiting?.Invoke(); - } - } -#else - private static bool Application_wantsToQuit() - { - OnExiting?.Invoke(); - return true; - } -#endif - #endregion - - #region NetStats Monitor - -#if MULTIPLAYER_TOOLS - [Tooltip("Assign an in-scene placed net stats monitor prefab here for it to be available to other components.")] - public RuntimeNetStatsMonitor NetStatsMonitor; -#endif - public void ToggleNetStatsMonitor(bool disable = false) - { -#if MULTIPLAYER_TOOLS - if (NetStatsMonitor) - { - if (!NetworkConfig.NetworkMessageMetrics) - { - var checkForBuiltIn = false; - var defaultMetrics = Enum.GetNames(typeof(Unity.Multiplayer.Tools.MetricTypes.DirectedMetricType)); - foreach (var elementConfig in NetStatsMonitor.Configuration.DisplayElements) - { - foreach (var stats in elementConfig.Stats) - { - if (defaultMetrics.Contains(stats.ToString())) - { - checkForBuiltIn = true; - break; - } - } - if (checkForBuiltIn) - { - break; - } - } - - // Log a warning if the messaging metrics is disabled - if (checkForBuiltIn) - { - Debug.LogWarning($"{nameof(NetworkManager)}'s {nameof(NetworkConfig.NetworkMessageMetrics)} property is not enabled. The default Built-In Metrics use {nameof(NetworkConfig.NetworkMessageMetrics)} and {nameof(NetStatsMonitor)} not be populates with values!"); - } - } - if (disable) - { - NetStatsMonitor.Visible = false; - } - else - { - NetStatsMonitor.Visible = !NetStatsMonitor.Visible; - } - - } -#else - Debug.LogWarning($"The multiplayer tools package is not installed!"); -#endif - } - #endregion - - #region Tracking Pool System Loading - - public ProgressFill ProgressBar; - public bool ByPassPoolLoading = false; - - - private Dictionary m_PoolSystemsLoading = new Dictionary(); - - /// - /// Used by ObjectPoolSystem to visually track the progress of instantiating its object pool - /// - public void TrackPoolSystemLoading(ObjectPoolSystem poolSystem, float progress, bool isLoading = true) - { - if (isLoading) - { - if (!m_PoolSystemsLoading.ContainsKey(poolSystem)) - { - m_PoolSystemsLoading.Add(poolSystem, progress); - } - else - { - m_PoolSystemsLoading[poolSystem] = progress; - } - } - else - { - m_PoolSystemsLoading.Remove(poolSystem); - } - } - - private void UpdateProgress() - { - if (ByPassPoolLoading) - { - return; - } - - var totalProgress = 0.0f; - foreach (var poolSystem in m_PoolSystemsLoading) - { - totalProgress += poolSystem.Value; - } - totalProgress = totalProgress / m_PoolSystemsLoading.Count; - ProgressBar.UpdateProgress(totalProgress); - if (totalProgress >= 1.0f) - { - m_PoolSystemsLoading.Clear(); - } - } - #endregion - - #region Initialization and Destroy - public static string GetRandomString(int length) - { - var r = new System.Random(); - return new string(Enumerable.Range(0, length).Select(_ => (char)r.Next('a', 'z')).ToArray()); - } - - public void SetFrameRate(int targetFrameRate, bool enableVsync) - { - Application.targetFrameRate = targetFrameRate; - QualitySettings.vSyncCount = enableVsync ? m_OriginalVSyncCount : 0; - } - - private async void Start() - { -#if UNITY_EDITOR - - if (!EditorApplication.isPlaying) - { - CheckServiceStatus(); - } -#endif - Screen.SetResolution((int)(Screen.currentResolution.width * 0.40f), (int)(Screen.currentResolution.height * 0.40f), FullScreenMode.Windowed); - SetFrameRate(TargetFrameRate, EnableVSync); - SetSingleton(); - m_SceneLoader = GetComponent(); - - OnClientConnectedCallback += OnClientConnected; - OnClientDisconnectCallback += OnClientDisconnect; - OnConnectionEvent += OnClientConnectionEvent; - try - { - // Check to see if the project has been registered with an organization before trying to sign in - if (m_ServicesRegistered && AuthenticateWithServices) - { - if (UnityServices.Instance != null && UnityServices.Instance.State != ServicesInitializationState.Initialized) - { - await UnityServices.InitializeAsync(); - } - if (!AuthenticationService.Instance.IsSignedIn) - { - AuthenticationService.Instance.SignInFailed += SignInFailed; - AuthenticationService.Instance.SignedIn += SignedIn; - if (string.IsNullOrEmpty(m_ProfileName)) - { - m_ProfileName = GetRandomString(5); - } - AuthenticationService.Instance.SwitchProfile(m_ProfileName); - await AuthenticationService.Instance.SignInAnonymouslyAsync(); - } - } - } - catch (Exception ex) - { - LogMessage($"This project might need to be registered with your services account.\n{ex.Message}\n{ex.StackTrace}"); - } - - // Handle bootstrap loading the main menu into main menu - // NOTE: A common issue is when you place the NetworkManager within the same "primary" scene to - // load. Using the bootstrap approach, the 1st scene loaded is the bootstrap scene that - // contains the NetworkManager and it is never reloaded for that application instance lifespan. - if (m_SceneLoader) - { - m_SceneLoader.LoadMainMenu(); - } - } - - private void OnDestroy() - { - OnClientConnectedCallback -= OnClientConnected; - OnClientDisconnectCallback -= OnClientDisconnect; - OnConnectionEvent -= OnClientConnectionEvent; - } - #endregion - - #region Session and Connection Event Handling - public Action OnShuttingDown; - - /// - /// Server and Clients all invoke this method - /// - private void OnClientConnectionEvent(NetworkManager networkManager, ConnectionEventData eventData) - { - LogMessage($"Connection event {eventData.EventType} for Client-{eventData.ClientId}."); - if (eventData.ClientId != LocalClientId) - { - return; - } - - switch (eventData.EventType) - { - case ConnectionEvent.ClientConnected: - { - m_ConnectionState = ConnectionStates.Connected; - break; - } - case ConnectionEvent.ClientDisconnected: - { - m_ConnectionState = ConnectionStates.None; - break; - } - } - } - - private void OnClientConnected(ulong clientId) - { - LogMessage($"Connected event invoked for Client-{clientId}."); - } - - private void OnClientDisconnect(ulong clientId) - { - LogMessage($"Disconnected event invoked for Client-{clientId}."); - } - - private void SignedIn() - { - AuthenticationService.Instance.SignedIn -= SignedIn; - Debug.Log($"Signed in anonymously with profile {m_ProfileName}"); - } - - private void SignInFailed(RequestFailedException error) - { - AuthenticationService.Instance.SignInFailed -= SignInFailed; - Debug.LogError($"Failed to sign in {m_ProfileName} anonymously: {error}"); - } - - private void SessionStarted() - { - - if (GravityMultiplier != m_CurrentGravityMultiplier) - { - m_CurrentGravityMultiplier = GravityMultiplier; - Physics.gravity = StandardGravity * m_CurrentGravityMultiplier; - } - - OnClientStarted -= SessionStarted; - m_ConnectionState = IsServer && !IsHost ? ConnectionStates.Connected : ConnectionStates.Connecting; - if (IsServer) - { - LogMessage($"Server started session."); - } - else - { - LogMessage($"Client connecting to session."); - } - if (DistributedAuthorityMode && (CMBServiceConnection || !DAHost)) - { - m_SceneLoader.DAClientStarted(); - } - } - - private void SessionStopped(bool isHost) - { - LogMessage($"NetworkManager has stopped."); - OnClientStopped -= SessionStopped; - m_ConnectionState = ConnectionStates.None; - } - - private async Task ConnectThroughLiveService() - { - try - { - var options = new SessionOptions() - { - Name = m_SessionName, - MaxPlayers = 32 - }.WithDistributedAuthorityNetwork(); - - m_CurrentSession = await MultiplayerService.Instance.CreateOrJoinSessionAsync(m_SessionName, options); - return m_CurrentSession; - } - catch (Exception e) - { - LogMessage($"{e.Message}"); - Debug.LogException(e); - } - return null; - } - #endregion - - #region GUI Menu - public void StartOrConnectToDistributedAuthoritySession() - { - m_SessionTask = ConnectThroughLiveService(); - m_ConnectionState = ConnectionStates.Connecting; - LogMessage($"Connecting to session {m_SessionName}..."); - } - - private void OnUpdateGUIDisconnected() - { - GUILayout.BeginArea(new Rect(10, 10, 300, 800)); - - if (NetworkConfig.NetworkTopology == NetworkTopologyTypes.DistributedAuthority) - { - if (!m_ServicesRegistered && AuthenticateWithServices) - { - GUILayout.Label("Project-Settings:Services-General-Settings is not configured."); - GUILayout.Label("Distributed authority requires project to be registered with your organization's services account for authentication purposes."); - } - else - { - if (UseDAHost) - { - if (GUILayout.Button("Start DAHost")) - { - OnServerStopped += SessionStopped; - OnServerStarted += SessionStarted; - StartHost(); - } - else - if (GUILayout.Button("Start DAClient")) - { - OnClientStopped += SessionStopped; - OnClientStarted += SessionStarted; - StartClient(); - } - } - else - { - if (AuthenticateWithServices) - { - m_SessionName = GUILayout.TextField(m_SessionName); - if (GUILayout.Button("Create or Connect To Session")) - { - NetworkConfig.UseCMBService = true; - OnClientStopped += SessionStopped; - OnClientStarted += SessionStarted; - StartOrConnectToDistributedAuthoritySession(); - } - } - else - { - if (GUILayout.Button("Connect To Local Service")) - { - NetworkConfig.UseCMBService = true; - OnClientStopped += SessionStopped; - OnClientStarted += SessionStarted; - StartClient(); - } - } - } - } - } - else - { - if (m_UsingHybridSpawning) - { - if (GUILayout.Button("Hybrid-Host")) - { - OnServerStopped += SessionStopped; - OnServerStarted += SessionStarted; - StartHost(); - } - - if (GUILayout.Button("Hybrid-Client")) - { - OnClientStopped += SessionStopped; - OnClientStarted += SessionStarted; - StartClient(); - } - } - else - { - if (GUILayout.Button("Start Server")) - { - OnServerStopped += SessionStopped; - OnServerStarted += SessionStarted; - StartServer(); - } - else - if (GUILayout.Button("Start Host")) - { - OnServerStopped += SessionStopped; - OnServerStarted += SessionStarted; - StartHost(); - } - else - if (GUILayout.Button("Start Client")) - { - OnClientStopped += SessionStopped; - OnClientStarted += SessionStarted; - StartClient(); - } - } - } - GUILayout.EndArea(); - } - - public string CustomHeader; - - public Func OnConnectedGUIUpdate; - - private int OnUpdateGUIConnected(int yAxisOffset) - { - #region Left side - GUILayout.BeginArea(new Rect(10, 10, 800, 800)); - if (CMBServiceConnection) - { - GUILayout.Label($"Distributed Authority Session: {m_SessionName}"); - if (LocalClient.IsSessionOwner) - { - GUILayout.Label("[Session Owner]"); - yAxisOffset += 20; - } - } - else - { - if (m_UsingHybridSpawning) - { - GUILayout.Label($"NGO & N4E Client-Server Hybrid Session"); - } - else - { - GUILayout.Label($"Client-Server Session"); - } - } - if (!string.IsNullOrEmpty(CustomHeader)) - { - GUILayout.Label($"{CustomHeader}"); - } - - yAxisOffset = OnConnectedGUIUpdate?.Invoke(yAxisOffset) ?? yAxisOffset; - GUILayout.EndArea(); - #endregion - - #region Right side - GUILayout.BeginArea(new Rect(Display.main.renderingWidth - 230, 10, 220, 300)); - var endSessionText = IsServer && !DistributedAuthorityMode ? "Shutdown" : "Disconnect"; - if (GUILayout.Button(endSessionText)) - { - OnShuttingDown?.Invoke(); - if (m_CurrentSession != null && m_CurrentSession.State == SessionState.Connected) - { - m_CurrentSession.LeaveAsync(); - m_CurrentSession = null; - } - else - { - Shutdown(); - } - } - if (m_SceneLoader && !m_SceneLoader.SceneLoadingInProgress) - { - GUILayout.Label($"Current Scene: {UnityEngine.SceneManagement.SceneManager.GetActiveScene().name}"); - var currentPlayerPrefab = m_SceneLoader.GetCurrentPrefabName(); - if (!string.IsNullOrEmpty(currentPlayerPrefab)) - { - GUILayout.Label($"Current player-prefab: {currentPlayerPrefab}"); - } - if (IsSessionAuthority()) - { - var currentSceneEntry = m_SceneLoader.CurrentSceneEntry; - if (currentSceneEntry != null) - { - var nextPlayerPrefab = m_SceneLoader.GetNextPrefabName(); - var nextScene = $"Load {m_SceneLoader.GetNextSceneName()}"; - var buttontext = string.IsNullOrEmpty(nextPlayerPrefab) ? nextScene : $"{nextScene}\nusing {nextPlayerPrefab}"; - if (GUILayout.Button(buttontext)) - { - m_SceneLoader.LoadNextScene(); - } - } - } - } - GUILayout.EndArea(); - #endregion - return yAxisOffset; - } - - private void OnGUI() - { - var yAxisOffset = 10; - switch (m_ConnectionState) - { - case ConnectionStates.None: - { - yAxisOffset = 80; - OnUpdateGUIDisconnected(); - break; - } - case ConnectionStates.Connected: - { - yAxisOffset = OnUpdateGUIConnected(40); - break; - } - } - - GUILayout.BeginArea(new Rect(10, yAxisOffset, 800, 800)); - if (m_MessageLogs.Count > 0) - { - GUILayout.Label("-----------(Log)-----------"); - // Display any messages logged to screen - foreach (var messageLog in m_MessageLogs) - { - GUILayout.Label(messageLog.Message); - } - GUILayout.Label("---------------------------"); - } - GUILayout.EndArea(); - } - #endregion - - #region Update and Status Methods - private void UpdateRuntimeMessageConsole() - { - if (m_MessageLogs.Count == 0) - { - return; - } - - for (int i = m_MessageLogs.Count - 1; i >= 0; i--) - { - if (m_MessageLogs[i].ExpirationTime < Time.realtimeSinceStartup) - { - m_MessageLogs.RemoveAt(i); - } - } - } - - public bool IsSessionAuthority() - { - if (!DistributedAuthorityMode) - { - return IsServer; - } - else - { - return LocalClientId == CurrentSessionOwner; - } - } - - /// - /// Invoked when a network session is active - /// - private void ConnectedUpdate() - { - UpdateRuntimeMessageConsole(); - } - - /// - /// Invoked when no network session is active - /// - private void DisconnectedUpdate() - { - if (m_PoolSystemsLoading.Count > 0) - { - UpdateProgress(); - } - } - - private void Update() - { - if (IsConnectedToSession) - { - ConnectedUpdate(); - } - else - { - DisconnectedUpdate(); - } - } - #endregion - - #region Message Logging - - private List m_MessageLogs = new List(); - - private class MessageLog - { - public string Message { get; private set; } - public float ExpirationTime { get; private set; } - - public MessageLog(string msg, float timeToLive) - { - Message = msg; - ExpirationTime = Time.realtimeSinceStartup + timeToLive; - } - } - - public void LogMessage(string msg, float timeToLive = 10.0f) - { - msg = $"[{Time.realtimeSinceStartup}] {msg}"; - if (m_MessageLogs.Count > 0) - { - m_MessageLogs.Insert(0, new MessageLog(msg, timeToLive)); - } - else - { - m_MessageLogs.Add(new MessageLog(msg, timeToLive)); - } - Debug.Log(msg); - } - #endregion - - public ExtendedNetworkManager() - { - Instance = this; - } -} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta deleted file mode 100644 index 9dfbaf5568..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ExtendedNetworkManager.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 3b9b9fa03bea2a7469cf28788bef1223 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs deleted file mode 100644 index a3521c374c..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs +++ /dev/null @@ -1,443 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using Unity.Netcode; -using Unity.Netcode.Components; -using UnityEngine; -using UnityEngine.SceneManagement; - -#if UNITY_EDITOR -using UnityEditor; -using Unity.Netcode.Editor; -/// -/// The custom editor for the component. -/// -[CustomEditor(typeof(ObjectPoolSystem), true)] -public class ObjectPoolSystemEditor : NetcodeEditorBase -{ - private SerializedProperty m_NetworkPrefab; - private SerializedProperty m_ObjectPoolSize; - private SerializedProperty m_PoolInSystemScene; - private SerializedProperty m_UsePoolForSpawn; - private SerializedProperty m_DontDestroyOnSceneUnload; - private SerializedProperty m_ExtendedProperties; - private SerializedProperty m_UseUnreliableDeltas; - private SerializedProperty m_DebugHandlerDestroy; - private SerializedProperty m_EnableTransformOverrides; - private SerializedProperty m_HalfFloat; - private SerializedProperty m_QuaternionSynchronization; - private SerializedProperty m_QuaternionCompression; - private SerializedProperty m_Interpolate; - - public override void OnEnable() - { - m_NetworkPrefab = serializedObject.FindProperty(nameof(ObjectPoolSystem.NetworkPrefab)); - m_ObjectPoolSize = serializedObject.FindProperty(nameof(ObjectPoolSystem.ObjectPoolSize)); - m_PoolInSystemScene = serializedObject.FindProperty(nameof(ObjectPoolSystem.PoolInSystemScene)); - m_UsePoolForSpawn = serializedObject.FindProperty(nameof(ObjectPoolSystem.UsePoolForSpawn)); - m_DontDestroyOnSceneUnload = serializedObject.FindProperty(nameof(ObjectPoolSystem.DontDestroyOnSceneUnload)); - m_ExtendedProperties = serializedObject.FindProperty(nameof(ObjectPoolSystem.ExtendedProperties)); - m_UseUnreliableDeltas = serializedObject.FindProperty(nameof(ObjectPoolSystem.UseUnreliableDeltas)); - m_DebugHandlerDestroy = serializedObject.FindProperty(nameof(ObjectPoolSystem.DebugHandlerDestroy)); - m_EnableTransformOverrides = serializedObject.FindProperty(nameof(ObjectPoolSystem.EnableTransformOverrides)); - m_HalfFloat = serializedObject.FindProperty(nameof(ObjectPoolSystem.HalfFloat)); - m_QuaternionSynchronization = serializedObject.FindProperty(nameof(ObjectPoolSystem.QuaternionSynchronization)); - m_QuaternionCompression = serializedObject.FindProperty(nameof(ObjectPoolSystem.QuaternionCompression)); - m_Interpolate = serializedObject.FindProperty(nameof(ObjectPoolSystem.Interpolate)); - base.OnEnable(); - } - - private void DisplayObjectPoolSystemProperties() - { - var objectPoolSystem = target as ObjectPoolSystem; - EditorGUILayout.PropertyField(m_NetworkPrefab); - EditorGUILayout.PropertyField(m_ObjectPoolSize); - EditorGUILayout.PropertyField(m_PoolInSystemScene); - EditorGUILayout.PropertyField(m_UsePoolForSpawn); - EditorGUILayout.PropertyField(m_DontDestroyOnSceneUnload); - EditorGUILayout.PropertyField(m_ExtendedProperties); - if (objectPoolSystem.ExtendedProperties) - { - EditorGUILayout.PropertyField(m_UseUnreliableDeltas); - EditorGUILayout.PropertyField(m_DebugHandlerDestroy); - // Once the prefab is assigned - if (objectPoolSystem.NetworkPrefab) - { - // Check to see if it has a NetworkTransform (or derived from) component - var networkTransform = objectPoolSystem.NetworkPrefab.GetComponent(); - if (networkTransform) - { - // If so, then provide additional options - EditorGUILayout.PropertyField(m_EnableTransformOverrides); - if (objectPoolSystem.EnableTransformOverrides) - { - EditorGUILayout.PropertyField(m_HalfFloat); - EditorGUILayout.PropertyField(m_QuaternionSynchronization); - EditorGUILayout.PropertyField(m_QuaternionCompression); - EditorGUILayout.PropertyField(m_Interpolate); - } - } - } - } - } - - public override void OnInspectorGUI() - { - var objectPoolSystem = target as ObjectPoolSystem; - void SetExpanded(bool expanded) { objectPoolSystem.ObjectPoolSystemPropertiesVisible = expanded; }; - DrawFoldOutGroup(objectPoolSystem.GetType(), DisplayObjectPoolSystemProperties, objectPoolSystem.ObjectPoolSystemPropertiesVisible, SetExpanded); - base.OnInspectorGUI(); - } -} -#endif - -public interface IPoolSystemTracker -{ - void TrackPoolSystemLoading(ObjectPoolSystem poolSystem, float progress, bool isLoading = true); -} - -/// -/// Generic NetworkObject pool system used throughout the demo. -/// -public class ObjectPoolSystem : MonoBehaviour, INetworkPrefabInstanceHandler -{ -#if UNITY_EDITOR - public bool ObjectPoolSystemPropertiesVisible = false; -#endif - - public static Dictionary ExistingPoolSystems = new Dictionary(); - - private static List s_PoolSystemTrackers = new List(); - - public static void PoolSystemTrackerRegistration(IPoolSystemTracker tracker, bool register = true) - { - if (register) - { - if (!s_PoolSystemTrackers.Contains(tracker)) - { - s_PoolSystemTrackers.Add(tracker); - } - } - else - { - s_PoolSystemTrackers.Remove(tracker); - } - } - - private void UpdatePoolSystemTrackers(ObjectPoolSystem poolSystem, float progress, bool isLoading = true) - { - foreach (var tracker in s_PoolSystemTrackers) - { - tracker.TrackPoolSystemLoading(poolSystem, progress, isLoading); - } - } - - public static ObjectPoolSystem GetPoolSystem(GameObject gameObject) - { - if (ExistingPoolSystems.ContainsKey(gameObject)) - { - return ExistingPoolSystems[gameObject]; - } - return null; - } - - [Tooltip("The network prefab to pool.")] - public GameObject NetworkPrefab; - - [Tooltip("How many instances of the network prefab you want available")] - public int ObjectPoolSize; - - [Tooltip("For organization purposes: when true, non-spawned instances will be migrated to the object pool's scene. (default is true)")] - public bool PoolInSystemScene = true; - - [Tooltip("When enabled, the pool will be used to spawn/recylce NetworkObjects")] - public bool UsePoolForSpawn = true; - - [Tooltip("Enable this to persist the pool objects between sessions (after first load, the pool is pre-loaded).")] - public bool DontDestroyOnSceneUnload = false; - - [Tooltip("When true, an additional set of properties will be available that you can globally set on all pool object instances.")] - public bool ExtendedProperties = false; - - [Tooltip("When true, the spawned objects will be configured to use unreliable deltas. Use this option to prevent stutter if packets are dropped due to poor network conditions.")] - public bool UseUnreliableDeltas = true; - - [Tooltip("When true, debug info will be logged about when objects are despawned and returned to the pool.")] - public bool DebugHandlerDestroy = false; - - [Tooltip("When enabled, this will expose more transform settings are applied to all spawned NetworkObjects.")] - public bool EnableTransformOverrides; - [Tooltip("Enables half float precision.")] - public bool HalfFloat; - [Tooltip("Enables quaternion synchronization.")] - public bool QuaternionSynchronization; - [Tooltip("Enables quaternion compression.")] - public bool QuaternionCompression; - [Tooltip("Enables interpolation.")] - public bool Interpolate; - - [Tooltip("When enabled, this pool will rebuild itself each time it is initialized upon loading a scene.")] - public bool ForceRebuildPool; - - private Stack m_AvailableObjects = new Stack(); - - /// - /// When a pooled object's state changes (active to not-active in the scene hierarchy), this method is invoked. - /// - private void HandleInstanceStateChange(GameObject instance, bool isSpawning = false) - { - if (PoolInSystemScene) - { - if (!isSpawning) - { - if (instance.transform.parent != null) - { - instance.transform.SetParent(null); - } - if (gameObject.scene.IsValid()) - { - SceneManager.MoveGameObjectToScene(instance, gameObject.scene); - } - } - else - { - SceneManager.MoveGameObjectToScene(instance, SceneManager.GetActiveScene()); - } - } - instance.SetActive(isSpawning); - } - - private void Start() - { - ExtendedNetworkManager.OnExiting += OnExiting; - if (ForceRebuildPool && ExistingPoolSystems.ContainsKey(NetworkPrefab)) - { - NetworkManager.Singleton.OnClientStopped += OnClientStopped; - CleanOutPool(); - } - Initialize(); - } - - private void Initialize() - { - if (!ExistingPoolSystems.ContainsKey(NetworkPrefab)) - { - NetworkManager.Singleton.PrefabHandler.AddHandler(NetworkPrefab, this); - ExistingPoolSystems.Add(NetworkPrefab, this); - if (DontDestroyOnSceneUnload) - { - DontDestroyOnLoad(gameObject); - } - StartCoroutine(CreatePrefabPool()); - } - else - { - // This is registers the prefab handler with NetworkManager - NetworkManager.Singleton.PrefabHandler.AddHandler(NetworkPrefab, ExistingPoolSystems[NetworkPrefab]); - - // This provides the mechanism that tracks the status of the object pool instance when first instantiating all objects. - ExtendedNetworkManager.Instance.TrackPoolSystemLoading(ExistingPoolSystems[NetworkPrefab], 1.0f); - if (DontDestroyOnSceneUnload) - { - Destroy(gameObject); - } - } - } - - private void OnDestroy() - { - if ((ForceRebuildPool || !DontDestroyOnSceneUnload) && ExistingPoolSystems.ContainsKey(NetworkPrefab)) - { - CleanOutPool(); - } - } - - private void OnClientStarted() - { - NetworkManager.Singleton.OnClientStopped += OnClientStopped; - } - - private void OnExiting() - { - ExtendedNetworkManager.OnExiting -= OnExiting; - if (ExistingPoolSystems.ContainsKey(NetworkPrefab)) - { - if (ExtendedNetworkManager.Instance.IsListening) - { - ExtendedNetworkManager.Instance.PrefabHandler.RemoveHandler(NetworkPrefab); - CleanOutPool(); - } - } - } - - private void OnClientStopped(bool obj) - { - NetworkManager.Singleton.OnClientStopped -= OnClientStopped; - NetworkManager.Singleton.OnClientStarted += OnClientStarted; - if (ForceRebuildPool && ExistingPoolSystems.ContainsKey(NetworkPrefab)) - { - NetworkManager.Singleton.PrefabHandler.RemoveHandler(NetworkPrefab); - CleanOutPool(); - Initialize(); - } - } - - - /// - /// Coroutine that instantiates all of the objects over time - /// - private IEnumerator CreatePrefabPool() - { - var splitCount = (int)ObjectPoolSize * 0.1f; - - while (m_AvailableObjects.Count < ObjectPoolSize) - { - for (int i = 0; i < splitCount; i++) - { - var instance = Instantiate(NetworkPrefab); - instance.name = instance.name.Replace("(Clone)", ""); - instance.name += $"_{m_AvailableObjects.Count}"; - HandleInstanceStateChange(instance); - var networkObject = instance.GetComponent(); - networkObject.SetSceneObjectStatus(); - if (ExtendedProperties) - { - var networkTransforms = instance.GetComponentsInChildren(); - foreach (var networkTransform in networkTransforms) - { - networkTransform.UseUnreliableDeltas = UseUnreliableDeltas; - if (networkTransform != null && EnableTransformOverrides) - { - networkTransform.UseHalfFloatPrecision = HalfFloat; - networkTransform.UseQuaternionSynchronization = QuaternionSynchronization; - networkTransform.UseQuaternionCompression = QuaternionCompression; - networkTransform.Interpolate = Interpolate; - } - } - } - - m_AvailableObjects.Push(networkObject); - // When not being used, parent under the pool system to make heirarchy browsing easier - // Turn off AutoObjectParentSync to avoid any errors with parenting - networkObject.AutoObjectParentSync = false; - instance.transform.parent = transform; - if (m_AvailableObjects.Count >= ObjectPoolSize) - { - break; - } - UpdatePoolSystemTrackers(this, m_AvailableObjects.Count / (float)ObjectPoolSize); - } - yield return null; - } - UpdatePoolSystemTrackers(this, m_AvailableObjects.Count / (float)ObjectPoolSize); - } - - private void CleanOutPool() - { - foreach (var poolObject in m_AvailableObjects) - { - if (poolObject != null && poolObject.gameObject != null) - { - Destroy(poolObject.gameObject); - } - } - - m_AvailableObjects.Clear(); - ExistingPoolSystems.Remove(NetworkPrefab); - } - - /// - /// The owner will use this method to pull already existing objects from the pool - /// - - public NetworkObject GetInstance(bool isSpawningLocally = false) - { - var returnValue = (NetworkObject)null; - - if (m_AvailableObjects.TryPop(out NetworkObject instance)) - { - // When being used, remove the parent and turn AutoObjectParentSync back on again - instance.transform.parent = null; - instance.AutoObjectParentSync = true; - HandleInstanceStateChange(instance.gameObject, true); - instance.DeferredDespawnTick = 0; - returnValue = instance; - } - else - { - if (NetworkManager.Singleton.LogLevel >= LogLevel.Developer) - { - NetworkLog.LogWarningServer($"[Object Pool ({name}) Exhausted] Instantiating new instances during network session!"); - } - returnValue = Instantiate(NetworkPrefab).GetComponent(); - returnValue.gameObject.name += "_NP"; - } - - if (isSpawningLocally) - { - var networkTransform = returnValue.GetComponent(); - if (networkTransform != null && EnableTransformOverrides) - { - networkTransform.UseHalfFloatPrecision = HalfFloat; - networkTransform.UseQuaternionSynchronization = QuaternionSynchronization; - networkTransform.UseQuaternionCompression = QuaternionCompression; - networkTransform.Interpolate = Interpolate; - } - } - return returnValue; - } - - /// - /// Non-owners will have this method called when the object is spawned on their side. - /// - /// the object instance to spawn locally - public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation) - { - var instance = GetInstance(!NetworkManager.Singleton.DistributedAuthorityMode && NetworkManager.Singleton.LocalClientId == ownerClientId); - instance.transform.position = position; - instance.transform.rotation = rotation; - return instance; - } - - - - /// - /// Invoked when a spawned object from the pool is despawned and destroyed - /// - public void Destroy(NetworkObject networkObject) - { - if (networkObject.gameObject.name.Contains("_NP")) - { - Destroy(networkObject.gameObject); - } - else - { - if (!DebugHandlerDestroy) - { - HandleInstanceStateChange(networkObject.gameObject); - m_AvailableObjects.Push(networkObject); - } - else - { - if (networkObject.IsSpawned) - { - Debug.LogError($"[{networkObject.name}] Is still spawned but is being put back into pool!"); - } - if (!m_AvailableObjects.Contains(networkObject)) - { - HandleInstanceStateChange(networkObject.gameObject); - m_AvailableObjects.Push(networkObject); - } - else - { - Debug.LogError($"[ObjectPoolSystem] PrefabHandler invoked twice for {networkObject.name}!"); - } - } - networkObject.transform.position = Vector3.zero; - networkObject.transform.rotation = Quaternion.identity; - // When not being used, parent under the pool system to make heirarchy browsing easier - // Turn off AutoObjectParentSync to avoid any errors with parenting - networkObject.AutoObjectParentSync = false; - networkObject.transform.parent = transform; - } - } -} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta deleted file mode 100644 index 0f1e653c04..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ObjectPoolSystem.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4c75fe3e1fafc3f4bb958a66c245cdc5 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs deleted file mode 100644 index b3992ea4e8..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs +++ /dev/null @@ -1,22 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - -public class ProgressFill : MonoBehaviour -{ - private Image Progress; - - private void Start() - { - Progress = GetComponent(); - Progress.fillAmount = 0; - } - - public void UpdateProgress(float progress) - { - Progress.fillAmount = progress; - if (progress >= 1.0f && transform.parent != null) - { - transform.parent.gameObject.SetActive(false); - } - } -} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta deleted file mode 100644 index 0dd84e136e..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/ProgressFill.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 409ac761620f58245aed31ff8f84e7b1 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs deleted file mode 100644 index 8f54b4af7f..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs +++ /dev/null @@ -1,599 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using Unity.Netcode; -#if UNITY_EDITOR -using UnityEditor; -#endif -using UnityEngine; -using UnityEngine.SceneManagement; -using static Unity.VectorGraphics.SVGParser; - -public class SceneLoader : MonoBehaviour -{ -#if UNITY_EDITOR - public SceneAsset MainMenu; - - [Serializable] - public class SceneEntryEditor - { - public SceneAsset Scene; - public List PlayerPrefabs; - } - private List m_SceneNames = new List(); - public List NetworkScenesToLoad; - private void OnValidate() - { - m_SceneEntryInfo.Clear(); - m_SceneNames.Clear(); - if (NetworkScenesToLoad != null) - { - foreach (SceneEntryEditor sceneEntryEditor in NetworkScenesToLoad) - { - if (sceneEntryEditor == null) - { - continue; - } - if (sceneEntryEditor.Scene == null) - { - continue; - } - if (m_SceneNames.Contains(sceneEntryEditor.Scene.name)) - { - sceneEntryEditor.Scene = null; - sceneEntryEditor.PlayerPrefabs?.Clear(); - continue; - } - - var sceneEntry = new SceneEntryInfo() - { - SceneToLoad = sceneEntryEditor.Scene.name, - PlayerPrefabs = new List(sceneEntryEditor.PlayerPrefabs), - }; - - m_SceneNames.Add(sceneEntryEditor.Scene.name); - m_SceneEntryInfo.Add(sceneEntry); - } - } - if (MainMenu) - { - m_MainMenuScene = MainMenu.name; - } - } -#endif - [Serializable] - public class SceneEntryInfo - { - // The scene name to load - public string SceneToLoad; - // The list of player prefabs to use. - // Each player prefab is used once per scene loaded event of SceneToLoad. - public List PlayerPrefabs; - } - - /// - /// Primary scene entry used to cycle through scenes and scenes with paired player prefabs - /// - public class SceneEntry - { - public SceneEntryInfo SceneInfo { get; private set; } - public string SceneName { get; private set; } - public string PlayerPrefabName { get; private set; } - public bool HasPlayerPrefab { get; private set; } - - /// - /// When true and once the associated scene has been loaded, - /// iterate to the next . - /// - public bool IsLastSceneLoad { get; private set; } - - // Defaults to no entries (-1) - private int m_PlayerPrefabIndex = -1; - - public NetworkObject GetCurrentPlayerPrefab() - { - if (!HasPlayerPrefab || m_PlayerPrefabIndex < 0) - { - return null; - } - - return SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex]; - } - - public NetworkObject GetPlayerPrefabFromGlobalObjectId(uint globalObjectId) - { - if (SceneInfo.PlayerPrefabs.Count == 0) - { - return null; - } - foreach (var prefab in SceneInfo.PlayerPrefabs) - { - if (prefab.PrefabIdHash == globalObjectId) - { - return prefab; - } - } - return null; - } - - /// - /// Returns the next player prefab to be used - /// - /// Either the player prefab or none. - public string GetNextPlayerPrefabName() - { - if (!HasPlayerPrefab) - { - return string.Empty; - } - - if ((m_PlayerPrefabIndex + 1) >= SceneInfo.PlayerPrefabs.Count) - { - return string.Empty; - } - - return SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex + 1].name; - } - - /// - /// Invoked every time the associated scene is loaded. - /// - public void SceneLoaded() - { - if (IsLastSceneLoad) - { - return; - } - UpdatePlayerPrefabIndex(); - } - - /// - /// Resets this entry to be re-used again. - /// - public void Reset() - { - m_PlayerPrefabIndex = -1; - IsLastSceneLoad = false; - if (SceneInfo.PlayerPrefabs.Count > 0) - { - PlayerPrefabName = SceneInfo.PlayerPrefabs[0].name; - } - } - - private void UpdatePlayerPrefabIndex() - { - if (!HasPlayerPrefab) - { - IsLastSceneLoad = true; - } - - m_PlayerPrefabIndex++; - PlayerPrefabName = SceneInfo.PlayerPrefabs[m_PlayerPrefabIndex].name; - IsLastSceneLoad = (m_PlayerPrefabIndex + 1) >= SceneInfo.PlayerPrefabs.Count; - } - - public SceneEntry(SceneEntryInfo sceneEntryInfo) - { - SceneInfo = sceneEntryInfo; - HasPlayerPrefab = SceneInfo.PlayerPrefabs != null && SceneInfo.PlayerPrefabs.Count > 0; - SceneName = SceneInfo.SceneToLoad; - } - } - - public bool SceneLoadingInProgress { get; private set; } - - [HideInInspector] - [SerializeField] - private string m_MainMenuScene; - - private Dictionary m_SceneEntriesTable = new Dictionary(); - private List m_SceneEntries = new List(); - - - [HideInInspector] - [SerializeField] - private List m_SceneEntryInfo = new List(); - - - private ExtendedNetworkManager m_NetworkManager; - private Scene m_CurrentLoadedScene; - - private void Awake() - { - m_NetworkManager = GetComponent(); - } - - private void Start() - { - m_SceneEntriesTable.Clear(); - for (int i = 0; i < m_SceneEntryInfo.Count; i++) - { - var entry = m_SceneEntryInfo[i]; - var sceneEntry = new SceneEntry(m_SceneEntryInfo[i]); - m_SceneEntriesTable.Add(entry.SceneToLoad, i); - m_SceneEntries.Add(sceneEntry); - } - } - - private enum SceneLoaderState - { - PreLoading, - Loaded, - Synchronized - } - - public SceneEntry CurrentSceneEntry => GetCurrentSceneEntry(); - - private string m_PreviousSceneName; - private SceneEntry GetCurrentSceneEntry(bool usePrevious = false) - { - var sceneName = usePrevious ? m_PreviousSceneName : m_CurrentLoadedScene.name; - if (string.IsNullOrEmpty(sceneName)) - { - if (usePrevious && string.IsNullOrEmpty(sceneName)) - { - return null; - } - else if (!usePrevious) - { - return null; - } - } - if (!m_SceneEntriesTable.ContainsKey(sceneName)) - { - return null; - } - return m_SceneEntries[m_SceneEntriesTable[sceneName]]; - } - - /// - /// Handles scene entry progression and tracking. - /// - /// Type of update happening (i.e. what invoked it). - /// Only set when a client is synchronized to handle late joining clients. - private void UpdateCurrentScene(SceneLoaderState loaderState, ulong clientId = ulong.MaxValue) - { - var currentEntry = GetCurrentSceneEntry(true); - m_CurrentLoadedScene = SceneManager.GetActiveScene(); - m_PreviousSceneName = m_CurrentLoadedScene.name; - if (loaderState == SceneLoaderState.PreLoading || CurrentSceneEntry == null) - { - return; - } - - // Only switch to the next scene entry when the current one is considered complete - if (loaderState == SceneLoaderState.Loaded) - { - if (currentEntry != null && currentEntry != CurrentSceneEntry) - { - // Reset this scene entry for use next time aroujnd (i.e. round robin) - currentEntry.Reset(); - } - CurrentSceneEntry.SceneLoaded(); - } - - if (!m_NetworkManager.IsServer && !m_NetworkManager.DistributedAuthorityMode) - { - return; - } - - var playerPrefab = CurrentSceneEntry.GetCurrentPlayerPrefab(); - var isSynchronize = loaderState == SceneLoaderState.Synchronized; - var playerObject = (isSynchronize && clientId != ulong.MaxValue) ? m_NetworkManager.ConnectedClients[clientId].PlayerObject : m_NetworkManager.LocalClient.PlayerObject; - if (playerPrefab != null && (playerObject != null && playerObject.PrefabIdHash != playerPrefab.PrefabIdHash)) - { - if (m_NetworkManager.DistributedAuthorityMode) - { - m_NetworkManager.LocalClient.PlayerObject?.Despawn(); - m_NetworkManager.LocalClient.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, m_NetworkManager.LocalClientId, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); - } - else if (m_NetworkManager.IsServer) - { - if (loaderState == SceneLoaderState.Synchronized) - { - // Only if a client id is specified - if (clientId != ulong.MaxValue) - { - // Spawn the player prefab specific to this SceneEntry loaded state - var synchronizedClient = m_NetworkManager.ConnectedClients[clientId]; - synchronizedClient.PlayerObject?.Despawn(true); - synchronizedClient.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, clientId, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); - } - } - else - if (loaderState == SceneLoaderState.Loaded) - { - // Spawn new player prefabs for all connected clients - foreach (var connectedClient in m_NetworkManager.ConnectedClients) - { - connectedClient.Value.PlayerObject?.Despawn(true); - connectedClient.Value.PlayerObject = NetworkObject.InstantiateAndSpawn(playerPrefab.gameObject, m_NetworkManager, connectedClient.Key, false, true, false, playerPrefab.transform.position, playerPrefab.transform.rotation); - } - } - } - } - } - - /// - /// Invoked when the NetworkManager is started - /// - private void OnStarted() - { - m_NetworkManager.OnClientStarted -= ClientStarted; - m_NetworkManager.OnServerStarted -= ServerStarted; - m_NetworkManager.OnServerStopped += OnServerStopped; - m_NetworkManager.OnClientStopped += OnClientStopped; - m_NetworkManager.SceneManager.OnSynchronizeComplete += OnSynchronizeComplete; - if (m_NetworkManager.DistributedAuthorityMode || m_NetworkManager.IsServer) - { - m_NetworkManager.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted; - } - else - { - m_NetworkManager.SceneManager.OnLoadComplete += OnLoadComplete; - } - - // Session authority is either the server or session owner - if (m_NetworkManager.IsSessionAuthority()) - { - LoadNextScene(); - } - } - - /// - /// Invoked by clients - /// - private void OnLoadComplete(ulong clientId, string sceneName, LoadSceneMode loadSceneMode) - { - if (m_NetworkManager.IsServer) - { - Debug.LogError("Server should never be invoking this!!!"); - return; - } - UpdateCurrentScene(SceneLoaderState.Loaded); - - - m_NetworkManager.LogMessage($"Scene loading event for {sceneName} completed!"); - } - - /// - /// Invoked by the server or da clients - /// - private void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List clientsCompleted, List clientsTimedOut) - { - SceneLoadingInProgress = false; - UpdateCurrentScene(SceneLoaderState.Loaded); - var completed = string.Join(",", clientsCompleted); - var timedOut = string.Join(",", clientsTimedOut); - m_NetworkManager.LogMessage($"Scene loading event for {sceneName} completed!\n Client ids that completed event ({completed}) \n Client ids that timed out ({timedOut})"); - } - - /// - /// Handle spawning the correct player prefab for this scene - /// - /// - private void OnSynchronizeComplete(ulong clientId) - { - m_NetworkManager.LogMessage($"Client-{clientId} synchronization completed."); - - // TODO (Fix me?): This won't work for distributed authority - if (!m_NetworkManager.IsServer) - { - return; - } - UpdateCurrentScene(SceneLoaderState.Synchronized, clientId); - } - - public void DAClientStarted() - { - // Use additive client synchronization. - m_NetworkManager.SceneManager.SetClientSynchronizationMode(LoadSceneMode.Additive); - // Unload any scenes not used once the client has finished synchronizing. - m_NetworkManager.SceneManager.PostSynchronizationSceneUnloading = true; - LoadNextScene(true); - } - - private void ClientStarted() - { - OnStarted(); - } - - private void ServerStarted() - { - if (m_NetworkManager.IsHost) - { - return; - } - OnStarted(); - } - - public void LoadMainMenu() - { - if (m_MainMenuScene != string.Empty) - { - SceneManager.sceneLoaded += OnSceneLoaded; - SceneManager.LoadScene(m_MainMenuScene, LoadSceneMode.Single); - } - } - private void OnSceneLoaded(Scene sceneLoaded, LoadSceneMode loadSceneMode) - { - if (sceneLoaded.name == m_MainMenuScene) - { - SceneManager.sceneLoaded -= OnSceneLoaded; - m_NetworkManager.OnServerStopped -= OnServerStopped; - m_NetworkManager.OnClientStopped -= OnClientStopped; - m_NetworkManager.OnClientStarted += ClientStarted; - m_NetworkManager.OnServerStarted += ServerStarted; - } - } - - private void OnStopped() - { - // Reset all scene entries for next session - foreach (var sceneEntry in m_SceneEntries) - { - sceneEntry.Reset(); - } - LoadMainMenu(); - } - - private void OnServerStopped(bool wasHost) - { - if (!wasHost) - { - OnStopped(); - } - } - - private void OnClientStopped(bool wasHost) - { - OnStopped(); - } - - private string m_NextSceneLoading; - public Action OnSceneLoadStart; - - /// - /// Loads the next scene and is invoked when the load scene button is clicked. - /// - /// For the main menu prior to loading any scenes synchronized. - public void LoadNextScene(bool isPreload = false) - { - if ((!m_NetworkManager.DistributedAuthorityMode && !m_NetworkManager.IsServer) || !m_NetworkManager.IsListening) - { - return; - } - - m_NextSceneLoading = GetNextSceneToLoad(); - if (isPreload) - { - SceneManager.sceneLoaded += OnPreSceneLoaded; - SceneManager.LoadScene(m_NextSceneLoading, LoadSceneMode.Single); - SceneLoadingInProgress = true; - } - else - { - OnSceneLoadStart?.Invoke(); - var loadStatus = m_NetworkManager.SceneManager.LoadScene(m_NextSceneLoading, LoadSceneMode.Single); - if (loadStatus != SceneEventProgressStatus.Started) - { - m_NetworkManager.LogMessage($"Failed to start scene loading event for {m_NextSceneLoading}! [Status: {loadStatus}]"); - } - else - { - SceneLoadingInProgress = true; - } - } - } - - private void OnPreSceneLoaded(Scene scene, LoadSceneMode loadSceneMode) - { - if (scene.name == m_NextSceneLoading) - { - SceneManager.sceneLoaded -= OnPreSceneLoaded; - SceneLoadingInProgress = false; - UpdateCurrentScene(SceneLoaderState.PreLoading); - } - } - - /// - /// Gets the next scene to be loaded. - /// If there are more than one player prefab to use on this scene then the same scene will be returned. - /// Look at for more information on how the - /// player prefab list is incremented. - /// - private string GetNextSceneToLoad() - { - if (CurrentSceneEntry != null) - { - if (CurrentSceneEntry.IsLastSceneLoad) - { - // This prepares this entry for the next time it is the current (i.e. round robin) - return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].SceneName; - } - else - { - return CurrentSceneEntry.SceneName; - } - } - - if (m_SceneEntries != null && m_SceneEntries.Count > 0) - { - return m_SceneEntries[0].SceneInfo.SceneToLoad; - } - - return string.Empty; - } - - /// - /// Returns back the next scne that will be loaded - /// - public string GetNextSceneName() - { - if (CurrentSceneEntry != null) - { - if (!CurrentSceneEntry.IsLastSceneLoad) - { - return CurrentSceneEntry.SceneName; - } - return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].SceneName; - } - - if (m_SceneEntries != null && m_SceneEntries.Count > 0) - { - return m_SceneEntries[0].SceneInfo.SceneToLoad; - } - - return string.Empty; - } - - /// - /// Returns back the current player prefab spawned for the local client - /// - public string GetCurrentPrefabName() - { - if (m_NetworkManager.IsSessionAuthority() && CurrentSceneEntry != null) - { - return CurrentSceneEntry.PlayerPrefabName; - } - - if (CurrentSceneEntry != null && m_NetworkManager != null && m_NetworkManager.LocalClient != null && m_NetworkManager.LocalClient.PlayerObject != null) - { - var prefab = CurrentSceneEntry.GetPlayerPrefabFromGlobalObjectId(m_NetworkManager.LocalClient.PlayerObject.PrefabIdHash); - if (prefab != null) - { - return prefab.name; - } - } - - if (m_NetworkManager != null && m_NetworkManager.NetworkConfig.PlayerPrefab != null) - { - return m_NetworkManager.NetworkConfig.PlayerPrefab.name; - } - - return string.Empty; - } - - /// - /// Returns back the next player prefab to be used in the next scene being loaded - /// - public string GetNextPrefabName() - { - if (CurrentSceneEntry != null) - { - if (!CurrentSceneEntry.IsLastSceneLoad) - { - return CurrentSceneEntry.GetNextPlayerPrefabName(); - } - return m_SceneEntries[(m_SceneEntries.IndexOf(CurrentSceneEntry) + 1) % m_SceneEntries.Count].GetNextPlayerPrefabName(); - } - - if (m_NetworkManager != null && m_NetworkManager.NetworkConfig.PlayerPrefab != null) - { - return m_NetworkManager.NetworkConfig.PlayerPrefab.name; - } - - return string.Empty; - } -} diff --git a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta b/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta deleted file mode 100644 index 70f2149280..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Scripts/General/SceneLoader.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ea9c6c84f8f4a5b46b680184b3cd28c3 \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/Assets/Settings.meta b/Examples/NGO-N4E-Unified/Assets/Settings.meta deleted file mode 100644 index 39b94dd76b..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 709f11a7f3c4041caa4ef136ea32d874 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset deleted file mode 100644 index 6fb1822003..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset +++ /dev/null @@ -1,982 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &-9167874883656233139 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5485954d14dfb9a4c8ead8edb0ded5b1, type: 3} - m_Name: LiftGammaGain - m_EditorClassIdentifier: - active: 1 - lift: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} - gamma: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} - gain: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} ---- !u!114 &-8270506406425502121 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 70afe9e12c7a7ed47911bb608a23a8ff, type: 3} - m_Name: SplitToning - m_EditorClassIdentifier: - active: 1 - shadows: - m_OverrideState: 1 - m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} - highlights: - m_OverrideState: 1 - m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} - balance: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-8104416584915340131 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 0} - m_Name: CopyPasteTestComponent2 - m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent2 - active: 1 - p1: - m_OverrideState: 1 - m_Value: 0 - p2: - m_OverrideState: 1 - m_Value: 0 - p21: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-7750755424749557576 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 60f3b30c03e6ba64d9a27dc9dba8f28d, type: 3} - m_Name: OutlineVolumeComponent - m_EditorClassIdentifier: - active: 1 - Enabled: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-7743500325797982168 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} - m_Name: MotionBlur - m_EditorClassIdentifier: - active: 1 - mode: - m_OverrideState: 1 - m_Value: 0 - quality: - m_OverrideState: 1 - m_Value: 0 - intensity: - m_OverrideState: 1 - m_Value: 0 - clamp: - m_OverrideState: 1 - m_Value: 0.05 ---- !u!114 &-7274224791359825572 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0fd9ee276a1023e439cf7a9c393195fa, type: 3} - m_Name: TestAnimationCurveVolumeComponent - m_EditorClassIdentifier: - active: 1 - testParameter: - m_OverrideState: 1 - m_Value: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0.5 - value: 10 - inSlope: 0 - outSlope: 10 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 15 - inSlope: 10 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!114 &-6335409530604852063 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3} - m_Name: ColorAdjustments - m_EditorClassIdentifier: - active: 1 - postExposure: - m_OverrideState: 1 - m_Value: 0 - contrast: - m_OverrideState: 1 - m_Value: 0 - colorFilter: - m_OverrideState: 1 - m_Value: {r: 1, g: 1, b: 1, a: 1} - hueShift: - m_OverrideState: 1 - m_Value: 0 - saturation: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-6288072647309666549 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 29fa0085f50d5e54f8144f766051a691, type: 3} - m_Name: FilmGrain - m_EditorClassIdentifier: - active: 1 - type: - m_OverrideState: 1 - m_Value: 0 - intensity: - m_OverrideState: 1 - m_Value: 0 - response: - m_OverrideState: 1 - m_Value: 0.8 - texture: - m_OverrideState: 1 - m_Value: {fileID: 0} ---- !u!114 &-5520245016509672950 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} - m_Name: Tonemapping - m_EditorClassIdentifier: - active: 1 - mode: - m_OverrideState: 1 - m_Value: 0 - neutralHDRRangeReductionMode: - m_OverrideState: 1 - m_Value: 2 - acesPreset: - m_OverrideState: 1 - m_Value: 3 - hueShiftAmount: - m_OverrideState: 1 - m_Value: 0 - detectPaperWhite: - m_OverrideState: 1 - m_Value: 0 - paperWhite: - m_OverrideState: 1 - m_Value: 300 - detectBrightnessLimits: - m_OverrideState: 1 - m_Value: 1 - minNits: - m_OverrideState: 1 - m_Value: 0.005 - maxNits: - m_OverrideState: 1 - m_Value: 1000 ---- !u!114 &-5360449096862653589 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 0} - m_Name: VolumeComponentSupportedEverywhere - m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedEverywhere - active: 1 ---- !u!114 &-5139089513906902183 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5a00a63fdd6bd2a45ab1f2d869305ffd, type: 3} - m_Name: OasisFogVolumeComponent - m_EditorClassIdentifier: - active: 1 - Density: - m_OverrideState: 1 - m_Value: 0 - StartDistance: - m_OverrideState: 1 - m_Value: 0 - HeightRange: - m_OverrideState: 1 - m_Value: {x: 0, y: 50} - Tint: - m_OverrideState: 1 - m_Value: {r: 1, g: 1, b: 1, a: 1} - SunScatteringIntensity: - m_OverrideState: 1 - m_Value: 2 ---- !u!114 &-4463884970436517307 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fb60a22f311433c4c962b888d1393f88, type: 3} - m_Name: PaniniProjection - m_EditorClassIdentifier: - active: 1 - distance: - m_OverrideState: 1 - m_Value: 0 - cropToFit: - m_OverrideState: 1 - m_Value: 1 ---- !u!114 &-1410297666881709256 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6bd486065ce11414fa40e631affc4900, type: 3} - m_Name: ProbeVolumesOptions - m_EditorClassIdentifier: - active: 1 - normalBias: - m_OverrideState: 1 - m_Value: 0.33 - viewBias: - m_OverrideState: 1 - m_Value: 0 - scaleBiasWithMinProbeDistance: - m_OverrideState: 1 - m_Value: 0 - samplingNoise: - m_OverrideState: 1 - m_Value: 0.1 - animateSamplingNoise: - m_OverrideState: 1 - m_Value: 1 - leakReductionMode: - m_OverrideState: 1 - m_Value: 1 - minValidDotProductValue: - m_OverrideState: 1 - m_Value: 0.1 - occlusionOnlyReflectionNormalization: - m_OverrideState: 1 - m_Value: 1 - intensityMultiplier: - m_OverrideState: 1 - m_Value: 1 - skyOcclusionIntensityMultiplier: - m_OverrideState: 1 - m_Value: 1 ---- !u!114 &-1216621516061285780 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} - m_Name: Bloom - m_EditorClassIdentifier: - active: 1 - skipIterations: - m_OverrideState: 1 - m_Value: 1 - threshold: - m_OverrideState: 1 - m_Value: 0.9 - intensity: - m_OverrideState: 1 - m_Value: 0 - scatter: - m_OverrideState: 1 - m_Value: 0.7 - clamp: - m_OverrideState: 1 - m_Value: 65472 - tint: - m_OverrideState: 1 - m_Value: {r: 1, g: 1, b: 1, a: 1} - highQualityFiltering: - m_OverrideState: 1 - m_Value: 0 - downscale: - m_OverrideState: 1 - m_Value: 0 - maxIterations: - m_OverrideState: 1 - m_Value: 6 - dirtTexture: - m_OverrideState: 1 - m_Value: {fileID: 0} - dimension: 1 - dirtIntensity: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-1170528603972255243 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 221518ef91623a7438a71fef23660601, type: 3} - m_Name: WhiteBalance - m_EditorClassIdentifier: - active: 1 - temperature: - m_OverrideState: 1 - m_Value: 0 - tint: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &-581120513425526550 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 0} - m_Name: CopyPasteTestComponent3 - m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent3 - active: 1 - p1: - m_OverrideState: 1 - m_Value: 0 - p2: - m_OverrideState: 1 - m_Value: 0 - p31: - m_OverrideState: 1 - m_Value: {r: 0, g: 0, b: 0, a: 1} ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} - m_Name: DefaultVolumeProfile - m_EditorClassIdentifier: - components: - - {fileID: -9167874883656233139} - - {fileID: 1918650496244738858} - - {fileID: 853819529557874667} - - {fileID: 1052315754049611418} - - {fileID: -1170528603972255243} - - {fileID: -8270506406425502121} - - {fileID: -5520245016509672950} - - {fileID: 7173750748008157695} - - {fileID: 1666464333004379222} - - {fileID: 9001657382290151224} - - {fileID: -6335409530604852063} - - {fileID: -1216621516061285780} - - {fileID: 3959858460715838825} - - {fileID: -7743500325797982168} - - {fileID: 4644742534064026673} - - {fileID: -4463884970436517307} - - {fileID: -6288072647309666549} - - {fileID: 7518938298396184218} - - {fileID: -1410297666881709256} - - {fileID: -7750755424749557576} - - {fileID: -5139089513906902183} ---- !u!114 &853819529557874667 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 06437c1ff663d574d9447842ba0a72e4, type: 3} - m_Name: ScreenSpaceLensFlare - m_EditorClassIdentifier: - active: 1 - intensity: - m_OverrideState: 1 - m_Value: 0 - tintColor: - m_OverrideState: 1 - m_Value: {r: 1, g: 1, b: 1, a: 1} - bloomMip: - m_OverrideState: 1 - m_Value: 1 - firstFlareIntensity: - m_OverrideState: 1 - m_Value: 1 - secondaryFlareIntensity: - m_OverrideState: 1 - m_Value: 1 - warpedFlareIntensity: - m_OverrideState: 1 - m_Value: 1 - warpedFlareScale: - m_OverrideState: 1 - m_Value: {x: 1, y: 1} - samples: - m_OverrideState: 1 - m_Value: 1 - sampleDimmer: - m_OverrideState: 1 - m_Value: 0.5 - vignetteEffect: - m_OverrideState: 1 - m_Value: 1 - startingPosition: - m_OverrideState: 1 - m_Value: 1.25 - scale: - m_OverrideState: 1 - m_Value: 1.5 - streaksIntensity: - m_OverrideState: 1 - m_Value: 0 - streaksLength: - m_OverrideState: 1 - m_Value: 0.5 - streaksOrientation: - m_OverrideState: 1 - m_Value: 0 - streaksThreshold: - m_OverrideState: 1 - m_Value: 0.25 - resolution: - m_OverrideState: 1 - m_Value: 4 - chromaticAbberationIntensity: - m_OverrideState: 1 - m_Value: 0.5 ---- !u!114 &1052315754049611418 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 558a8e2b6826cf840aae193990ba9f2e, type: 3} - m_Name: ShadowsMidtonesHighlights - m_EditorClassIdentifier: - active: 1 - shadows: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} - midtones: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} - highlights: - m_OverrideState: 1 - m_Value: {x: 1, y: 1, z: 1, w: 0} - shadowsStart: - m_OverrideState: 1 - m_Value: 0 - shadowsEnd: - m_OverrideState: 1 - m_Value: 0.3 - highlightsStart: - m_OverrideState: 1 - m_Value: 0.55 - highlightsEnd: - m_OverrideState: 1 - m_Value: 1 ---- !u!114 &1666464333004379222 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3eb4b772797da9440885e8bd939e9560, type: 3} - m_Name: ColorCurves - m_EditorClassIdentifier: - active: 1 - master: - m_OverrideState: 1 - m_Value: - k__BackingField: 2 - m_Loop: 0 - m_ZeroValue: 0 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - red: - m_OverrideState: 1 - m_Value: - k__BackingField: 2 - m_Loop: 0 - m_ZeroValue: 0 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - green: - m_OverrideState: 1 - m_Value: - k__BackingField: 2 - m_Loop: 0 - m_ZeroValue: 0 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - blue: - m_OverrideState: 1 - m_Value: - k__BackingField: 2 - m_Loop: 0 - m_ZeroValue: 0 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - hueVsHue: - m_OverrideState: 1 - m_Value: - k__BackingField: 0 - m_Loop: 1 - m_ZeroValue: 0.5 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - hueVsSat: - m_OverrideState: 1 - m_Value: - k__BackingField: 0 - m_Loop: 1 - m_ZeroValue: 0.5 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - satVsSat: - m_OverrideState: 1 - m_Value: - k__BackingField: 0 - m_Loop: 0 - m_ZeroValue: 0.5 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - lumVsSat: - m_OverrideState: 1 - m_Value: - k__BackingField: 0 - m_Loop: 0 - m_ZeroValue: 0.5 - m_Range: 1 - m_Curve: - serializedVersion: 2 - m_Curve: [] - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!114 &1918650496244738858 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e021b4c809a781e468c2988c016ebbea, type: 3} - m_Name: ColorLookup - m_EditorClassIdentifier: - active: 1 - texture: - m_OverrideState: 1 - m_Value: {fileID: 0} - dimension: 1 - contribution: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &3959858460715838825 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c01700fd266d6914ababb731e09af2eb, type: 3} - m_Name: DepthOfField - m_EditorClassIdentifier: - active: 1 - mode: - m_OverrideState: 1 - m_Value: 0 - gaussianStart: - m_OverrideState: 1 - m_Value: 10 - gaussianEnd: - m_OverrideState: 1 - m_Value: 30 - gaussianMaxRadius: - m_OverrideState: 1 - m_Value: 1 - highQualitySampling: - m_OverrideState: 1 - m_Value: 0 - focusDistance: - m_OverrideState: 1 - m_Value: 10 - aperture: - m_OverrideState: 1 - m_Value: 5.6 - focalLength: - m_OverrideState: 1 - m_Value: 50 - bladeCount: - m_OverrideState: 1 - m_Value: 5 - bladeCurvature: - m_OverrideState: 1 - m_Value: 1 - bladeRotation: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &4251301726029935498 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 74955a4b0b4243bc87231e8b59ed9140, type: 3} - m_Name: TestVolume - m_EditorClassIdentifier: - active: 1 - param: - m_OverrideState: 1 - m_Value: 123 ---- !u!114 &4644742534064026673 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 81180773991d8724ab7f2d216912b564, type: 3} - m_Name: ChromaticAberration - m_EditorClassIdentifier: - active: 1 - intensity: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &6940869943325143175 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 0} - m_Name: VolumeComponentSupportedOnAnySRP - m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedOnAnySRP - active: 1 ---- !u!114 &7173750748008157695 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} - m_Name: Vignette - m_EditorClassIdentifier: - active: 1 - color: - m_OverrideState: 1 - m_Value: {r: 0, g: 0, b: 0, a: 1} - center: - m_OverrideState: 1 - m_Value: {x: 0.5, y: 0.5} - intensity: - m_OverrideState: 1 - m_Value: 0 - smoothness: - m_OverrideState: 1 - m_Value: 0.2 - rounded: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &7518938298396184218 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c5e1dc532bcb41949b58bc4f2abfbb7e, type: 3} - m_Name: LensDistortion - m_EditorClassIdentifier: - active: 1 - intensity: - m_OverrideState: 1 - m_Value: 0 - xMultiplier: - m_OverrideState: 1 - m_Value: 1 - yMultiplier: - m_OverrideState: 1 - m_Value: 1 - center: - m_OverrideState: 1 - m_Value: {x: 0.5, y: 0.5} - scale: - m_OverrideState: 1 - m_Value: 1 ---- !u!114 &9001657382290151224 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cdfbdbb87d3286943a057f7791b43141, type: 3} - m_Name: ChannelMixer - m_EditorClassIdentifier: - active: 1 - redOutRedIn: - m_OverrideState: 1 - m_Value: 100 - redOutGreenIn: - m_OverrideState: 1 - m_Value: 0 - redOutBlueIn: - m_OverrideState: 1 - m_Value: 0 - greenOutRedIn: - m_OverrideState: 1 - m_Value: 0 - greenOutGreenIn: - m_OverrideState: 1 - m_Value: 100 - greenOutBlueIn: - m_OverrideState: 1 - m_Value: 0 - blueOutRedIn: - m_OverrideState: 1 - m_Value: 0 - blueOutGreenIn: - m_OverrideState: 1 - m_Value: 0 - blueOutBlueIn: - m_OverrideState: 1 - m_Value: 100 ---- !u!114 &9122958982931076880 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 0} - m_Name: CopyPasteTestComponent1 - m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent1 - active: 1 - p1: - m_OverrideState: 1 - m_Value: 0 - p2: - m_OverrideState: 1 - m_Value: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta deleted file mode 100644 index 53b314adfa..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/DefaultVolumeProfile.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ab09877e2e707104187f6f83e2f62510 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset deleted file mode 100644 index 521491ec74..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset +++ /dev/null @@ -1,144 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} - m_Name: Mobile_RPAsset - m_EditorClassIdentifier: - k_AssetVersion: 13 - k_AssetPreviousVersion: 13 - m_RendererType: 1 - m_RendererData: {fileID: 0} - m_RendererDataList: - - {fileID: 11400000, guid: 65bc7dbf4170f435aa868c779acfb082, type: 2} - m_DefaultRendererIndex: 0 - m_RequireDepthTexture: 0 - m_RequireOpaqueTexture: 0 - m_OpaqueDownsampling: 0 - m_SupportsTerrainHoles: 1 - m_SupportsHDR: 1 - m_HDRColorBufferPrecision: 0 - m_MSAA: 1 - m_RenderScale: 0.8 - m_UpscalingFilter: 0 - m_FsrOverrideSharpness: 0 - m_FsrSharpness: 0.92 - m_EnableLODCrossFade: 1 - m_LODCrossFadeDitheringType: 1 - m_ShEvalMode: 0 - m_LightProbeSystem: 0 - m_ProbeVolumeMemoryBudget: 1024 - m_ProbeVolumeBlendingMemoryBudget: 256 - m_SupportProbeVolumeGPUStreaming: 0 - m_SupportProbeVolumeDiskStreaming: 0 - m_SupportProbeVolumeScenarios: 0 - m_SupportProbeVolumeScenarioBlending: 0 - m_ProbeVolumeSHBands: 1 - m_MainLightRenderingMode: 1 - m_MainLightShadowsSupported: 1 - m_MainLightShadowmapResolution: 1024 - m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 4 - m_AdditionalLightShadowsSupported: 0 - m_AdditionalLightsShadowmapResolution: 2048 - m_AdditionalLightsShadowResolutionTierLow: 256 - m_AdditionalLightsShadowResolutionTierMedium: 512 - m_AdditionalLightsShadowResolutionTierHigh: 1024 - m_ReflectionProbeBlending: 1 - m_ReflectionProbeBoxProjection: 1 - m_ReflectionProbeAtlas: 1 - m_ShadowDistance: 50 - m_ShadowCascadeCount: 1 - m_Cascade2Split: 0.25 - m_Cascade3Split: {x: 0.1, y: 0.3} - m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} - m_CascadeBorder: 0.2 - m_ShadowDepthBias: 1 - m_ShadowNormalBias: 1 - m_AnyShadowsSupported: 1 - m_SoftShadowsSupported: 0 - m_ConservativeEnclosingSphere: 1 - m_NumIterationsEnclosingSphere: 64 - m_SoftShadowQuality: 2 - m_AdditionalLightsCookieResolution: 1024 - m_AdditionalLightsCookieFormat: 1 - m_UseSRPBatcher: 1 - m_SupportsDynamicBatching: 0 - m_MixedLightingSupported: 1 - m_SupportsLightCookies: 1 - m_SupportsLightLayers: 1 - m_StoreActionsOptimization: 0 - m_UseAdaptivePerformance: 1 - m_ColorGradingMode: 0 - m_ColorGradingLutSize: 32 - m_AllowPostProcessAlphaOutput: 0 - m_UseFastSRGBLinearConversion: 1 - m_SupportDataDrivenLensFlare: 1 - m_SupportScreenSpaceLensFlare: 1 - m_GPUResidentDrawerMode: 0 - m_SmallMeshScreenPercentage: 0 - m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 - m_ShadowType: 1 - m_LocalShadowsSupported: 0 - m_LocalShadowsAtlasResolution: 256 - m_MaxPixelLights: 0 - m_ShadowAtlasResolution: 256 - m_VolumeFrameworkUpdateMode: 0 - m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} - apvScenesData: - obsoleteSceneBounds: - m_Keys: [] - m_Values: [] - obsoleteHasProbeVolumes: - m_Keys: [] - m_Values: - m_PrefilteringModeMainLightShadows: 3 - m_PrefilteringModeAdditionalLight: 4 - m_PrefilteringModeAdditionalLightShadows: 0 - m_PrefilterXRKeywords: 1 - m_PrefilteringModeForwardPlus: 1 - m_PrefilteringModeDeferredRendering: 0 - m_PrefilteringModeScreenSpaceOcclusion: 0 - m_PrefilteringModeScreenSpaceReflection: 1 - m_PrefilterWriteSmoothness: 1 - m_PrefilterDebugKeywords: 1 - m_PrefilterWriteRenderingLayers: 1 - m_PrefilterHDROutput: 1 - m_PrefilterAlphaOutput: 0 - m_PrefilterSSAODepthNormals: 1 - m_PrefilterSSAOSourceDepthLow: 1 - m_PrefilterSSAOSourceDepthMedium: 0 - m_PrefilterSSAOSourceDepthHigh: 1 - m_PrefilterSSAOInterleaved: 0 - m_PrefilterSSAOBlueNoise: 1 - m_PrefilterSSAOSampleCountLow: 1 - m_PrefilterSSAOSampleCountMedium: 0 - m_PrefilterSSAOSampleCountHigh: 1 - m_PrefilterDBufferMRT1: 1 - m_PrefilterDBufferMRT2: 1 - m_PrefilterDBufferMRT3: 1 - m_PrefilterSoftShadowsQualityLow: 1 - m_PrefilterSoftShadowsQualityMedium: 1 - m_PrefilterSoftShadowsQualityHigh: 1 - m_PrefilterSoftShadows: 0 - m_PrefilterScreenCoord: 1 - m_PrefilterScreenSpaceIrradiance: 0 - m_PrefilterNativeRenderPass: 1 - m_PrefilterUseLegacyLightmaps: 0 - m_PrefilterBicubicLightmapSampling: 0 - m_PrefilterReflectionProbeRotation: 0 - m_PrefilterReflectionProbeBlending: 0 - m_PrefilterReflectionProbeBoxProjection: 0 - m_PrefilterReflectionProbeAtlas: 0 - m_ShaderVariantLogLevel: 0 - m_ShadowCascades: 0 - m_Textures: - blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} - bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta deleted file mode 100644 index 3660d1516d..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_RPAsset.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5e6cbd92db86f4b18aec3ed561671858 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset deleted file mode 100644 index ea246b2594..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset +++ /dev/null @@ -1,52 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} - m_Name: Mobile_Renderer - m_EditorClassIdentifier: - debugShaders: - debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, - type: 3} - hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} - probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, - type: 3} - probeVolumeResources: - probeVolumeDebugShader: {fileID: 0} - probeVolumeFragmentationDebugShader: {fileID: 0} - probeVolumeOffsetDebugShader: {fileID: 0} - probeVolumeSamplingDebugShader: {fileID: 0} - probeSamplingDebugMesh: {fileID: 0} - probeSamplingDebugTexture: {fileID: 0} - probeVolumeBlendStatesCS: {fileID: 0} - m_RendererFeatures: [] - m_RendererFeatureMap: - m_UseNativeRenderPass: 1 - postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} - m_AssetVersion: 2 - m_OpaqueLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_TransparentLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_DefaultStencilState: - overrideStencilState: 0 - stencilReference: 0 - stencilCompareFunction: 8 - passOperation: 2 - failOperation: 0 - zFailOperation: 0 - m_ShadowTransparentReceive: 0 - m_RenderingMode: 0 - m_DepthPrimingMode: 0 - m_CopyDepthMode: 0 - m_AccurateGbufferNormals: 0 - m_IntermediateTextureMode: 0 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta deleted file mode 100644 index a3588b1a9b..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/Mobile_Renderer.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 65bc7dbf4170f435aa868c779acfb082 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset deleted file mode 100644 index 73f9aa7cb9..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset +++ /dev/null @@ -1,144 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} - m_Name: PC_RPAsset - m_EditorClassIdentifier: - k_AssetVersion: 13 - k_AssetPreviousVersion: 13 - m_RendererType: 1 - m_RendererData: {fileID: 0} - m_RendererDataList: - - {fileID: 11400000, guid: f288ae1f4751b564a96ac7587541f7a2, type: 2} - m_DefaultRendererIndex: 0 - m_RequireDepthTexture: 1 - m_RequireOpaqueTexture: 1 - m_OpaqueDownsampling: 1 - m_SupportsTerrainHoles: 1 - m_SupportsHDR: 1 - m_HDRColorBufferPrecision: 0 - m_MSAA: 1 - m_RenderScale: 1 - m_UpscalingFilter: 0 - m_FsrOverrideSharpness: 0 - m_FsrSharpness: 0.92 - m_EnableLODCrossFade: 1 - m_LODCrossFadeDitheringType: 1 - m_ShEvalMode: 0 - m_LightProbeSystem: 0 - m_ProbeVolumeMemoryBudget: 1024 - m_ProbeVolumeBlendingMemoryBudget: 256 - m_SupportProbeVolumeGPUStreaming: 0 - m_SupportProbeVolumeDiskStreaming: 0 - m_SupportProbeVolumeScenarios: 0 - m_SupportProbeVolumeScenarioBlending: 0 - m_ProbeVolumeSHBands: 1 - m_MainLightRenderingMode: 1 - m_MainLightShadowsSupported: 1 - m_MainLightShadowmapResolution: 2048 - m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 4 - m_AdditionalLightShadowsSupported: 1 - m_AdditionalLightsShadowmapResolution: 2048 - m_AdditionalLightsShadowResolutionTierLow: 256 - m_AdditionalLightsShadowResolutionTierMedium: 512 - m_AdditionalLightsShadowResolutionTierHigh: 1024 - m_ReflectionProbeBlending: 1 - m_ReflectionProbeBoxProjection: 1 - m_ReflectionProbeAtlas: 1 - m_ShadowDistance: 50 - m_ShadowCascadeCount: 4 - m_Cascade2Split: 0.25 - m_Cascade3Split: {x: 0.1, y: 0.3} - m_Cascade4Split: {x: 0.12299999, y: 0.2926, z: 0.53599995} - m_CascadeBorder: 0.107758604 - m_ShadowDepthBias: 0.1 - m_ShadowNormalBias: 0.5 - m_AnyShadowsSupported: 1 - m_SoftShadowsSupported: 1 - m_ConservativeEnclosingSphere: 1 - m_NumIterationsEnclosingSphere: 64 - m_SoftShadowQuality: 3 - m_AdditionalLightsCookieResolution: 2048 - m_AdditionalLightsCookieFormat: 3 - m_UseSRPBatcher: 1 - m_SupportsDynamicBatching: 0 - m_MixedLightingSupported: 1 - m_SupportsLightCookies: 1 - m_SupportsLightLayers: 1 - m_StoreActionsOptimization: 0 - m_UseAdaptivePerformance: 1 - m_ColorGradingMode: 0 - m_ColorGradingLutSize: 32 - m_AllowPostProcessAlphaOutput: 0 - m_UseFastSRGBLinearConversion: 0 - m_SupportDataDrivenLensFlare: 1 - m_SupportScreenSpaceLensFlare: 1 - m_GPUResidentDrawerMode: 0 - m_SmallMeshScreenPercentage: 0 - m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 - m_ShadowType: 1 - m_LocalShadowsSupported: 0 - m_LocalShadowsAtlasResolution: 256 - m_MaxPixelLights: 0 - m_ShadowAtlasResolution: 256 - m_VolumeFrameworkUpdateMode: 0 - m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} - apvScenesData: - obsoleteSceneBounds: - m_Keys: [] - m_Values: [] - obsoleteHasProbeVolumes: - m_Keys: [] - m_Values: - m_PrefilteringModeMainLightShadows: 3 - m_PrefilteringModeAdditionalLight: 4 - m_PrefilteringModeAdditionalLightShadows: 0 - m_PrefilterXRKeywords: 1 - m_PrefilteringModeForwardPlus: 1 - m_PrefilteringModeDeferredRendering: 0 - m_PrefilteringModeScreenSpaceOcclusion: 1 - m_PrefilteringModeScreenSpaceReflection: 1 - m_PrefilterWriteSmoothness: 1 - m_PrefilterDebugKeywords: 1 - m_PrefilterWriteRenderingLayers: 0 - m_PrefilterHDROutput: 1 - m_PrefilterAlphaOutput: 0 - m_PrefilterSSAODepthNormals: 0 - m_PrefilterSSAOSourceDepthLow: 1 - m_PrefilterSSAOSourceDepthMedium: 1 - m_PrefilterSSAOSourceDepthHigh: 1 - m_PrefilterSSAOInterleaved: 1 - m_PrefilterSSAOBlueNoise: 0 - m_PrefilterSSAOSampleCountLow: 1 - m_PrefilterSSAOSampleCountMedium: 0 - m_PrefilterSSAOSampleCountHigh: 1 - m_PrefilterDBufferMRT1: 1 - m_PrefilterDBufferMRT2: 1 - m_PrefilterDBufferMRT3: 0 - m_PrefilterSoftShadowsQualityLow: 0 - m_PrefilterSoftShadowsQualityMedium: 0 - m_PrefilterSoftShadowsQualityHigh: 0 - m_PrefilterSoftShadows: 0 - m_PrefilterScreenCoord: 1 - m_PrefilterScreenSpaceIrradiance: 0 - m_PrefilterNativeRenderPass: 1 - m_PrefilterUseLegacyLightmaps: 0 - m_PrefilterBicubicLightmapSampling: 0 - m_PrefilterReflectionProbeRotation: 0 - m_PrefilterReflectionProbeBlending: 0 - m_PrefilterReflectionProbeBoxProjection: 0 - m_PrefilterReflectionProbeAtlas: 0 - m_ShaderVariantLogLevel: 0 - m_ShadowCascades: 0 - m_Textures: - blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} - bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta deleted file mode 100644 index e286b2fdd0..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/PC_RPAsset.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4b83569d67af61e458304325a23e5dfd -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset deleted file mode 100644 index 475b02e557..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset +++ /dev/null @@ -1,95 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} - m_Name: PC_Renderer - m_EditorClassIdentifier: - debugShaders: - debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, - type: 3} - hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} - probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, - type: 3} - probeVolumeResources: - probeVolumeDebugShader: {fileID: 4800000, guid: e5c6678ed2aaa91408dd3df699057aae, - type: 3} - probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 03cfc4915c15d504a9ed85ecc404e607, - type: 3} - probeVolumeOffsetDebugShader: {fileID: 4800000, guid: 53a11f4ebaebf4049b3638ef78dc9664, - type: 3} - probeVolumeSamplingDebugShader: {fileID: 4800000, guid: 8f96cd657dc40064aa21efcc7e50a2e7, - type: 3} - probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 57d7c4c16e2765b47a4d2069b311bffe, - type: 3} - probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, - type: 3} - probeVolumeBlendStatesCS: {fileID: 7200000, guid: b9a23f869c4fd45f19c5ada54dd82176, - type: 3} - m_RendererFeatures: - - {fileID: 7833122117494664109} - m_RendererFeatureMap: ad6b866f10d7b46c - m_UseNativeRenderPass: 1 - postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} - m_AssetVersion: 2 - m_OpaqueLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_TransparentLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_DefaultStencilState: - overrideStencilState: 0 - stencilReference: 1 - stencilCompareFunction: 3 - passOperation: 2 - failOperation: 0 - zFailOperation: 0 - m_ShadowTransparentReceive: 1 - m_RenderingMode: 2 - m_DepthPrimingMode: 0 - m_CopyDepthMode: 0 - m_AccurateGbufferNormals: 0 - m_IntermediateTextureMode: 0 ---- !u!114 &7833122117494664109 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3} - m_Name: ScreenSpaceAmbientOcclusion - m_EditorClassIdentifier: - m_Active: 1 - m_Settings: - AOMethod: 0 - Downsample: 0 - AfterOpaque: 0 - Source: 1 - NormalSamples: 1 - Intensity: 0.4 - DirectLightingStrength: 0.25 - Radius: 0.3 - Samples: 1 - BlurQuality: 0 - Falloff: 100 - SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta deleted file mode 100644 index ddae6a5f01..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/PC_Renderer.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f288ae1f4751b564a96ac7587541f7a2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset deleted file mode 100644 index c1b0f6319b..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset +++ /dev/null @@ -1,159 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &-7893295128165547882 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} - m_Name: Bloom - m_EditorClassIdentifier: - active: 1 - skipIterations: - m_OverrideState: 1 - m_Value: 0 - threshold: - m_OverrideState: 1 - m_Value: 1 - intensity: - m_OverrideState: 1 - m_Value: 0.25 - scatter: - m_OverrideState: 1 - m_Value: 0.5 - clamp: - m_OverrideState: 0 - m_Value: 65472 - tint: - m_OverrideState: 0 - m_Value: {r: 1, g: 1, b: 1, a: 1} - highQualityFiltering: - m_OverrideState: 1 - m_Value: 1 - downscale: - m_OverrideState: 0 - m_Value: 0 - maxIterations: - m_OverrideState: 0 - m_Value: 6 - dirtTexture: - m_OverrideState: 0 - m_Value: {fileID: 0} - dimension: 1 - dirtIntensity: - m_OverrideState: 0 - m_Value: 0 ---- !u!114 &-3357603926938260329 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} - m_Name: Vignette - m_EditorClassIdentifier: - active: 1 - color: - m_OverrideState: 0 - m_Value: {r: 0, g: 0, b: 0, a: 1} - center: - m_OverrideState: 0 - m_Value: {x: 0.5, y: 0.5} - intensity: - m_OverrideState: 1 - m_Value: 0.2 - smoothness: - m_OverrideState: 0 - m_Value: 0.2 - rounded: - m_OverrideState: 0 - m_Value: 0 ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} - m_Name: SampleSceneProfile - m_EditorClassIdentifier: - components: - - {fileID: 849379129802519247} - - {fileID: -7893295128165547882} - - {fileID: 7391319092446245454} - - {fileID: -3357603926938260329} ---- !u!114 &849379129802519247 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} - m_Name: Tonemapping - m_EditorClassIdentifier: - active: 1 - mode: - m_OverrideState: 1 - m_Value: 1 - neutralHDRRangeReductionMode: - m_OverrideState: 0 - m_Value: 2 - acesPreset: - m_OverrideState: 0 - m_Value: 3 - hueShiftAmount: - m_OverrideState: 0 - m_Value: 0 - detectPaperWhite: - m_OverrideState: 1 - m_Value: 0 - paperWhite: - m_OverrideState: 1 - m_Value: 234 - detectBrightnessLimits: - m_OverrideState: 1 - m_Value: 1 - minNits: - m_OverrideState: 1 - m_Value: 0.005 - maxNits: - m_OverrideState: 1 - m_Value: 647 ---- !u!114 &7391319092446245454 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} - m_Name: MotionBlur - m_EditorClassIdentifier: - active: 0 - mode: - m_OverrideState: 0 - m_Value: 0 - quality: - m_OverrideState: 1 - m_Value: 2 - intensity: - m_OverrideState: 1 - m_Value: 0.6 - clamp: - m_OverrideState: 0 - m_Value: 0.05 diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta deleted file mode 100644 index b82270c5b2..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/SampleSceneProfile.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 10fc4df2da32a41aaa32d77bc913491c -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset deleted file mode 100644 index 3cda20b841..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset +++ /dev/null @@ -1,462 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3} - m_Name: UniversalRenderPipelineGlobalSettings - m_EditorClassIdentifier: - m_ShaderStrippingSetting: - m_Version: 0 - m_ExportShaderVariants: 1 - m_ShaderVariantLogLevel: 0 - m_StripRuntimeDebugShaders: 1 - m_URPShaderStrippingSetting: - m_Version: 0 - m_StripUnusedPostProcessingVariants: 1 - m_StripUnusedVariants: 1 - m_StripScreenCoordOverrideVariants: 1 - m_ShaderVariantLogLevel: 0 - m_ExportShaderVariants: 1 - m_StripDebugVariants: 1 - m_StripUnusedPostProcessingVariants: 1 - m_StripUnusedVariants: 1 - m_StripScreenCoordOverrideVariants: 1 - supportRuntimeDebugDisplay: 0 - m_Settings: - m_SettingsList: - m_List: - - rid: 6852985685364965376 - - rid: 6852985685364965377 - - rid: 6852985685364965378 - - rid: 6852985685364965379 - - rid: 6852985685364965380 - - rid: 6852985685364965381 - - rid: 6852985685364965382 - - rid: 6852985685364965383 - - rid: 6852985685364965384 - - rid: 6852985685364965385 - - rid: 6852985685364965386 - - rid: 6852985685364965387 - - rid: 6852985685364965388 - - rid: 6852985685364965389 - - rid: 6852985685364965390 - - rid: 6852985685364965391 - - rid: 6852985685364965392 - - rid: 6852985685364965393 - - rid: 6852985685364965394 - - rid: 8712630790384254976 - - rid: 1499458198383362048 - - rid: 1499458198383362049 - - rid: 1499458198383362050 - - rid: 1499458198383362051 - - rid: 1499458198383362052 - - rid: 1499458198383362053 - - rid: 1499458198383362054 - - rid: 1499458198383362055 - - rid: 1499458198383362056 - - rid: 1499458198383362057 - - rid: 1499458198383362058 - - rid: 1499458198383362059 - - rid: 1499458198383362060 - - rid: 1499458198383362061 - - rid: 1499458198383362062 - - rid: 1499458198383362063 - - rid: 1499458198383362064 - m_RuntimeSettings: - m_List: [] - m_AssetVersion: 10 - m_ObsoleteDefaultVolumeProfile: {fileID: 0} - m_RenderingLayerNames: - - Light Layer default - - Light Layer 1 - - Light Layer 2 - - Light Layer 3 - - Light Layer 4 - - Light Layer 5 - - Light Layer 6 - - Light Layer 7 - m_ValidRenderingLayers: 0 - lightLayerName0: Light Layer default - lightLayerName1: Light Layer 1 - lightLayerName2: Light Layer 2 - lightLayerName3: Light Layer 3 - lightLayerName4: Light Layer 4 - lightLayerName5: Light Layer 5 - lightLayerName6: Light Layer 6 - lightLayerName7: Light Layer 7 - apvScenesData: - obsoleteSceneBounds: - m_Keys: [] - m_Values: [] - obsoleteHasProbeVolumes: - m_Keys: [] - m_Values: - references: - version: 2 - RefIds: - - rid: 1499458198383362048 - type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime} - data: - m_Version: 1 - m_GeometryPoolKernels: {fileID: 7200000, guid: 98e3d58cae7210c4786f67f504c9e899, type: 3} - m_CopyBuffer: {fileID: 7200000, guid: 1b95b5dcf48d1914c9e1e7405c7660e3, type: 3} - m_CopyPositions: {fileID: 7200000, guid: 1ad53a96b58d3c3488dde4f14db1aaeb, type: 3} - m_BitHistogram: {fileID: 7200000, guid: 8670f7ce4b60cef43bed36148aa1b0a2, type: 3} - m_BlockReducePart: {fileID: 7200000, guid: 4e034cc8ea2635c4e9f063e5ddc7ea7a, type: 3} - m_BlockScan: {fileID: 7200000, guid: 4d6d5de35fa45ef4a92119397a045cc9, type: 3} - m_BuildHlbvh: {fileID: 7200000, guid: 2d70cd6be91bd7843a39a54b51c15b13, type: 3} - m_RestructureBvh: {fileID: 7200000, guid: 56641cb88dcb31a4398a4997ef7a7a8c, type: 3} - m_Scatter: {fileID: 7200000, guid: a2eaeefdac4637a44b734e85b7be9186, type: 3} - - rid: 1499458198383362049 - type: {class: UniversalRenderPipelineEditorAssets, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_DefaultSettingsVolumeProfile: {fileID: 11400000, guid: eda47df5b85f4f249abf7abd73db2cb2, type: 2} - - rid: 1499458198383362050 - type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_IncludeTerrainShaders: 1 - - rid: 1499458198383362051 - type: {class: MipGenRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_ColorPyramidPS: {fileID: 4800000, guid: 63b92baba208e314c8fdebe52ca0cc34, type: 3} - m_ColorPyramidCS: {fileID: 7200000, guid: 28969cfddd9ef3f4e94b971690146a4f, type: 3} - m_DepthPyramidCS: {fileID: 7200000, guid: 90a204702cd44e54cac7ed4fc6e5d86b, type: 3} - - rid: 1499458198383362052 - type: {class: OnTilePostProcessResource, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_UberPostShader: {fileID: 4800000, guid: fe4f13c1004a07d4ea1e30bfd0326d9e, type: 3} - - rid: 1499458198383362053 - type: {class: ScreenSpaceAmbientOcclusionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} - m_Version: 0 - - rid: 1499458198383362054 - type: {class: ScreenSpaceAmbientOcclusionDynamicResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Version: 0 - - rid: 1499458198383362055 - type: {class: PostProcessData/TextureResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - blueNoise16LTex: - - {fileID: 2800000, guid: 81200413a40918d4d8702e94db29911c, type: 3} - - {fileID: 2800000, guid: d50c5e07c9911a74982bddf7f3075e7b, type: 3} - - {fileID: 2800000, guid: 1134690bf9216164dbc75050e35b7900, type: 3} - - {fileID: 2800000, guid: 7ce2118f74614a94aa8a0cdf2e6062c3, type: 3} - - {fileID: 2800000, guid: 2ca97df9d1801e84a8a8f2c53cb744f0, type: 3} - - {fileID: 2800000, guid: e63eef8f54aa9dc4da9a5ac094b503b5, type: 3} - - {fileID: 2800000, guid: 39451254daebd6d40b52899c1f1c0c1b, type: 3} - - {fileID: 2800000, guid: c94ad916058dff743b0f1c969ddbe660, type: 3} - - {fileID: 2800000, guid: ed5ea7ce59ca8ec4f9f14bf470a30f35, type: 3} - - {fileID: 2800000, guid: 071e954febf155243a6c81e48f452644, type: 3} - - {fileID: 2800000, guid: 96aaab9cc247d0b4c98132159688c1af, type: 3} - - {fileID: 2800000, guid: fc3fa8f108657e14486697c9a84ccfc5, type: 3} - - {fileID: 2800000, guid: bfed3e498947fcb4890b7f40f54d85b9, type: 3} - - {fileID: 2800000, guid: d512512f4af60a442ab3458489412954, type: 3} - - {fileID: 2800000, guid: 47a45908f6db0cb44a0d5e961143afec, type: 3} - - {fileID: 2800000, guid: 4dcc0502f8586f941b5c4a66717205e8, type: 3} - - {fileID: 2800000, guid: 9d92991794bb5864c8085468b97aa067, type: 3} - - {fileID: 2800000, guid: 14381521ff11cb74abe3fe65401c23be, type: 3} - - {fileID: 2800000, guid: d36f0fe53425e08499a2333cf423634c, type: 3} - - {fileID: 2800000, guid: d4044ea2490d63b43aa1765f8efbf8a9, type: 3} - - {fileID: 2800000, guid: c9bd74624d8070f429e3f46d161f9204, type: 3} - - {fileID: 2800000, guid: d5c9b274310e5524ebe32a4e4da3df1f, type: 3} - - {fileID: 2800000, guid: f69770e54f2823f43badf77916acad83, type: 3} - - {fileID: 2800000, guid: 10b6c6d22e73dea46a8ab36b6eebd629, type: 3} - - {fileID: 2800000, guid: a2ec5cbf5a9b64345ad3fab0912ddf7b, type: 3} - - {fileID: 2800000, guid: 1c3c6d69a645b804fa232004b96b7ad3, type: 3} - - {fileID: 2800000, guid: d18a24d7b4ed50f4387993566d9d3ae2, type: 3} - - {fileID: 2800000, guid: c989e1ed85cf7154caa922fec53e6af6, type: 3} - - {fileID: 2800000, guid: ff47e5a0f105eb34883b973e51f4db62, type: 3} - - {fileID: 2800000, guid: fa042edbfc40fbd4bad0ab9d505b1223, type: 3} - - {fileID: 2800000, guid: 896d9004736809c4fb5973b7c12eb8b9, type: 3} - - {fileID: 2800000, guid: 179f794063d2a66478e6e726f84a65bc, type: 3} - filmGrainTex: - - {fileID: 2800000, guid: 654c582f7f8a5a14dbd7d119cbde215d, type: 3} - - {fileID: 2800000, guid: dd77ffd079630404e879388999033049, type: 3} - - {fileID: 2800000, guid: 1097e90e1306e26439701489f391a6c0, type: 3} - - {fileID: 2800000, guid: f0b67500f7fad3b4c9f2b13e8f41ba6e, type: 3} - - {fileID: 2800000, guid: 9930fb4528622b34687b00bbe6883de7, type: 3} - - {fileID: 2800000, guid: bd9e8c758250ef449a4b4bfaad7a2133, type: 3} - - {fileID: 2800000, guid: 510a2f57334933e4a8dbabe4c30204e4, type: 3} - - {fileID: 2800000, guid: b4db8180660810945bf8d55ab44352ad, type: 3} - - {fileID: 2800000, guid: fd2fd78b392986e42a12df2177d3b89c, type: 3} - - {fileID: 2800000, guid: 5cdee82a77d13994f83b8fdabed7c301, type: 3} - smaaAreaTex: {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3} - smaaSearchTex: {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3} - m_TexturesResourcesVersion: 0 - - rid: 1499458198383362056 - type: {class: UniversalRenderPipelineRuntimeXRResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_xrOcclusionMeshPS: {fileID: 4800000, guid: 4431b1f1f743fbf4eb310a967890cbea, type: 3} - m_xrMirrorViewPS: {fileID: 4800000, guid: d5a307c014552314b9f560906d708772, type: 3} - m_xrMotionVector: {fileID: 4800000, guid: f89aac1e4f84468418fe30e611dff395, type: 3} - - rid: 1499458198383362057 - type: {class: ScreenSpaceReflectionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Shader: {fileID: 4800000, guid: 7b3e6785f5f6b634794df3a85a2a35da, type: 3} - m_Version: 0 - - rid: 1499458198383362058 - type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} - m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} - m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} - - rid: 1499458198383362059 - type: {class: PostProcessData/ShaderResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - stopNanPS: {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3} - subpixelMorphologicalAntialiasingPS: {fileID: 4800000, guid: 63eaba0ebfb82cc43bde059b4a8c65f6, type: 3} - gaussianDepthOfFieldPS: {fileID: 4800000, guid: 5e7134d6e63e0bc47a1dd2669cedb379, type: 3} - bokehDepthOfFieldPS: {fileID: 4800000, guid: 2aed67ad60045d54ba3a00c91e2d2631, type: 3} - cameraMotionBlurPS: {fileID: 4800000, guid: 1edcd131364091c46a17cbff0b1de97a, type: 3} - paniniProjectionPS: {fileID: 4800000, guid: a15b78cf8ca26ca4fb2090293153c62c, type: 3} - lutBuilderLdrPS: {fileID: 4800000, guid: 65df88701913c224d95fc554db28381a, type: 3} - lutBuilderHdrPS: {fileID: 4800000, guid: ec9fec698a3456d4fb18cf8bacb7a2bc, type: 3} - bloomPS: {fileID: 4800000, guid: 5f1864addb451f54bae8c86d230f736e, type: 3} - temporalAntialiasingPS: {fileID: 4800000, guid: 9c70c1a35ff15f340b38ea84842358bf, type: 3} - LensFlareDataDrivenPS: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3} - LensFlareScreenSpacePS: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, type: 3} - scalingSetupPS: {fileID: 4800000, guid: e8ee25143a34b8c4388709ea947055d1, type: 3} - easuPS: {fileID: 4800000, guid: 562b7ae4f629f144aa97780546fce7c6, type: 3} - uberPostPS: {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3} - finalPostPassPS: {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3} - m_ShaderResourcesVersion: 0 - - rid: 1499458198383362060 - type: {class: URPReflectionProbeSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} - data: - version: 1 - useReflectionProbeRotation: 0 - - rid: 1499458198383362061 - type: {class: LightmapSamplingSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 1 - m_UseBicubicLightmapSampling: 0 - - rid: 1499458198383362062 - type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_version: 0 - m_PanelSettings: {fileID: 0} - m_StyleSheets: - - {fileID: 7433441132597879392, guid: 0ff99fd36f66f1a41bcc1d3c90e0922a, type: 3} - - {fileID: 7433441132597879392, guid: 3a8aa4d508da46d4dace18b280f064aa, type: 3} - m_VisualTreeAsset: {fileID: 0} - - rid: 1499458198383362063 - type: {class: VrsRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_TextureComputeShader: {fileID: 7200000, guid: cacb30de6c40c7444bbc78cb0a81fd2a, type: 3} - m_VisualizationShader: {fileID: 4800000, guid: 620b55b8040a88d468e94abe55bed5ba, type: 3} - m_VisualizationLookupTable: - m_Data: - - {r: 0.785, g: 0.23, b: 0.2, a: 1} - - {r: 1, g: 0.8, b: 0.8, a: 1} - - {r: 0.4, g: 0.2, b: 0.2, a: 1} - - {r: 0.51, g: 0.8, b: 0.6, a: 1} - - {r: 0.6, g: 0.8, b: 1, a: 1} - - {r: 0.2, g: 0.4, b: 0.6, a: 1} - - {r: 0.8, g: 1, b: 0.8, a: 1} - - {r: 0.2, g: 0.4, b: 0.2, a: 1} - - {r: 0.125, g: 0.22, b: 0.36, a: 1} - m_ConversionLookupTable: - m_Data: - - {r: 0.785, g: 0.23, b: 0.2, a: 1} - - {r: 1, g: 0.8, b: 0.8, a: 1} - - {r: 0.4, g: 0.2, b: 0.2, a: 1} - - {r: 0.51, g: 0.8, b: 0.6, a: 1} - - {r: 0.6, g: 0.8, b: 1, a: 1} - - {r: 0.2, g: 0.4, b: 0.6, a: 1} - - {r: 0.8, g: 1, b: 0.8, a: 1} - - {r: 0.2, g: 0.4, b: 0.2, a: 1} - - {r: 0.125, g: 0.22, b: 0.36, a: 1} - - rid: 1499458198383362064 - type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime} - data: - _version: 3 - _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3} - _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3} - _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3} - _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3} - _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2} - _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2} - _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3} - - rid: 6852985685364965376 - type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_StripUnusedPostProcessingVariants: 1 - m_StripUnusedVariants: 1 - m_StripScreenCoordOverrideVariants: 1 - - rid: 6852985685364965377 - type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} - m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3} - m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3} - m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} - m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} - m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} - - rid: 6852985685364965378 - type: {class: UniversalRendererResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - m_CameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3} - m_StencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - m_ClusterDeferred: {fileID: 4800000, guid: 222cce62363a44a380c36bf03b392608, type: 3} - m_StencilDitherMaskSeedPS: {fileID: 4800000, guid: 8c3ee818f2efa514c889881ccb2e95a2, type: 3} - m_DBufferClear: {fileID: 4800000, guid: f056d8bd2a1c7e44e9729144b4c70395, type: 3} - - rid: 6852985685364965379 - type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_DebugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} - m_HdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} - m_ProbeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} - - rid: 6852985685364965380 - type: {class: UniversalRenderPipelineRuntimeShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_FallbackErrorShader: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - m_BlitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} - m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3} - m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - m_TerrainDetailLit: {fileID: 0} - m_TerrainDetailGrassBillboard: {fileID: 0} - m_TerrainDetailGrass: {fileID: 0} - - rid: 6852985685364965381 - type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 1 - m_BlueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} - m_BayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} - m_DebugFontTex: {fileID: 2800000, guid: 26a413214480ef144b2915d6ff4d0beb, type: 3} - - rid: 6852985685364965382 - type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_LightShader: {fileID: 4800000, guid: 3f6c848ca3d7bca4bbe846546ac701a1, type: 3} - m_ProjectedShadowShader: {fileID: 4800000, guid: ce09d4a80b88c5a4eb9768fab4f1ee00, type: 3} - m_SpriteShadowShader: {fileID: 4800000, guid: 44fc62292b65ab04eabcf310e799ccf6, type: 3} - m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3} - m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3} - m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3} - m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} - m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} - m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} - m_DefaultMesh2DLitMaterial: {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} - - rid: 6852985685364965383 - type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_SimpleLitMaterial: {fileID: 2100000, guid: 6a1143ee683302f4aa628c052723efc1, type: 2} - m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} - m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} - m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} - m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} - m_DefaultSpriteMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} - - rid: 6852985685364965384 - type: {class: URPDefaultVolumeProfileSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - m_VolumeProfile: {fileID: 11400000, guid: ab09877e2e707104187f6f83e2f62510, type: 2} - - rid: 6852985685364965385 - type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} - data: - m_Version: 0 - - rid: 6852985685364965386 - type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} - data: - m_Version: 0 - m_InstanceDataBufferCopyKernels: {fileID: 7200000, guid: f984aeb540ded8b4fbb8a2047ab5b2e2, type: 3} - m_InstanceDataBufferUploadKernels: {fileID: 7200000, guid: 53864816eb00f2343b60e1a2c5a262ef, type: 3} - m_TransformUpdaterKernels: {fileID: 7200000, guid: 2a567b9b2733f8d47a700c3c85bed75b, type: 3} - m_WindDataUpdaterKernels: {fileID: 7200000, guid: fde76746e4fd0ed418c224f6b4084114, type: 3} - m_OccluderDepthPyramidKernels: {fileID: 7200000, guid: 08b2b5fb307b0d249860612774a987da, type: 3} - m_InstanceOcclusionCullingKernels: {fileID: 7200000, guid: f6d223acabc2f974795a5a7864b50e6c, type: 3} - m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3} - m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3} - m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} - - rid: 6852985685364965387 - type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} - m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} - m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} - - rid: 6852985685364965388 - type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 1 - dilationShader: {fileID: 7200000, guid: 6bb382f7de370af41b775f54182e491d, type: 3} - subdivideSceneCS: {fileID: 7200000, guid: bb86f1f0af829fd45b2ebddda1245c22, type: 3} - voxelizeSceneShader: {fileID: 4800000, guid: c8b6a681c7b4e2e4785ffab093907f9e, type: 3} - traceVirtualOffsetCS: {fileID: -6772857160820960102, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} - traceVirtualOffsetRT: {fileID: -5126288278712620388, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} - skyOcclusionCS: {fileID: -6772857160820960102, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} - skyOcclusionRT: {fileID: -5126288278712620388, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} - renderingLayerCS: {fileID: -6772857160820960102, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} - renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} - - rid: 6852985685364965389 - type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 1 - m_ProbeVolumeDisableStreamingAssets: 0 - - rid: 6852985685364965390 - type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 1 - probeVolumeDebugShader: {fileID: 4800000, guid: 3b21275fd12d65f49babb5286f040f2d, type: 3} - probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 3a80877c579b9144ebdcc6d923bca303, type: 3} - probeVolumeSamplingDebugShader: {fileID: 4800000, guid: bf54e6528c79a224e96346799064c393, type: 3} - probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3} - probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3} - numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} - - rid: 6852985685364965391 - type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_version: 0 - m_IncludeReferencedInScenes: 0 - m_IncludeAssetsByLabel: 0 - m_LabelToInclude: - - rid: 6852985685364965392 - type: {class: ShaderStrippingSetting, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 0 - m_ExportShaderVariants: 1 - m_ShaderVariantLogLevel: 0 - m_StripRuntimeDebugShaders: 1 - - rid: 6852985685364965393 - type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 1 - probeVolumeBlendStatesCS: {fileID: 7200000, guid: a3f7b8c99de28a94684cb1daebeccf5d, type: 3} - probeVolumeUploadDataCS: {fileID: 7200000, guid: 0951de5992461754fa73650732c4954c, type: 3} - probeVolumeUploadDataL2CS: {fileID: 7200000, guid: 6196f34ed825db14b81fb3eb0ea8d931, type: 3} - - rid: 6852985685364965394 - type: {class: RenderGraphGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_version: 0 - m_EnableCompilationCaching: 1 - m_EnableValidityChecks: 1 - - rid: 8712630790384254976 - type: {class: RenderGraphUtilsResources, ns: UnityEngine.Rendering.RenderGraphModule.Util, asm: Unity.RenderPipelines.Core.Runtime} - data: - m_Version: 0 - m_CoreCopyPS: {fileID: 4800000, guid: 12dc59547ea167a4ab435097dd0f9add, type: 3} diff --git a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta b/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta deleted file mode 100644 index 81b84f2ae1..0000000000 --- a/Examples/NGO-N4E-Unified/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 18dc0cd2c080841dea60987a38ce93fa -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/NGO-N4E-Unified/Packages/manifest.json b/Examples/NGO-N4E-Unified/Packages/manifest.json deleted file mode 100644 index f5b45a0fe6..0000000000 --- a/Examples/NGO-N4E-Unified/Packages/manifest.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "dependencies": { - "com.unity.ai.navigation": "2.0.11", - "com.unity.collab-proxy": "2.11.4", - "com.unity.ide.rider": "3.0.38", - "com.unity.ide.visualstudio": "2.0.26", - "com.unity.inputsystem": "1.19.0", - "com.unity.multiplayer.center": "1.0.1", - "com.unity.netcode": "6.6.0", - "com.unity.netcode.gameobjects": "file:../../../com.unity.netcode.gameobjects", - "com.unity.render-pipelines.universal": "17.6.0", - "com.unity.services.multiplayer": "2.1.3", - "com.unity.test-framework": "1.7.0", - "com.unity.timeline": "1.8.11", - "com.unity.ugui": "2.5.0", - "com.unity.visualscripting": "1.9.10", - "com.unity.modules.accessibility": "1.0.0", - "com.unity.modules.adaptiveperformance": "1.0.0", - "com.unity.modules.ai": "1.0.0", - "com.unity.modules.androidjni": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.cloth": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.physicscore2d": "1.0.0", - "com.unity.modules.screencapture": "1.0.0", - "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.terrainphysics": "1.0.0", - "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.timelinefoundation": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.umbra": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.unitywebrequesttexture": "1.0.0", - "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vectorgraphics": "1.0.0", - "com.unity.modules.vehicles": "1.0.0", - "com.unity.modules.video": "1.0.0", - "com.unity.modules.wind": "1.0.0", - "com.unity.modules.xr": "1.0.0" - }, - "testables": [ - "com.unity.netcode.gameobjects" - ] -} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset deleted file mode 100644 index 27287fec5f..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/AudioManager.asset +++ /dev/null @@ -1,19 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!11 &1 -AudioManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Volume: 1 - Rolloff Scale: 1 - Doppler Factor: 1 - Default Speaker Mode: 2 - m_SampleRate: 0 - m_DSPBufferSize: 1024 - m_VirtualVoiceCount: 512 - m_RealVoiceCount: 32 - m_SpatializerPlugin: - m_AmbisonicDecoderPlugin: - m_DisableAudio: 0 - m_VirtualizeEffects: 1 - m_RequestedDSPBufferSize: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json b/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json deleted file mode 100644 index 6a932fa204..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/BurstAotSettings_StandaloneWindows.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "MonoBehaviour": { - "Version": 5, - "EnableBurstCompilation": false, - "EnableOptimisations": false, - "EnableSafetyChecks": false, - "EnableDebugInAllBuilds": false, - "DebugDataKind": 1, - "EnableArmv9SecurityFeatures": false, - "CpuMinTargetX32": 0, - "CpuMaxTargetX32": 0, - "CpuMinTargetX64": 0, - "CpuMaxTargetX64": 0, - "CpuTargetsX32": 6, - "CpuTargetsX64": 72, - "OptimizeFor": 0, - "FloatMode": 0 - } -} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset deleted file mode 100644 index e7886b266a..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/ClusterInputManager.asset +++ /dev/null @@ -1,6 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!236 &1 -ClusterInputManager: - m_ObjectHideFlags: 0 - m_Inputs: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json b/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json deleted file mode 100644 index a6a6297703..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/CommonBurstAotSettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "MonoBehaviour": { - "Version": 5, - "DisabledWarnings": "" - } -} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset deleted file mode 100644 index fc90ab9589..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/DynamicsManager.asset +++ /dev/null @@ -1,36 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!55 &1 -PhysicsManager: - m_ObjectHideFlags: 0 - serializedVersion: 13 - m_Gravity: {x: 0, y: -9.81, z: 0} - m_DefaultMaterial: {fileID: 0} - m_BounceThreshold: 2 - m_SleepThreshold: 0.005 - m_DefaultContactOffset: 0.01 - m_DefaultSolverIterations: 6 - m_DefaultSolverVelocityIterations: 1 - m_QueriesHitBackfaces: 0 - m_QueriesHitTriggers: 1 - m_EnableAdaptiveForce: 0 - m_ClothInterCollisionDistance: 0.1 - m_ClothInterCollisionStiffness: 0.2 - m_ContactsGeneration: 1 - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - m_AutoSimulation: 1 - m_AutoSyncTransforms: 0 - m_ReuseCollisionCallbacks: 1 - m_ClothInterCollisionSettingsToggle: 0 - m_ClothGravity: {x: 0, y: -9.81, z: 0} - m_ContactPairsMode: 0 - m_BroadphaseType: 0 - m_WorldBounds: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 250, y: 250, z: 250} - m_WorldSubdivisions: 8 - m_FrictionType: 0 - m_EnableEnhancedDeterminism: 0 - m_EnableUnifiedHeightmaps: 1 - m_SolverType: 0 - m_DefaultMaxAngularSpeed: 50 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset deleted file mode 100644 index 398d1e53f0..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/EditorBuildSettings.asset +++ /dev/null @@ -1,12 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1045 &1 -EditorBuildSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Scenes: - - enabled: 1 - path: Assets/Scenes/ExampleHybridSpawn.unity - guid: 99c9720ab356a0642a771bea13969a05 - m_configObjects: - com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset deleted file mode 100644 index 45126b427a..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/EditorSettings.asset +++ /dev/null @@ -1,52 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!159 &1 -EditorSettings: - m_ObjectHideFlags: 0 - serializedVersion: 16 - m_SerializationMode: 2 - m_LineEndingsForNewScripts: 0 - m_DefaultBehaviorMode: 0 - m_PrefabRegularEnvironment: {fileID: 0} - m_PrefabUIEnvironment: {fileID: 0} - m_SpritePackerMode: 0 - m_SpritePackerCacheSize: 10 - m_SpritePackerPaddingPower: 1 - m_Bc7TextureCompressor: 0 - m_EtcTextureCompressorBehavior: 1 - m_EtcTextureFastCompressor: 1 - m_EtcTextureNormalCompressor: 2 - m_EtcTextureBestCompressor: 4 - m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref - m_ProjectGenerationRootNamespace: - m_EnableTextureStreamingInEditMode: 1 - m_EnableTextureStreamingInPlayMode: 1 - m_EnableEditorAsyncCPUTextureLoading: 0 - m_AsyncShaderCompilation: 1 - m_BlockShaders: 0 - m_UnlockBlockShaders: 0 - m_PrefabModeAllowAutoSave: 1 - m_EnterPlayModeOptionsEnabled: 1 - m_EnterPlayModeOptions: 0 - m_GameObjectNamingDigits: 1 - m_GameObjectNamingScheme: 0 - m_AssetNamingUsesSpace: 1 - m_InspectorUseIMGUIDefaultInspector: 0 - m_UseLegacyProbeSampleCount: 0 - m_DisableCookiesInLightmapper: 0 - m_ShadowmaskStitching: 0 - m_AssetPipelineMode: 1 - m_RefreshImportMode: 0 - m_CacheServerMode: 0 - m_CacheServerEndpoint: - m_CacheServerNamespacePrefix: default - m_CacheServerEnableDownload: 1 - m_CacheServerEnableUpload: 1 - m_CacheServerEnableTls: 0 - m_CacheServerImportResultCachingEnabled: 0 - m_CacheServerValidationMode: 2 - m_CacheServerDownloadBatchSize: 128 - m_EnableEnlightenBakedGI: 0 - m_ReferencedClipsExactNaming: 1 - m_ForceAssetUnloadAndGCOnSceneLoad: 1 - m_HideBuildProfileClassicPlatforms: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset deleted file mode 100644 index baf6668fde..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/EntitiesClientSettings.asset +++ /dev/null @@ -1,16 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 53 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2ea235c1fcfe29488ed97c467a0da53, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Entities.Build::Unity.Entities.Build.EntitiesClientSettings - FilterSettings: - ExcludedBakingSystemAssemblies: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset deleted file mode 100644 index dbc7252d4f..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/GraphicsSettings.asset +++ /dev/null @@ -1,81 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!30 &1 -GraphicsSettings: - m_ObjectHideFlags: 0 - serializedVersion: 16 - m_Deferred: - m_Mode: 1 - m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} - m_DeferredReflections: - m_Mode: 1 - m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} - m_ScreenSpaceShadows: - m_Mode: 1 - m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} - m_DepthNormals: - m_Mode: 1 - m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} - m_MotionVectors: - m_Mode: 1 - m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} - m_LightHalo: - m_Mode: 1 - m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} - m_LensFlare: - m_Mode: 1 - m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} - m_VideoShadersIncludeMode: 2 - m_AlwaysIncludedShaders: - - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} - m_PreloadedShaders: [] - m_PreloadShadersBatchTimeLimit: -1 - m_GraphicsStateCollection: {fileID: 0} - m_CollectionStartupAction: 0 - m_TraceSavePath: TracedCollection - m_TraceSendToEditor: 1 - m_AdditionalWarmupCollections: [] - m_WarmupAsync: 1 - m_EnableCacheMissTracing: 0 - m_WarmupProgressivelyLimit: -1 - m_CacheMissCollectionPath: CacheMissCollection - m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_CustomRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2} - m_TransparencySortMode: 0 - m_TransparencySortAxis: {x: 0, y: 0, z: 1} - m_DefaultRenderingPath: 1 - m_DefaultMobileRenderingPath: 1 - m_TierSettings: [] - m_LightmapStripping: 0 - m_FogStripping: 0 - m_InstancingStripping: 0 - m_BrgStripping: 0 - m_DefaultLightBaker: 0 - m_LightmapKeepPlain: 1 - m_LightmapKeepDirCombined: 1 - m_LightmapKeepDynamicPlain: 1 - m_LightmapKeepDynamicDirCombined: 1 - m_LightmapKeepShadowMask: 1 - m_LightmapKeepSubtractive: 1 - m_FogKeepLinear: 1 - m_FogKeepExp: 1 - m_FogKeepExp2: 1 - m_AlbedoSwatchInfos: [] - m_RenderPipelineGlobalSettingsMap: - UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, type: 2} - m_ShaderBuildSettings: - keywordDeclarationOverrides: [] - numInternalDefines: 0 - defines: [] - m_LightsUseLinearIntensity: 1 - m_LightsUseColorTemperature: 1 - m_LogWhenShaderIsCompiled: 0 - m_LightProbeOutsideHullStrategy: 0 - m_CameraRelativeLightCulling: 0 - m_CameraRelativeShadowCulling: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset deleted file mode 100644 index b16147e954..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/InputManager.asset +++ /dev/null @@ -1,487 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!13 &1 -InputManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Axes: - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: left - positiveButton: right - altNegativeButton: a - altPositiveButton: d - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: down - positiveButton: up - altNegativeButton: s - altPositiveButton: w - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left ctrl - altNegativeButton: - altPositiveButton: mouse 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left alt - altNegativeButton: - altPositiveButton: mouse 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left shift - altNegativeButton: - altPositiveButton: mouse 2 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: space - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse X - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse Y - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse ScrollWheel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 2 - joyNum: 0 - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 0 - type: 2 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 1 - type: 2 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 0 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 1 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 2 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 3 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: return - altNegativeButton: - altPositiveButton: joystick button 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: enter - altNegativeButton: - altPositiveButton: space - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Cancel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: escape - altNegativeButton: - altPositiveButton: joystick button 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Enable Debug Button 1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left ctrl - altNegativeButton: - altPositiveButton: joystick button 8 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Enable Debug Button 2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: backspace - altNegativeButton: - altPositiveButton: joystick button 9 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Reset - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left alt - altNegativeButton: - altPositiveButton: joystick button 1 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Next - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: page down - altNegativeButton: - altPositiveButton: joystick button 5 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Previous - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: page up - altNegativeButton: - altPositiveButton: joystick button 4 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Validate - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: return - altNegativeButton: - altPositiveButton: joystick button 0 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Persistent - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: right shift - altNegativeButton: - altPositiveButton: joystick button 2 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Multiplier - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left shift - altNegativeButton: - altPositiveButton: joystick button 3 - gravity: 0 - dead: 0 - sensitivity: 0 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: left - positiveButton: right - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: down - positiveButton: up - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: down - positiveButton: up - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 2 - axis: 6 - joyNum: 0 - - serializedVersion: 3 - m_Name: Debug Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: left - positiveButton: right - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 2 - axis: 5 - joyNum: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset deleted file mode 100644 index 5b5facecac..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/MemorySettings.asset +++ /dev/null @@ -1,35 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!387306366 &1 -MemorySettings: - m_ObjectHideFlags: 0 - m_EditorMemorySettings: - m_MainAllocatorBlockSize: -1 - m_ThreadAllocatorBlockSize: -1 - m_MainGfxBlockSize: -1 - m_ThreadGfxBlockSize: -1 - m_CacheBlockSize: -1 - m_TypetreeBlockSize: -1 - m_ProfilerBlockSize: -1 - m_ProfilerEditorBlockSize: -1 - m_BucketAllocatorGranularity: -1 - m_BucketAllocatorBucketsCount: -1 - m_BucketAllocatorBlockSize: -1 - m_BucketAllocatorBlockCount: -1 - m_ProfilerBucketAllocatorGranularity: -1 - m_ProfilerBucketAllocatorBucketsCount: -1 - m_ProfilerBucketAllocatorBlockSize: -1 - m_ProfilerBucketAllocatorBlockCount: -1 - m_TempAllocatorSizeMain: -1 - m_JobTempAllocatorBlockSize: -1 - m_BackgroundJobTempAllocatorBlockSize: -1 - m_JobTempAllocatorReducedBlockSize: -1 - m_TempAllocatorSizeGIBakingWorker: -1 - m_TempAllocatorSizeNavMeshWorker: -1 - m_TempAllocatorSizeAudioWorker: -1 - m_TempAllocatorSizeCloudWorker: -1 - m_TempAllocatorSizeGfx: -1 - m_TempAllocatorSizeJobWorker: -1 - m_TempAllocatorSizeBackgroundWorker: -1 - m_TempAllocatorSizePreloadManager: -1 - m_PlatformMemorySettings: {} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset deleted file mode 100644 index f1d03dfbac..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/MultiplayerManager.asset +++ /dev/null @@ -1,9 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!655991488 &1 -MultiplayerManager: - m_ObjectHideFlags: 0 - m_EnableMultiplayerRoles: 0 - m_StrippingTypes: - 1: [] - 2: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset deleted file mode 100644 index 3b0b7c3d18..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/NavMeshAreas.asset +++ /dev/null @@ -1,91 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!126 &1 -NavMeshProjectSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - areas: - - name: Walkable - cost: 1 - - name: Not Walkable - cost: 1 - - name: Jump - cost: 2 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - m_LastAgentTypeID: -887442657 - m_Settings: - - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.75 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_SettingNames: - - Humanoid diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset deleted file mode 100644 index f7669489e9..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientAndServerSettings.asset +++ /dev/null @@ -1,41 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4111970df3904877aade1a474116e5c2, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeClientAndServerSettings - FilterSettings: - ExcludedBakingSystemAssemblies: [] - AdditionalScriptingDefines: [] - GlobalNetCodeConfig: {fileID: 11400000, guid: 70e9b26fe069d0a449180c6f69a25b8e, type: 2} - CurrentImportanceSuggestions: - - MinValue: 1 - MaxValue: 4 - Name: Low Importance - Tooltip: For cosmetic (i.e. visual-only) ghosts like glass bottles, signs, beach-balls, - and cones etc. Typically Static. - - MinValue: 5 - MaxValue: 40 - Name: Medium Importance - Tooltip: For common gameplay-affecting ghosts like trees, doors, explosive barrels, - dropped loot etc. Typically Static. - - MinValue: 50 - MaxValue: 250 - Name: High Importance - Tooltip: For per-player and objective-critical ghosts like Player Character Controllers - and CTF flags etc. Typically for Dynamic i.e. Predicted ghosts. - UsePreSerialization is likely a good fit. - - MinValue: 1000 - MaxValue: 0 - Name: Critical Importance - Tooltip: For gameplay critical singletons like the one keeping the current score, - or the one denoting whether or not the current round has started etc. Choose - UsePreSerialization, and use sparingly. diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset deleted file mode 100644 index 58930c0c7b..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeClientSettings.asset +++ /dev/null @@ -1,18 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2e9c940b409a48c5acdcb17d07582bb1, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeClientSettings - FilterSettings: - ExcludedBakingSystemAssemblies: [] - AdditionalScriptingDefines: [] - ClientTarget: 1 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset deleted file mode 100644 index 88da96cee2..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/NetCodeServerSettings.asset +++ /dev/null @@ -1,17 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 70bae3f5df04479cba47f4cd56a60d53, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeServerSettings - FilterSettings: - ExcludedBakingSystemAssemblies: [] - AdditionalScriptingDefines: [] diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset deleted file mode 100644 index c646e41a07..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/PackageManagerSettings.asset +++ /dev/null @@ -1,44 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_EnablePreReleasePackages: 0 - m_AdvancedSettingsExpanded: 1 - m_ScopedRegistriesSettingsExpanded: 1 - m_SeeAllPackageVersions: 0 - m_DismissPreviewPackagesInUse: 0 - oneTimeWarningShown: 0 - oneTimePackageErrorsPopUpShown: 0 - m_MainRegistry: - m_Id: main - m_Name: - m_Url: https://packages.unity.com - m_Scopes: [] - m_IsDefault: 1 - m_IsUnityRegistry: 1 - m_Capabilities: 7 - m_ConfigSource: 0 - m_Compliance: - m_Status: 0 - m_Violations: [] - m_ScopedRegistries: [] - m_UserSelectedRegistryName: - m_UserAddingNewScopedRegistry: 0 - m_RegistryInfoDraft: - m_Modified: 0 - m_ErrorMessage: - m_UserModificationsEntityId: - m_Data: -928 - m_OriginalEntityId: - m_Data: -930 - m_LoadAssets: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset deleted file mode 100644 index 6c5cf8a004..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/Physics2DSettings.asset +++ /dev/null @@ -1,56 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!19 &1 -Physics2DSettings: - m_ObjectHideFlags: 0 - serializedVersion: 4 - m_Gravity: {x: 0, y: -9.81} - m_DefaultMaterial: {fileID: 0} - m_VelocityIterations: 8 - m_PositionIterations: 3 - m_VelocityThreshold: 1 - m_MaxLinearCorrection: 0.2 - m_MaxAngularCorrection: 8 - m_MaxTranslationSpeed: 100 - m_MaxRotationSpeed: 360 - m_BaumgarteScale: 0.2 - m_BaumgarteTimeOfImpactScale: 0.75 - m_TimeToSleep: 0.5 - m_LinearSleepTolerance: 0.01 - m_AngularSleepTolerance: 2 - m_DefaultContactOffset: 0.01 - m_JobOptions: - serializedVersion: 2 - useMultithreading: 0 - useConsistencySorting: 0 - m_InterpolationPosesPerJob: 100 - m_NewContactsPerJob: 30 - m_CollideContactsPerJob: 100 - m_ClearFlagsPerJob: 200 - m_ClearBodyForcesPerJob: 200 - m_SyncDiscreteFixturesPerJob: 50 - m_SyncContinuousFixturesPerJob: 50 - m_FindNearestContactsPerJob: 100 - m_UpdateTriggerContactsPerJob: 100 - m_IslandSolverCostThreshold: 100 - m_IslandSolverBodyCostScale: 1 - m_IslandSolverContactCostScale: 10 - m_IslandSolverJointCostScale: 10 - m_IslandSolverBodiesPerJob: 50 - m_IslandSolverContactsPerJob: 50 - m_AutoSimulation: 1 - m_QueriesHitTriggers: 1 - m_QueriesStartInColliders: 1 - m_CallbacksOnDisable: 1 - m_ReuseCollisionCallbacks: 0 - m_AutoSyncTransforms: 0 - m_AlwaysShowColliders: 0 - m_ShowColliderSleep: 1 - m_ShowColliderContacts: 0 - m_ShowColliderAABB: 0 - m_ContactArrowScale: 0.2 - m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} - m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} - m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} - m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset deleted file mode 100644 index 049c7454b5..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/PhysicsCoreProjectSettings2D.asset +++ /dev/null @@ -1,6 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!176606843 &1 -PhysicsCoreProjectSettings2D: - m_ObjectHideFlags: 0 - m_PhysicsCoreSettings: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset deleted file mode 100644 index 67a94daefe..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/PresetManager.asset +++ /dev/null @@ -1,7 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1386491679 &1 -PresetManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_DefaultPresets: {} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset deleted file mode 100644 index 4148ec39fe..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectSettings.asset +++ /dev/null @@ -1,948 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!129 &1 -PlayerSettings: - m_ObjectHideFlags: 0 - serializedVersion: 28 - productGUID: 6fcde3c494e537b45adf2ff21120a1fa - AndroidProfiler: 0 - AndroidFilterTouchesWhenObscured: 0 - AndroidEnableSustainedPerformanceMode: 0 - defaultScreenOrientation: 4 - targetDevice: 2 - useOnDemandResources: 0 - accelerometerFrequency: 60 - companyName: DefaultCompany - productName: N4ETestPad - defaultCursor: {fileID: 0} - cursorHotspot: {x: 0, y: 0} - m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} - m_ShowUnitySplashScreen: 1 - m_ShowUnitySplashLogo: 1 - m_SplashScreenOverlayOpacity: 1 - m_SplashScreenAnimation: 1 - m_SplashScreenLogoStyle: 1 - m_SplashScreenDrawMode: 0 - m_SplashScreenBackgroundAnimationZoom: 1 - m_SplashScreenLogoAnimationZoom: 1 - m_SplashScreenBackgroundLandscapeAspect: 1 - m_SplashScreenBackgroundPortraitAspect: 1 - m_SplashScreenBackgroundLandscapeUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenBackgroundPortraitUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenLogos: [] - m_VirtualRealitySplashScreen: {fileID: 0} - defaultScreenWidth: 1024 - defaultScreenHeight: 768 - defaultScreenWidthWeb: 960 - defaultScreenHeightWeb: 600 - m_StereoRenderingPath: 0 - m_ActiveColorSpace: 1 - unsupportedMSAAFallback: 0 - m_SpriteBatchMaxVertexCount: 65535 - m_SpriteBatchVertexThreshold: 300 - m_MTRendering: 1 - mipStripping: 0 - numberOfMipsStripped: 0 - numberOfMipsStrippedPerMipmapLimitGroup: {} - m_StackTraceTypes: 010000000100000001000000010000000100000001000000 - iosShowActivityIndicatorOnLoading: -1 - androidShowActivityIndicatorOnLoading: -1 - iosUseCustomAppBackgroundBehavior: 0 - allowedAutorotateToPortrait: 1 - allowedAutorotateToPortraitUpsideDown: 1 - allowedAutorotateToLandscapeRight: 1 - allowedAutorotateToLandscapeLeft: 1 - useOSAutorotation: 1 - use32BitDisplayBuffer: 1 - preserveFramebufferAlpha: 0 - adjustIOSFPSUsingThermalState: 1 - thermalStateSeriousIOSFPS: 30 - thermalStateCriticalIOSFPS: 15 - disableDepthAndStencilBuffers: 0 - androidStartInFullscreen: 1 - androidRenderOutsideSafeArea: 1 - androidUseSwappy: 0 - androidRequestedVisibleInsets: 0 - androidSystemBarsBehavior: 2 - androidDisplayOptions: 1 - androidBlitType: 0 - androidResizeableActivity: 1 - androidDefaultWindowWidth: 1920 - androidDefaultWindowHeight: 1080 - androidMinimumWindowWidth: 400 - androidMinimumWindowHeight: 300 - androidFullscreenMode: 1 - androidAutoRotationBehavior: 1 - androidPredictiveBackSupport: 1 - androidApplicationEntry: 2 - defaultIsNativeResolution: 1 - macRetinaSupport: 1 - runInBackground: 0 - muteOtherAudioSources: 0 - Prepare IOS For Recording: 0 - Force IOS Speakers When Recording: 0 - audioSpatialExperience: 0 - deferSystemGesturesMode: 0 - hideHomeButton: 0 - submitAnalytics: 1 - usePlayerLog: 1 - dedicatedServerOptimizations: 1 - bakeCollisionMeshes: 0 - forceSingleInstance: 0 - useFlipModelSwapchain: 1 - resizableWindow: 0 - useMacAppStoreValidation: 0 - macAppStoreCategory: public.app-category.games - gpuSkinning: 1 - meshDeformation: 2 - xboxPIXTextureCapture: 0 - xboxEnableAvatar: 0 - xboxEnableKinect: 0 - xboxEnableKinectAutoTracking: 0 - xboxEnableFitness: 0 - visibleInBackground: 1 - allowFullscreenSwitch: 1 - fullscreenMode: 1 - xboxSpeechDB: 0 - xboxEnableHeadOrientation: 0 - xboxEnableGuest: 0 - xboxEnablePIXSampling: 0 - metalFramebufferOnly: 0 - metalUseMetalDisplayLink: 0 - xboxOneResolution: 0 - xboxOneSResolution: 0 - xboxOneXResolution: 3 - xboxOneMonoLoggingLevel: 0 - xboxOneLoggingLevel: 1 - xboxOneDisableEsram: 0 - xboxOneEnableTypeOptimization: 0 - xboxOnePresentImmediateThreshold: 0 - switchQueueCommandMemory: 1048576 - switchQueueControlMemory: 16384 - switchQueueComputeMemory: 262144 - switchNVNShaderPoolsGranularity: 33554432 - switchNVNDefaultPoolsGranularity: 16777216 - switchNVNOtherPoolsGranularity: 16777216 - switchGpuScratchPoolGranularity: 2097152 - switchAllowGpuScratchShrinking: 0 - switchNVNMaxPublicTextureIDCount: 0 - switchNVNMaxPublicSamplerIDCount: 0 - switchMaxWorkerMultiple: 8 - switchNVNGraphicsFirmwareMemory: 32 - switchGraphicsJobsSyncAfterKick: 1 - vulkanNumSwapchainBuffers: 3 - vulkanEnableSetSRGBWrite: 0 - vulkanEnablePreTransform: 1 - vulkanEnableLateAcquireNextImage: 0 - vulkanEnableCommandBufferRecycling: 1 - loadStoreDebugModeEnabled: 0 - visionOSBundleVersion: 1.0 - tvOSBundleVersion: 1.0 - bundleVersion: 0.1.0 - preloadedAssets: [] - metroInputSource: 0 - wsaTransparentSwapchain: 0 - xboxOneDisableKinectGpuReservation: 1 - xboxOneEnable7thCore: 1 - vrSettings: - enable360StereoCapture: 0 - enableFrameTimingStats: 0 - enableOpenGLProfilerGPURecorders: 1 - allowHDRDisplaySupport: 0 - useHDRDisplay: 0 - hdrBitDepth: 0 - m_ColorGamuts: 00000000 - targetPixelDensity: 30 - resolutionScalingMode: 0 - resetResolutionOnWindowResize: 0 - androidSupportedAspectRatio: 1 - androidMaxAspectRatio: 2.4 - androidMinAspectRatio: 1 - applicationIdentifier: - Android: com.UnityTechnologies.com.unity.template.urpblank - Standalone: com.Unity-Technologies.com.unity.template.urp-blank - iPhone: com.Unity-Technologies.com.unity.template.urp-blank - buildNumber: - Standalone: 0 - VisionOS: 0 - iPhone: 0 - tvOS: 0 - overrideDefaultApplicationIdentifier: 1 - AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 26 - AndroidTargetSdkVersion: 0 - AndroidPreferredInstallLocation: 1 - AndroidPreferredDataLocation: 1 - aotOptions: - stripEngineCode: 1 - iPhoneStrippingLevel: 0 - iPhoneScriptCallOptimization: 0 - ForceInternetPermission: 0 - ForceSDCardPermission: 0 - CreateWallpaper: 0 - androidSplitApplicationBinary: 0 - keepLoadedShadersAlive: 0 - StripUnusedMeshComponents: 0 - strictShaderVariantMatching: 0 - VertexChannelCompressionMask: 4054 - iPhoneSdkVersion: 988 - iOSSimulatorArchitecture: 0 - iOSTargetOSVersionString: 15.0 - tvOSSdkVersion: 0 - tvOSSimulatorArchitecture: 0 - tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 15.0 - VisionOSSdkVersion: 0 - VisionOSTargetOSVersionString: 1.0 - xcodeProjectType: 0 - uIPrerenderedIcon: 0 - uIRequiresPersistentWiFi: 0 - uIRequiresFullScreen: 1 - uIStatusBarHidden: 1 - uIExitOnSuspend: 0 - uIStatusBarStyle: 0 - appleTVSplashScreen: {fileID: 0} - appleTVSplashScreen2x: {fileID: 0} - tvOSSmallIconLayers: [] - tvOSSmallIconLayers2x: [] - tvOSLargeIconLayers: [] - tvOSLargeIconLayers2x: [] - tvOSTopShelfImageLayers: [] - tvOSTopShelfImageLayers2x: [] - tvOSTopShelfImageWideLayers: [] - tvOSTopShelfImageWideLayers2x: [] - iOSLaunchScreenType: 0 - iOSLaunchScreenPortrait: {fileID: 0} - iOSLaunchScreenLandscape: {fileID: 0} - iOSLaunchScreenBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreenFillPct: 100 - iOSLaunchScreenSize: 100 - iOSLaunchScreeniPadType: 0 - iOSLaunchScreeniPadImage: {fileID: 0} - iOSLaunchScreeniPadBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreeniPadFillPct: 100 - iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: - iOSDeviceRequirements: [] - iOSURLSchemes: [] - macOSURLSchemes: [] - iOSBackgroundModes: 0 - iOSMetalForceHardShadows: 0 - metalEditorSupport: 1 - metalAPIValidation: 1 - metalCompileShaderBinary: 0 - iOSRenderExtraFrameOnPause: 0 - iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: - iOSManualSigningProvisioningProfileType: 0 - tvOSManualSigningProvisioningProfileType: 0 - VisionOSManualSigningProvisioningProfileType: 0 - appleEnableAutomaticSigning: 0 - iOSRequireARKit: 0 - iOSAutomaticallyDetectAndAddCapabilities: 1 - appleEnableProMotion: 0 - shaderPrecisionModel: 0 - clonedFromGUID: 3c72c65a16f0acb438eed22b8b16c24a - templatePackageId: com.unity.template.urp-blank@17.0.14 - templateDefaultScene: Assets/Scenes/SampleScene.unity - useCustomMainManifest: 0 - useCustomLauncherManifest: 0 - useCustomMainGradleTemplate: 0 - useCustomLauncherGradleManifest: 0 - useCustomBaseGradleTemplate: 0 - useCustomGradlePropertiesTemplate: 0 - useCustomGradleSettingsTemplate: 0 - useCustomProguardFile: 0 - AndroidTargetArchitectures: 2 - AndroidSplashScreenScale: 0 - androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: - AndroidEnableArmv9SecurityFeatures: 0 - AndroidEnableArm64MTE: 0 - AndroidBuildApkPerCpuArchitecture: 0 - AndroidTVCompatibility: 0 - AndroidIsGame: 1 - androidAppCategory: 3 - useAndroidAppCategory: 1 - androidAppCategoryOther: - AndroidEnableTango: 0 - androidEnableBanner: 1 - androidUseLowAccuracyLocation: 0 - androidUseCustomKeystore: 0 - m_AndroidBanners: - - width: 320 - height: 180 - banner: {fileID: 0} - androidGamepadSupportLevel: 0 - AndroidMinifyRelease: 0 - AndroidMinifyDebug: 0 - AndroidValidateAppBundleSize: 1 - AndroidAppBundleSizeToValidate: 150 - AndroidReportGooglePlayAppDependencies: 1 - androidSymbolsSizeThreshold: 800 - m_BuildTargetIcons: [] - m_BuildTargetPlatformIcons: - - m_BuildTarget: iPhone - m_Icons: - - m_Textures: [] - m_Width: 180 - m_Height: 180 - m_Kind: 0 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 120 - m_Height: 120 - m_Kind: 0 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 167 - m_Height: 167 - m_Kind: 0 - m_SubKind: iPad - - m_Textures: [] - m_Width: 152 - m_Height: 152 - m_Kind: 0 - m_SubKind: iPad - - m_Textures: [] - m_Width: 76 - m_Height: 76 - m_Kind: 0 - m_SubKind: iPad - - m_Textures: [] - m_Width: 120 - m_Height: 120 - m_Kind: 3 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 80 - m_Height: 80 - m_Kind: 3 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 80 - m_Height: 80 - m_Kind: 3 - m_SubKind: iPad - - m_Textures: [] - m_Width: 40 - m_Height: 40 - m_Kind: 3 - m_SubKind: iPad - - m_Textures: [] - m_Width: 87 - m_Height: 87 - m_Kind: 1 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 58 - m_Height: 58 - m_Kind: 1 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 29 - m_Height: 29 - m_Kind: 1 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 58 - m_Height: 58 - m_Kind: 1 - m_SubKind: iPad - - m_Textures: [] - m_Width: 29 - m_Height: 29 - m_Kind: 1 - m_SubKind: iPad - - m_Textures: [] - m_Width: 60 - m_Height: 60 - m_Kind: 2 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 40 - m_Height: 40 - m_Kind: 2 - m_SubKind: iPhone - - m_Textures: [] - m_Width: 40 - m_Height: 40 - m_Kind: 2 - m_SubKind: iPad - - m_Textures: [] - m_Width: 20 - m_Height: 20 - m_Kind: 2 - m_SubKind: iPad - - m_Textures: [] - m_Width: 1024 - m_Height: 1024 - m_Kind: 4 - m_SubKind: App Store - - m_BuildTarget: Android - m_Icons: - - m_Textures: [] - m_Width: 432 - m_Height: 432 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 324 - m_Height: 324 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 216 - m_Height: 216 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 162 - m_Height: 162 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 108 - m_Height: 108 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 81 - m_Height: 81 - m_Kind: 2 - m_SubKind: - - m_Textures: [] - m_Width: 192 - m_Height: 192 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 144 - m_Height: 144 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 96 - m_Height: 96 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 72 - m_Height: 72 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 48 - m_Height: 48 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 36 - m_Height: 36 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 192 - m_Height: 192 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 144 - m_Height: 144 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 96 - m_Height: 96 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 72 - m_Height: 72 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 48 - m_Height: 48 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 36 - m_Height: 36 - m_Kind: 0 - m_SubKind: - - m_BuildTarget: tvOS - m_Icons: - - m_Textures: [] - m_Width: 1280 - m_Height: 768 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 800 - m_Height: 480 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 400 - m_Height: 240 - m_Kind: 0 - m_SubKind: - - m_Textures: [] - m_Width: 4640 - m_Height: 1440 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 2320 - m_Height: 720 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 3840 - m_Height: 1440 - m_Kind: 1 - m_SubKind: - - m_Textures: [] - m_Width: 1920 - m_Height: 720 - m_Kind: 1 - m_SubKind: - m_BuildTargetBatching: [] - m_BuildTargetShaderSettings: [] - m_BuildTargetGraphicsJobs: [] - m_BuildTargetGraphicsJobMode: [] - m_BuildTargetGraphicsAPIs: - - m_BuildTarget: iOSSupport - m_APIs: 10000000 - m_Automatic: 1 - - m_BuildTarget: AndroidPlayer - m_APIs: 150000000b000000 - m_Automatic: 0 - m_DefaultShaderChunkSizeInMB: 16 - m_DefaultShaderChunkCount: 0 - openGLRequireES31: 0 - openGLRequireES31AEP: 0 - openGLRequireES32: 0 - m_TemplateCustomTags: {} - mobileMTRendering: - Android: 1 - iPhone: 1 - tvOS: 1 - m_BuildTargetGroupLightmapEncodingQuality: - - serializedVersion: 2 - m_BuildTarget: Android - m_EncodingQuality: 1 - m_BuildTargetGroupHDRCubemapEncodingQuality: [] - m_BuildTargetGroupLightmapSettings: [] - m_BuildTargetGroupLoadStoreDebugModeSettings: [] - m_BuildTargetNormalMapEncoding: - - m_BuildTarget: Android - m_Encoding: 1 - m_BuildTargetDefaultTextureCompressionFormat: - - serializedVersion: 3 - m_BuildTarget: Android - m_Formats: 03000000 - playModeTestRunnerEnabled: 0 - runPlayModeTestAsEditModeTest: 0 - actionOnDotNetUnhandledException: 1 - editorGfxJobOverride: 1 - enableInternalProfiler: 0 - logObjCUncaughtExceptions: 1 - enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: - macOSTargetOSVersion: 12.0 - switchNMETAOverride: - switchNetLibKey: - switchSocketMemoryPoolSize: 6144 - switchSocketAllocatorPoolSize: 128 - switchSocketConcurrencyLimit: 14 - switchScreenResolutionBehavior: 2 - switchUseCPUProfiler: 0 - switchEnableFileSystemTrace: 0 - switchLTOSetting: 0 - switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: - switchIcons_0: {fileID: 0} - switchIcons_1: {fileID: 0} - switchIcons_2: {fileID: 0} - switchIcons_3: {fileID: 0} - switchIcons_4: {fileID: 0} - switchIcons_5: {fileID: 0} - switchIcons_6: {fileID: 0} - switchIcons_7: {fileID: 0} - switchIcons_8: {fileID: 0} - switchIcons_9: {fileID: 0} - switchIcons_10: {fileID: 0} - switchIcons_11: {fileID: 0} - switchIcons_12: {fileID: 0} - switchIcons_13: {fileID: 0} - switchIcons_14: {fileID: 0} - switchIcons_15: {fileID: 0} - switchSmallIcons_0: {fileID: 0} - switchSmallIcons_1: {fileID: 0} - switchSmallIcons_2: {fileID: 0} - switchSmallIcons_3: {fileID: 0} - switchSmallIcons_4: {fileID: 0} - switchSmallIcons_5: {fileID: 0} - switchSmallIcons_6: {fileID: 0} - switchSmallIcons_7: {fileID: 0} - switchSmallIcons_8: {fileID: 0} - switchSmallIcons_9: {fileID: 0} - switchSmallIcons_10: {fileID: 0} - switchSmallIcons_11: {fileID: 0} - switchSmallIcons_12: {fileID: 0} - switchSmallIcons_13: {fileID: 0} - switchSmallIcons_14: {fileID: 0} - switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: - switchMainThreadStackSize: 1048576 - switchPresenceGroupId: - switchLogoHandling: 0 - switchReleaseVersion: 0 - switchDisplayVersion: 1.0.0 - switchStartupUserAccount: 0 - switchSupportedLanguagesMask: 0 - switchLogoType: 0 - switchApplicationErrorCodeCategory: - switchUserAccountSaveDataSize: 0 - switchUserAccountSaveDataJournalSize: 0 - switchApplicationAttribute: 0 - switchCardSpecSize: -1 - switchCardSpecClock: -1 - switchRatingsMask: 0 - switchRatingsInt_0: 0 - switchRatingsInt_1: 0 - switchRatingsInt_2: 0 - switchRatingsInt_3: 0 - switchRatingsInt_4: 0 - switchRatingsInt_5: 0 - switchRatingsInt_6: 0 - switchRatingsInt_7: 0 - switchRatingsInt_8: 0 - switchRatingsInt_9: 0 - switchRatingsInt_10: 0 - switchRatingsInt_11: 0 - switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: - switchParentalControl: 0 - switchAllowsScreenshot: 1 - switchAllowsVideoCapturing: 1 - switchAllowsRuntimeAddOnContentInstall: 0 - switchDataLossConfirmation: 0 - switchUserAccountLockEnabled: 0 - switchSystemResourceMemory: 16777216 - switchSupportedNpadStyles: 22 - switchNativeFsCacheSize: 32 - switchIsHoldTypeHorizontal: 0 - switchSupportedNpadCount: 8 - switchEnableTouchScreen: 1 - switchSocketConfigEnabled: 0 - switchTcpInitialSendBufferSize: 32 - switchTcpInitialReceiveBufferSize: 64 - switchTcpAutoSendBufferSizeMax: 256 - switchTcpAutoReceiveBufferSizeMax: 256 - switchUdpSendBufferSize: 9 - switchUdpReceiveBufferSize: 42 - switchSocketBufferEfficiency: 4 - switchSocketInitializeEnabled: 1 - switchNetworkInterfaceManagerInitializeEnabled: 1 - switchDisableHTCSPlayerConnection: 0 - switchUseNewStyleFilepaths: 0 - switchUseLegacyFmodPriorities: 0 - switchUseMicroSleepForYield: 1 - switchEnableRamDiskSupport: 0 - switchMicroSleepForYieldTime: 25 - switchRamDiskSpaceSize: 12 - switchUpgradedPlayerSettingsToNMETA: 0 - switchCaStoreSource: 0 - switchCaStoreFilePath: - ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: - ps4ParentalLevel: 11 - ps4ContentID: ED1633-NPXX51362_00-0000000000000000 - ps4Category: 0 - ps4MasterVersion: 01.00 - ps4AppVersion: 01.00 - ps4AppType: 0 - ps4ParamSfxPath: - ps4VideoOutPixelFormat: 0 - ps4VideoOutInitialWidth: 1920 - ps4VideoOutBaseModeInitialWidth: 1920 - ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: - ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: - ps4PlayTogetherPlayerCount: 0 - ps4EnterButtonAssignment: 2 - ps4ApplicationParam1: 0 - ps4ApplicationParam2: 0 - ps4ApplicationParam3: 0 - ps4ApplicationParam4: 0 - ps4DownloadDataSize: 0 - ps4GarlicHeapSize: 2048 - ps4ProGarlicHeapSize: 2560 - playerPrefsMaxSize: 32768 - ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ - ps4pnSessions: 1 - ps4pnPresence: 1 - ps4pnFriends: 1 - ps4pnGameCustomData: 1 - playerPrefsSupport: 0 - enableApplicationExit: 0 - resetTempFolder: 1 - restrictedAudioUsageRights: 0 - ps4UseResolutionFallback: 0 - ps4ReprojectionSupport: 0 - ps4UseAudio3dBackend: 0 - ps4UseLowGarlicFragmentationMode: 1 - ps4SocialScreenEnabled: 0 - ps4ScriptOptimizationLevel: 2 - ps4Audio3dVirtualSpeakerCount: 14 - ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: - ps4PatchDayOne: 0 - ps4attribUserManagement: 0 - ps4attribMoveSupport: 0 - ps4attrib3DSupport: 0 - ps4attribShareSupport: 0 - ps4attribExclusiveVR: 0 - ps4disableAutoHideSplash: 0 - ps4videoRecordingFeaturesUsed: 0 - ps4contentSearchFeaturesUsed: 0 - ps4CompatibilityPS5: 0 - ps4AllowPS5Detection: 0 - ps4GPU800MHz: 1 - ps4attribEyeToEyeDistanceSettingVR: 0 - ps4IncludedModules: [] - ps4attribVROutputEnabled: 0 - monoEnv: - splashScreenBackgroundSourceLandscape: {fileID: 0} - splashScreenBackgroundSourcePortrait: {fileID: 0} - blurSplashScreenBackground: 1 - spritePackerPolicy: - webGLMemorySize: 32 - webGLExceptionSupport: 1 - webGLNameFilesAsHashes: 0 - webGLShowDiagnostics: 0 - webGLDataCaching: 1 - webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: - webGLTemplate: APPLICATION:Default - webGLAnalyzeBuildSize: 0 - webGLUseEmbeddedResources: 0 - webGLCompressionFormat: 0 - webGLWasmArithmeticExceptions: 0 - webGLLinkerTarget: 1 - webGLThreadsSupport: 0 - webGLDecompressionFallback: 0 - webGLInitialMemorySize: 32 - webGLMaximumMemorySize: 2048 - webGLMemoryGrowthMode: 2 - webGLMemoryLinearGrowthStep: 16 - webGLMemoryGeometricGrowthStep: 0.2 - webGLMemoryGeometricGrowthCap: 96 - webGLPowerPreference: 2 - webGLWebAssemblyTable: 0 - webGLWebAssemblyBigInt: 0 - webGLCloseOnQuit: 0 - webWasm2023: 1 - webEnableSubmoduleStrippingCompatibility: 0 - scriptingDefineSymbols: - Standalone: NETCODE_GAMEOBJECT_BRIDGE_EXPERIMENTAL;NETCODE_EXPERIMENTAL_SINGLE_WORLD_HOST;UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD;OUT_OF_BAND_RPC - additionalCompilerArguments: {} - platformArchitecture: {} - scriptingBackend: - Android: 1 - il2cppCompilerConfiguration: {} - il2cppCodeGeneration: {} - il2cppLTOMode: {} - il2cppStacktraceInformation: {} - managedStrippingLevel: {} - incrementalIl2cppBuild: {} - suppressCommonWarnings: 1 - allowUnsafeCode: 0 - useDeterministicCompilation: 1 - additionalIl2CppArgs: - scriptingRuntimeVersion: 1 - gcIncremental: 1 - gcWBarrierValidation: 0 - apiCompatibilityLevelPerPlatform: {} - editorAssembliesCompatibilityLevel: 1 - m_RenderingPath: 1 - m_MobileRenderingPath: 1 - metroPackageName: N4ETestPad - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: - metroCertificateNotAfter: 0000000000000000 - metroApplicationDescription: N4ETestPad - wsaImages: {} - metroTileShortName: - metroTileShowName: 0 - metroMediumTileShowName: 0 - metroLargeTileShowName: 0 - metroWideTileShowName: 0 - metroSupportStreamingInstall: 0 - metroLastRequiredScene: 0 - metroDefaultTileSize: 1 - metroTileForegroundText: 2 - metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} - metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} - metroSplashScreenUseBackgroundColor: 0 - syncCapabilities: 0 - platformCapabilities: {} - metroTargetDeviceFamilies: {} - metroFTAName: - metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: - XboxOneVersion: 1.0.0.0 - XboxOnePackageEncryption: 0 - XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: - XboxOneLanguage: - - enus - XboxOneCapability: [] - XboxOneGameRating: {} - XboxOneIsContentPackage: 0 - XboxOneEnhancedXboxCompatibilityMode: 0 - XboxOneEnableGPUVariability: 1 - XboxOneSockets: {} - XboxOneSplashScreen: {fileID: 0} - XboxOneAllowedProductIds: [] - XboxOnePersistentLocalStorageSize: 0 - XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: - cloudServicesEnabled: {} - luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: - luminCert: - m_CertPath: - m_SignPackage: 1 - luminIsChannelApp: 0 - luminVersion: - m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: - hmiForceSRGBBlit: 1 - embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: - hmiLogStartupTiming: 0 - qnxGraphicConfPath: - apiCompatibilityLevel: 6 - captureStartupLogs: {} - activeInputHandler: 2 - windowsGamepadBackendHint: 0 - enableDirectStorage: 0 - cloudProjectId: - framebufferDepthMemorylessMode: 0 - qualitySettingsNames: [] - projectName: - organizationId: - cloudEnabled: 0 - legacyClampBlendShapeWeights: 0 - hmiLoadingImage: {fileID: 0} - platformRequiresReadableAssets: 0 - virtualTexturingSupportEnabled: 0 - insecureHttpOption: 0 - androidVulkanDenyFilterList: [] - androidVulkanAllowFilterList: [] - androidVulkanDeviceFilterListAsset: {fileID: 0} - d3d12DeviceFilterListAsset: {fileID: 0} - allowedHttpConnections: 3 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt b/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt deleted file mode 100644 index 78dd0ec189..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/ProjectVersion.txt +++ /dev/null @@ -1,2 +0,0 @@ -m_EditorVersion: 6000.6.0a1 -m_EditorVersionWithRevision: 6000.6.0a1 (ec1914e25129) diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset deleted file mode 100644 index f55198a746..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/QualitySettings.asset +++ /dev/null @@ -1,134 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!47 &1 -QualitySettings: - m_ObjectHideFlags: 0 - serializedVersion: 5 - m_CurrentQuality: 1 - m_QualitySettings: - - serializedVersion: 4 - name: Mobile - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - skinWeights: 2 - globalTextureMipmapLimit: 0 - textureMipmapLimitSettings: [] - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 1 - useLegacyDetailDistribution: 1 - adaptiveVsync: 0 - vSyncCount: 0 - realtimeGICPUUsage: 100 - adaptiveVsyncExtraA: 0 - adaptiveVsyncExtraB: 0 - lodBias: 1 - maximumLODLevel: 0 - enableLODCrossFade: 1 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 256 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, - type: 2} - terrainQualityOverrides: 0 - terrainPixelError: 1 - terrainDetailDensityScale: 1 - terrainBasemapDistance: 1000 - terrainDetailDistance: 80 - terrainTreeDistance: 5000 - terrainBillboardStart: 50 - terrainFadeLength: 5 - terrainMaxTrees: 50 - excludedTargetPlatforms: - - Standalone - - serializedVersion: 4 - name: PC - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - skinWeights: 4 - globalTextureMipmapLimit: 0 - textureMipmapLimitSettings: [] - anisotropicTextures: 2 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 1 - useLegacyDetailDistribution: 1 - adaptiveVsync: 0 - vSyncCount: 0 - realtimeGICPUUsage: 100 - adaptiveVsyncExtraA: 0 - adaptiveVsyncExtraB: 0 - lodBias: 2 - maximumLODLevel: 0 - enableLODCrossFade: 1 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 256 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, - type: 2} - terrainQualityOverrides: 0 - terrainPixelError: 1 - terrainDetailDensityScale: 1 - terrainBasemapDistance: 1000 - terrainDetailDistance: 80 - terrainTreeDistance: 5000 - terrainBillboardStart: 50 - terrainFadeLength: 5 - terrainMaxTrees: 50 - excludedTargetPlatforms: - - Android - - iPhone - m_TextureMipmapLimitGroupNames: [] - m_PerPlatformDefaultQuality: - Android: 0 - GameCoreScarlett: 1 - GameCoreXboxOne: 1 - Lumin: 0 - Nintendo Switch: 1 - PS4: 1 - PS5: 1 - Server: 0 - Stadia: 0 - Standalone: 1 - WebGL: 0 - Windows Store Apps: 0 - XboxOne: 0 - iPhone: 0 - tvOS: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json b/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json deleted file mode 100644 index ede5887b3a..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/SceneTemplateSettings.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "templatePinStates": [], - "dependencyTypeInfos": [ - { - "userAdded": false, - "type": "UnityEngine.AnimationClip", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEditor.Animations.AnimatorController", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.AnimatorOverrideController", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEditor.Audio.AudioMixerController", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.ComputeShader", - "defaultInstantiationMode": 1 - }, - { - "userAdded": false, - "type": "UnityEngine.Cubemap", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.GameObject", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEditor.LightingDataAsset", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.LightingSettings", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Material", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEditor.MonoScript", - "defaultInstantiationMode": 1 - }, - { - "userAdded": false, - "type": "UnityEngine.PhysicsMaterial", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.PhysicsMaterial2D", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Rendering.VolumeProfile", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEditor.SceneAsset", - "defaultInstantiationMode": 1 - }, - { - "userAdded": false, - "type": "UnityEngine.Shader", - "defaultInstantiationMode": 1 - }, - { - "userAdded": false, - "type": "UnityEngine.ShaderVariantCollection", - "defaultInstantiationMode": 1 - }, - { - "userAdded": false, - "type": "UnityEngine.Texture", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Texture2D", - "defaultInstantiationMode": 0 - }, - { - "userAdded": false, - "type": "UnityEngine.Timeline.TimelineAsset", - "defaultInstantiationMode": 0 - } - ], - "defaultDependencyTypeInfo": { - "userAdded": false, - "type": "", - "defaultInstantiationMode": 1 - }, - "newSceneOverride": 0 -} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset deleted file mode 100644 index ce8c243288..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/ShaderGraphSettings.asset +++ /dev/null @@ -1,19 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3} - m_Name: - m_EditorClassIdentifier: - shaderVariantLimit: 128 - overrideShaderVariantLimit: 0 - customInterpolatorErrorThreshold: 32 - customInterpolatorWarningThreshold: 16 - customHeatmapValues: {fileID: 0} diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset deleted file mode 100644 index 6413d11ff5..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/TagManager.asset +++ /dev/null @@ -1,76 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!78 &1 -TagManager: - serializedVersion: 2 - tags: [] - layers: - - Default - - TransparentFX - - Ignore Raycast - - - - Water - - UI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - m_SortingLayers: - - name: Default - uniqueID: 0 - locked: 0 - m_RenderingLayers: - - Default - - Light Layer 1 - - Light Layer 2 - - Light Layer 3 - - Light Layer 4 - - Light Layer 5 - - Light Layer 6 - - Light Layer 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset deleted file mode 100644 index 558a017e1f..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/TimeManager.asset +++ /dev/null @@ -1,9 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!5 &1 -TimeManager: - m_ObjectHideFlags: 0 - Fixed Timestep: 0.02 - Maximum Allowed Timestep: 0.33333334 - m_TimeScale: 1 - Maximum Particle Timestep: 0.03 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset deleted file mode 100644 index 6ad5631834..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/URPProjectSettings.asset +++ /dev/null @@ -1,16 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 61 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} - m_Name: - m_EditorClassIdentifier: - m_LastMaterialVersion: 10 - m_ProjectSettingFolderPath: URPDefaultResources diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset deleted file mode 100644 index 029ad8b9e7..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/UnityConnectSettings.asset +++ /dev/null @@ -1,40 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!310 &1 -UnityConnectSettings: - m_ObjectHideFlags: 0 - serializedVersion: 1 - m_Enabled: 0 - m_TestMode: 0 - m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events - m_EventUrl: https://cdp.cloud.unity3d.com/v1/events - m_ConfigUrl: https://config.uca.cloud.unity3d.com - m_DashboardUrl: https://dashboard.unity3d.com - m_TestInitMode: 0 - InsightsSettings: - m_EngineDiagnosticsEnabled: 1 - m_Enabled: 0 - CrashReportingSettings: - serializedVersion: 2 - m_EventUrl: https://perf-events.cloud.unity3d.com - m_EnableCloudDiagnosticsReporting: 0 - m_LogBufferSize: 10 - m_CaptureEditorExceptions: 1 - UnityPurchasingSettings: - m_Enabled: 0 - m_TestMode: 0 - UnityAnalyticsSettings: - m_Enabled: 0 - m_TestMode: 0 - m_InitializeOnStartup: 1 - m_PackageRequiringCoreStatsPresent: 0 - UnityAdsSettings: - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_IosGameId: - m_AndroidGameId: - m_GameIds: {} - m_GameId: - PerformanceReportingSettings: - m_Enabled: 0 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset b/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset deleted file mode 100644 index 3a95c98bec..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/VFXManager.asset +++ /dev/null @@ -1,12 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!937362698 &1 -VFXManager: - m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} - m_RenderPipeSettingsPath: - m_FixedTimeStep: 0.016666668 - m_MaxDeltaTime: 0.05 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset deleted file mode 100644 index dca288142f..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/VersionControlSettings.asset +++ /dev/null @@ -1,8 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!890905787 &1 -VersionControlSettings: - m_ObjectHideFlags: 0 - m_Mode: Visible Meta Files - m_CollabEditorSettings: - inProgressEnabled: 1 diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json b/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json deleted file mode 100644 index 41dd8fc08a..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/VirtualProjectsConfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "PlayerTags": [], - "version": "6000.6.0a1" -} \ No newline at end of file diff --git a/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset b/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset deleted file mode 100644 index 482590c196..0000000000 --- a/Examples/NGO-N4E-Unified/ProjectSettings/XRSettings.asset +++ /dev/null @@ -1,10 +0,0 @@ -{ - "m_SettingKeys": [ - "VR Device Disabled", - "VR Device User Alert" - ], - "m_SettingValues": [ - "False", - "False" - ] -} \ No newline at end of file From 00b140ceb331f987b2bc7717a790262a66c08223 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 10:59:15 -0500 Subject: [PATCH 73/99] update Removing experimental component helpers (part of the ComponentMarkers stuff that is no longer used). --- .../Components/Helpers/ComponentHelpers.cs | 60 ------------------- .../Helpers/ComponentHelpers.cs.meta | 2 - 2 files changed, 62 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs delete mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs deleted file mode 100644 index 8fe95368bd..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs +++ /dev/null @@ -1,60 +0,0 @@ -#if UNIFIED_NETCODE -using System.Reflection; -using UnityEngine; - -namespace Unity.Netcode -{ - internal static class ComponentHelpers - { - /// - /// Copies the properties and fields of a source component to a target component - /// - /// Type of the component being copied. - /// The copy to target. - /// The copy from source. - /// - internal static T Copy(this Component target, T source) where T : Component - { - var targetType = target.GetType(); - var sourceType = source.GetType(); - if (targetType != sourceType) - { - Debug.LogError($"[ComponentHelpers][GetCopyOf<{targetType.Name}>][Mismatched target & source] Source: {sourceType.Name}!"); - return null; - } - - var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly; - - // Copy properties - foreach (var property in targetType.GetProperties(bindingFlags)) - { - if (property.CanWrite) - { - try { property.SetValue(target, property.GetValue(source, null), null); } - catch { } // Handle exceptions for unsupported properties - } - } - - // Copy fields - foreach (var field in targetType.GetFields(bindingFlags)) - { - field.SetValue(target, field.GetValue(source)); - } - - return target as T; - } - - /// - /// Add a component of Type T and copy the source somponent's properties and fields. - /// - /// Component type to add. - /// The target GameObject the component will be added to. - /// The source component (must be the same Type of T). - /// - internal static T AddAndCopy(this GameObject gameObject, T sourceComponent) where T : Component - { - return gameObject.AddComponent().Copy(sourceComponent); - } - } -} -#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta deleted file mode 100644 index 51aa6e32f7..0000000000 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/ComponentHelpers.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 543f53bafd1a2424c9f8609da08e927d \ No newline at end of file From 05138a4a7d9b4db3cf954256b3a4e11a223e0e28 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:07:39 -0500 Subject: [PATCH 74/99] update Adding develop-3.x.x to the triggers. --- .yamato/_triggers.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.yamato/_triggers.yml b/.yamato/_triggers.yml index d51d6b3940..d806f378b0 100644 --- a/.yamato/_triggers.yml +++ b/.yamato/_triggers.yml @@ -58,6 +58,7 @@ pr_minimal_required_checks: (pull_request.comment eq "ngo" OR (pull_request.target eq "develop" OR pull_request.target eq "develop-2.0.0" OR + pull_request.target eq "develop-3.x.x" OR pull_request.target match "release/*")) AND NOT pull_request.draft cancel_old_ci: true From e66c22e066320cd0e5059e85bf0bab0fcb8cd933 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:38:13 -0500 Subject: [PATCH 75/99] update Reverting test project manifest changes. Removing the packages-lock.json file (should never be added). --- testproject/Packages/manifest.json | 36 +- testproject/Packages/packages-lock.json | 620 ------------------------ 2 files changed, 16 insertions(+), 640 deletions(-) delete mode 100644 testproject/Packages/packages-lock.json diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index e64bb3bdad..69421078ce 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,25 +1,23 @@ { "disableProjectUpdate": false, "dependencies": { - "com.unity.addressables": "2.9.1", - "com.unity.ai.navigation": "2.0.12", - "com.unity.collab-proxy": "2.12.4", - "com.unity.entities": "6.5.0", - "com.unity.ide.rider": "3.0.40", - "com.unity.ide.visualstudio": "2.0.26", - "com.unity.mathematics": "1.4.0", - "com.unity.multiplayer.tools": "2.2.8", - "com.unity.netcode": "6.6.0", + "com.unity.addressables": "2.7.4", + "com.unity.ai.navigation": "2.0.9", + "com.unity.collab-proxy": "2.10.1", + "com.unity.ide.rider": "3.0.38", + "com.unity.ide.visualstudio": "2.0.25", + "com.unity.mathematics": "1.3.3", + "com.unity.multiplayer.tools": "2.2.6", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.package-validation-suite": "0.49.0-preview", - "com.unity.services.authentication": "3.6.1", - "com.unity.services.multiplayer": "2.1.3", - "com.unity.test-framework": "1.8.0", - "com.unity.test-framework.performance": "3.4.0", - "com.unity.timeline": "1.8.12", - "com.unity.ugui": "2.6.0", + "com.unity.services.authentication": "3.5.2", + "com.unity.services.multiplayer": "1.2.0", + "com.unity.test-framework": "1.6.0", + "com.unity.test-framework.performance": "3.2.0", + "com.unity.timeline": "1.8.9", + "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.11", + "com.unity.ugui": "2.0.0", "com.unity.modules.accessibility": "1.0.0", - "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -33,12 +31,10 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.timelinefoundation": "1.0.0", "com.unity.modules.ui": "1.0.0", "com.unity.modules.uielements": "1.0.0", "com.unity.modules.umbra": "1.0.0", @@ -48,13 +44,13 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" }, "testables": [ "com.unity.netcode.gameobjects" ] -} +} \ No newline at end of file diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json deleted file mode 100644 index 00988aa549..0000000000 --- a/testproject/Packages/packages-lock.json +++ /dev/null @@ -1,620 +0,0 @@ -{ - "dependencies": { - "com.unity.addressables": { - "version": "2.9.1", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.profiling.core": "1.0.2", - "com.unity.test-framework": "1.4.5", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.scriptablebuildpipeline": "2.6.1", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.ai.navigation": { - "version": "2.0.12", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.modules.ai": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.burst": { - "version": "1.8.29", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.mathematics": "1.2.1", - "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.collab-proxy": { - "version": "2.12.4", - "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.collections": { - "version": "6.5.0", - "depth": 1, - "source": "builtin", - "dependencies": { - "com.unity.burst": "1.8.25", - "com.unity.nuget.mono-cecil": "1.11.6", - "com.unity.test-framework": "1.4.6", - "com.unity.test-framework.performance": "3.2.0" - } - }, - "com.unity.entities": { - "version": "6.5.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.burst": "1.8.25", - "com.unity.collections": "6.5.0", - "com.unity.nuget.mono-cecil": "1.11.6", - "com.unity.profiling.core": "1.0.3", - "com.unity.scriptablebuildpipeline": "1.23.1", - "com.unity.serialization": "6.5.0", - "com.unity.test-framework.performance": "3.2.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.hierarchy": "1.0.0" - } - }, - "com.unity.ext.nunit": { - "version": "2.1.0", - "depth": 1, - "source": "builtin", - "dependencies": {} - }, - "com.unity.ide.rider": { - "version": "3.0.40", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.ext.nunit": "1.0.6" - }, - "url": "https://packages.unity.com" - }, - "com.unity.ide.visualstudio": { - "version": "2.0.26", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.test-framework": "1.1.33" - }, - "url": "https://packages.unity.com" - }, - "com.unity.mathematics": { - "version": "1.4.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.multiplayer.tools": { - "version": "2.2.8", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.burst": "1.8.18", - "com.unity.collections": "2.5.1", - "com.unity.mathematics": "1.3.2", - "com.unity.profiling.core": "1.0.2", - "com.unity.nuget.mono-cecil": "1.11.4", - "com.unity.modules.uielements": "1.0.0", - "com.unity.nuget.newtonsoft-json": "3.2.1" - }, - "url": "https://packages.unity.com" - }, - "com.unity.netcode": { - "version": "6.6.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.transport": "6.5.0", - "com.unity.entities": "6.5.0", - "com.unity.modules.animation": "1.0.0" - } - }, - "com.unity.netcode.gameobjects": { - "version": "file:../../com.unity.netcode.gameobjects", - "depth": 0, - "source": "local", - "dependencies": { - "com.unity.nuget.mono-cecil": "1.11.4", - "com.unity.transport": "2.6.0" - } - }, - "com.unity.nuget.mono-cecil": { - "version": "1.11.6", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.nuget.newtonsoft-json": { - "version": "3.2.2", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.package-validation-suite": { - "version": "0.49.0-preview", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.nuget.mono-cecil": "0.1.6-preview.2" - }, - "url": "https://packages.unity.com" - }, - "com.unity.profiling.core": { - "version": "1.0.3", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.scriptablebuildpipeline": { - "version": "2.6.1", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.test-framework": "1.4.5", - "com.unity.modules.assetbundle": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.serialization": { - "version": "6.5.0", - "depth": 1, - "source": "builtin", - "dependencies": { - "com.unity.collections": "2.1.2", - "com.unity.burst": "1.7.2" - } - }, - "com.unity.services.authentication": { - "version": "3.6.1", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.ugui": "1.0.0", - "com.unity.services.core": "1.15.1", - "com.unity.nuget.newtonsoft-json": "3.2.1", - "com.unity.modules.unitywebrequest": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.services.core": { - "version": "1.16.0", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.modules.androidjni": "1.0.0", - "com.unity.nuget.newtonsoft-json": "3.2.1", - "com.unity.modules.unitywebrequest": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.services.deployment": { - "version": "1.7.2", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.services.core": "1.15.1", - "com.unity.services.deployment.api": "1.1.2" - }, - "url": "https://packages.unity.com" - }, - "com.unity.services.deployment.api": { - "version": "1.1.3", - "depth": 2, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.services.multiplayer": { - "version": "2.1.3", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.transport": "2.6.0", - "com.unity.collections": "2.2.1", - "com.unity.services.qos": "1.4.1", - "com.unity.services.core": "1.16.0", - "com.unity.services.wire": "1.4.1", - "com.unity.services.deployment": "1.7.1", - "com.unity.nuget.newtonsoft-json": "3.2.2", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.services.authentication": "3.6.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.services.qos": { - "version": "1.4.1", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.collections": "1.2.4", - "com.unity.services.core": "1.12.5", - "com.unity.nuget.newtonsoft-json": "3.0.2", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.services.authentication": "3.5.2" - }, - "url": "https://packages.unity.com" - }, - "com.unity.services.wire": { - "version": "1.4.2", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.services.core": "1.12.5", - "com.unity.nuget.newtonsoft-json": "3.2.1", - "com.unity.services.authentication": "2.7.4" - }, - "url": "https://packages.unity.com" - }, - "com.unity.test-framework": { - "version": "1.8.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.ext.nunit": "2.1.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" - } - }, - "com.unity.test-framework.performance": { - "version": "3.4.0", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.test-framework": "1.1.33", - "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.timeline": { - "version": "1.8.12", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.transport": { - "version": "6.5.0", - "depth": 1, - "source": "builtin", - "dependencies": { - "com.unity.collections": "6.5.0", - "com.unity.burst": "1.8.24", - "com.unity.mathematics": "1.4.0" - } - }, - "com.unity.ugui": { - "version": "2.6.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.physics": "1.0.0" - } - }, - "com.unity.modules.accessibility": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.adaptiveperformance": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.subsystems": "1.0.0" - } - }, - "com.unity.modules.ai": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.androidjni": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0" - } - }, - "com.unity.modules.animation": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.assetbundle": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.audio": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.cloth": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physics": "1.0.0" - } - }, - "com.unity.modules.director": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.animation": "1.0.0" - } - }, - "com.unity.modules.hierarchy": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", - "dependencies": { - "com.unity.modules.hierarchycore": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.imgui": "1.0.0" - } - }, - "com.unity.modules.hierarchycore": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.imageconversion": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.imgui": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.jsonserialize": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.particlesystem": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.physics": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.physics2d": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physicscore2d": "1.0.0" - } - }, - "com.unity.modules.physicscore2d": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.screencapture": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.imageconversion": "1.0.0" - } - }, - "com.unity.modules.subsystems": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", - "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0" - } - }, - "com.unity.modules.terrain": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.terrainphysics": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.terrain": "1.0.0" - } - }, - "com.unity.modules.tilemap": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physics2d": "1.0.0" - } - }, - "com.unity.modules.timelinefoundation": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0" - } - }, - "com.unity.modules.ui": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.uielements": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.hierarchycore": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.animation": "1.0.0" - } - }, - "com.unity.modules.umbra": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.unityanalytics": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" - } - }, - "com.unity.modules.unitywebrequest": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.unitywebrequestassetbundle": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" - } - }, - "com.unity.modules.unitywebrequestaudio": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.audio": "1.0.0" - } - }, - "com.unity.modules.unitywebrequesttexture": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0" - } - }, - "com.unity.modules.unitywebrequestwww": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0" - } - }, - "com.unity.modules.vectorgraphics": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0" - } - }, - "com.unity.modules.vehicles": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physics": "1.0.0" - } - }, - "com.unity.modules.video": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" - } - }, - "com.unity.modules.wind": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": {} - }, - "com.unity.modules.xr": { - "version": "1.0.0", - "depth": 0, - "source": "builtin", - "dependencies": { - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.subsystems": "1.0.0" - } - } - } -} From bf4f27cf1974f49696e0dc29e1acc5bf99860930 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:38:48 -0500 Subject: [PATCH 76/99] update Placing the UnifiedBootstrap into its own file. --- .../Components/Helpers/NetworkObjectBridge.cs | 89 ------------------ .../Components/Helpers/UnifiedBootstrap.cs | 94 +++++++++++++++++++ .../Helpers/UnifiedBootstrap.cs.meta | 2 + 3 files changed, 96 insertions(+), 89 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs create mode 100644 com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs.meta diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs index 8cb0f48a8f..75ad66a278 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/NetworkObjectBridge.cs @@ -1,12 +1,8 @@ #if UNIFIED_NETCODE -using System; -using Unity.Entities; using Unity.NetCode; -using UnityEngine; namespace Unity.Netcode { - #if UNIFIED_NETCODE /// /// TODO-UNIFIED: Needs further peer review and exploring alternate ways of handling this. @@ -55,90 +51,5 @@ public void SetNetworkObjectId(ulong networkObjectId) } } #endif - - /// - /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. - /// Creates the hosted world and provides a means to configuring - /// the 2nd port for unified netcode connection. - /// - internal class UnifiedBootStrap : ClientServerBootstrap - { - public static UnifiedBootStrap Instance { get; private set; } - public static Action OnInitialized; - public static ushort Port = 7979; - public static NetworkManager CurrentNetworkManagerForInitialization; - - public static World LastCreatedWorld { get; private set; } - - private static int s_WorldCounter = 0; - - public override bool Initialize(string defaultWorldName) - { - var networkManager = CurrentNetworkManagerForInitialization; - if (networkManager == NetworkManager.Singleton) - { - Instance = this; - } - - AutoConnectPort = Port; - if (base.Initialize(defaultWorldName)) - { - Debug.LogError($"[{nameof(UnifiedBootStrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); - return true; - } - - if (networkManager != null) - { - Debug.Log($"Starting a world for {(networkManager.IsServer ? "Host" : "Client")}"); - s_WorldCounter++; - LastCreatedWorld = networkManager.IsServer ? CreateSingleWorldHost($"HostSingleWorld-{s_WorldCounter}") - : CreateClientWorld($"ClientWorld-{s_WorldCounter}"); - - if (LastCreatedWorld == null) - { - s_WorldCounter--; - Debug.LogError($"[{nameof(UnifiedBootStrap)}] World is null!"); - return false; - } - - if (!LastCreatedWorld.IsCreated) - { - s_WorldCounter--; - Debug.LogError($"[{nameof(UnifiedBootStrap)}] World was not created!"); - return false; - } - - //if (networkManager.LogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Created world: {LastCreatedWorld.Name} / {LastCreatedWorld.SequenceNumber}"); - } - - networkManager.NetcodeWorld = (NetcodeWorld)LastCreatedWorld; - if (networkManager.NetworkConfig.Prefabs.HasPendingGhostPrefabs) - { - if (networkManager.LogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo($"[{nameof(UnifiedBootStrap)}] Registering hybrid prefabs..."); - } - - networkManager.NetworkConfig.Prefabs.RegisterGhostPrefabs(networkManager); - } - } - else - { - LastCreatedWorld = CreateLocalWorld("LocalWorld"); - } - - OnInitialized?.Invoke(); - - return true; - } - - ~UnifiedBootStrap() - { - LastCreatedWorld = null; - Instance = null; - } - } } #endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs new file mode 100644 index 0000000000..4c9f9ad0a9 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs @@ -0,0 +1,94 @@ +#if UNIFIED_NETCODE +using System; +using Unity.Entities; +using Unity.NetCode; +using UnityEngine; + +namespace Unity.Netcode +{ + /// + /// TODO-UNIFIED: Would need to be reviewed for alternate ways of handling this. + /// Creates the hosted world and provides a means to configuring + /// the 2nd port for unified netcode connection. + /// + internal class UnifiedBootstrap : ClientServerBootstrap + { + public static UnifiedBootstrap Instance { get; private set; } + public static Action OnInitialized; + public static ushort Port = 7979; + public static NetworkManager CurrentNetworkManagerForInitialization; + + public static World LastCreatedWorld { get; private set; } + + private static int s_WorldCounter = 0; + + public override bool Initialize(string defaultWorldName) + { + var networkManager = CurrentNetworkManagerForInitialization; + if (networkManager == NetworkManager.Singleton) + { + Instance = this; + } + + AutoConnectPort = Port; + if (base.Initialize(defaultWorldName)) + { + Debug.LogError($"[{nameof(UnifiedBootstrap)}] Auto-bootstrap is enabled!!! This will break the POC!"); + return true; + } + + if (networkManager != null) + { + Debug.Log($"Starting a world for {(networkManager.IsServer ? "Host" : "Client")}"); + s_WorldCounter++; + LastCreatedWorld = networkManager.IsServer ? CreateSingleWorldHost($"HostSingleWorld-{s_WorldCounter}") + : CreateClientWorld($"ClientWorld-{s_WorldCounter}"); + + if (LastCreatedWorld == null) + { + s_WorldCounter--; + Debug.LogError($"[{nameof(UnifiedBootstrap)}] World is null!"); + return false; + } + + if (!LastCreatedWorld.IsCreated) + { + s_WorldCounter--; + Debug.LogError($"[{nameof(UnifiedBootstrap)}] World was not created!"); + return false; + } + + //if (networkManager.LogLevel <= LogLevel.Developer) + { + NetworkLog.LogInfo($"[{nameof(UnifiedBootstrap)}] Created world: {LastCreatedWorld.Name} / {LastCreatedWorld.SequenceNumber}"); + } + + networkManager.NetcodeWorld = (NetcodeWorld)LastCreatedWorld; + if (networkManager.NetworkConfig.Prefabs.HasPendingGhostPrefabs) + { + if (networkManager.LogLevel <= LogLevel.Developer) + { + NetworkLog.LogInfo($"[{nameof(UnifiedBootstrap)}] Registering hybrid prefabs..."); + } + + networkManager.NetworkConfig.Prefabs.RegisterGhostPrefabs(networkManager); + } + } + else + { + LastCreatedWorld = CreateLocalWorld("LocalWorld"); + } + + OnInitialized?.Invoke(); + + return true; + } + + ~UnifiedBootstrap() + { + LastCreatedWorld = null; + Instance = null; + } + } +} +#endif diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs.meta b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs.meta new file mode 100644 index 0000000000..a9a3d5ee88 --- /dev/null +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedBootstrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0671ce785ad022344a6721d1be9559ad \ No newline at end of file From abcb4a64c3235e77e4372c48865e998d47df5160 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:39:37 -0500 Subject: [PATCH 77/99] update & style White space removal. UnifiedBootstrap name update. --- com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs | 2 +- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs index 57c0316e3a..924e519f27 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs @@ -20,7 +20,7 @@ public class NetworkObjectEditor : UnityEditor.Editor private bool m_Initialized; private NetworkObject m_NetworkObject; private bool m_ShowObservers; - + private static readonly string[] k_HiddenFields = { "m_Script" }; private void Initialize() diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 87ceaa1185..746c0e36db 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1359,7 +1359,7 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType /// !! Initialize worlds here !! /// Worlds are created here: - UnifiedBootStrap.CurrentNetworkManagerForInitialization = this; + UnifiedBootstrap.CurrentNetworkManagerForInitialization = this; DefaultWorldInitialization.Initialize("Default World", false); // This should not be needed at this point, but this is here in the event something changes. From ad904214034e50e12b3d043c36f1090b36004f3e Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:40:00 -0500 Subject: [PATCH 78/99] test Wrapping the unified test within the UNIFIED_NETCODE define. --- .../Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs index 4325695783..cfc14cf437 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs @@ -1,3 +1,4 @@ +#if UNIFIED_NETCODE using System.Collections; using NUnit.Framework; using Unity.Netcode.Components; @@ -130,3 +131,4 @@ public IEnumerator BasicMovementTest() } } } +#endif From 985836229b09ee7ff9b3c1b222504d7921da0eb8 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 11:41:29 -0500 Subject: [PATCH 79/99] style Adding CR/LF. --- testproject/Packages/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 69421078ce..f7832aaad0 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -53,4 +53,4 @@ "testables": [ "com.unity.netcode.gameobjects" ] -} \ No newline at end of file +} From 71a5af59f7417fef28c03f790207c0cb886f8c72 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 12:07:00 -0500 Subject: [PATCH 80/99] update - Multiprocess Runtime Removing this from test project as we have never come back to use it. (It will still be on the develop-2.0.0 branch) --- testproject/.gitignore | 3 +- .../BaseMultiprocessTests.cs | 225 -------- .../BaseMultiprocessTests.cs.meta | 11 - .../ExecuteStepInContext.cs | 293 ---------- .../ExecuteStepInContext.cs.meta | 11 - .../ExecuteStepInContextTests.cs | 261 --------- .../ExecuteStepInContextTests.cs.meta | 11 - .../Legacy/MultiprocessRuntime/Helpers.meta | 8 - .../Helpers/BuildMultiprocessTestPlayer.cs | 187 ------- .../BuildMultiprocessTestPlayer.cs.meta | 11 - .../Helpers/CallbackComponent.cs | 24 - .../Helpers/CallbackComponent.cs.meta | 11 - .../Helpers/ConfigurationTools.cs | 69 --- .../Helpers/ConfigurationTools.cs.meta | 11 - .../Helpers/ConfigurationType.cs | 9 - .../Helpers/ConfigurationType.cs.meta | 11 - .../CustomPrefabSpawnerForPerformanceTests.cs | 46 -- ...omPrefabSpawnerForPerformanceTests.cs.meta | 11 - .../Helpers/GameObjectPool.cs | 60 --- .../Helpers/GameObjectPool.cs.meta | 3 - .../Helpers/MultiprocessLogger.cs | 68 --- .../Helpers/MultiprocessLogger.cs.meta | 11 - .../Helpers/MultiprocessOrchestration.cs | 278 ---------- .../Helpers/MultiprocessOrchestration.cs.meta | 11 - .../NetworkVariablePerformanceTests.cs | 263 --------- .../NetworkVariablePerformanceTests.cs.meta | 11 - .../MultiprocessRuntime/TestCoordinator.cs | 506 ------------------ .../TestCoordinator.cs.meta | 11 - .../TestCoordinatorTests.cs | 77 --- .../TestCoordinatorTests.cs.meta | 11 - .../Legacy/MultiprocessRuntime/ThreeDText.cs | 88 --- .../MultiprocessRuntime/ThreeDText.cs.meta | 11 - .../readme-ressources.meta | 8 - .../readme-ressources/Building-Player.jpg | Bin 11346 -> 0 bytes .../Building-Player.jpg.meta | 96 ---- .../readme-ressources/Multiprocess.jpg | Bin 23858 -> 0 bytes .../readme-ressources/Multiprocess.jpg.meta | 96 ---- .../OrchestrationOverview.jpg | Bin 199286 -> 0 bytes .../OrchestrationOverview.jpg.meta | 96 ---- .../Legacy/MultiprocessRuntime/readme.md | 279 ---------- .../Legacy/MultiprocessRuntime/readme.md.meta | 7 - .../testproject.multiprocesstests.asmdef | 34 -- .../testproject.multiprocesstests.asmdef.meta | 7 - 43 files changed, 2 insertions(+), 3243 deletions(-) delete mode 100644 testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/ThreeDText.cs delete mode 100644 testproject/Legacy/MultiprocessRuntime/ThreeDText.cs.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme.md delete mode 100644 testproject/Legacy/MultiprocessRuntime/readme.md.meta delete mode 100644 testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef delete mode 100644 testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef.meta diff --git a/testproject/.gitignore b/testproject/.gitignore index 2800399634..cf2c720f71 100644 --- a/testproject/.gitignore +++ b/testproject/.gitignore @@ -77,7 +77,8 @@ crashlytics-build.properties *.pem.meta InitTestScene* - +# Do not include the packages-lock file +packages-lock.json boot.config SceneTemplateSettings.json *BurstAotSettings*.json diff --git a/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs b/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs deleted file mode 100644 index 8e853a0b19..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.TestTools; -using Object = UnityEngine.Object; -using Unity.Netcode.Transports.UTP; - - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class MultiprocessTestsAttribute : CategoryAttribute - { - public const string MultiprocessCategoryName = "Multiprocess"; - public MultiprocessTestsAttribute() : base(MultiprocessCategoryName) { } - } - - [MultiprocessTests] - public abstract class BaseMultiprocessTests - { - protected string[] platformList { get; set; } - - protected int GetWorkerCount() - { - platformList = MultiprocessOrchestration.GetRemotePlatformList(); - return platformList == null ? WorkerCount : platformList.Length; - } - protected bool m_LaunchRemotely; - private bool m_HasSceneLoaded = false; - // TODO: Remove UTR check once we have Multiprocess tests fully working - protected bool IgnoreMultiprocessTests => MultiprocessOrchestration.ShouldIgnoreUTRTests(); - - protected virtual bool IsPerformanceTest => false; - - /// - /// Implement this to specify the amount of workers to spawn from your main test runner - /// Note: If using remote workers, the woorker count will come from the environment variable - /// - protected abstract int WorkerCount { get; } - - private const string k_FirstPartOfTestRunnerSceneName = "InitTestScene"; - - // Since we want to additively load our BuildMultiprocessTestPlayer.MainSceneName - // We want to keep a reference to the - private Scene m_OriginalActiveScene; - - [OneTimeSetUp] - public virtual void SetupTestSuite() - { - MultiprocessLogger.Log("Running SetupTestSuite - OneTimeSetup"); - MultiprocessOrchestration.IsPerformanceTest = IsPerformanceTest; - if (IgnoreMultiprocessTests) - { - Assert.Ignore("Ignoring tests under UTR. For testing, include the \"-bypassIgnoreUTR\" command line parameter."); - } - - if (IsPerformanceTest) - { - Assert.Ignore("Performance tests should be run from remote test execution on device (this can be ran using the \"run selected tests (your platform)\" button"); - } - MultiprocessLogger.Log($"Currently active scene {SceneManager.GetActiveScene().name}"); - var currentlyActiveScene = SceneManager.GetActiveScene(); - - // Just adding a sanity check here to help with debugging in the event that SetupTestSuite is - // being invoked and the TestRunner scene has not been set to the active scene yet. - // This could mean that TeardownSuite wasn't called or SceneManager is not finished unloading - // or could not unload the BuildMultiprocessTestPlayer.MainSceneName. - if (!currentlyActiveScene.name.StartsWith(k_FirstPartOfTestRunnerSceneName)) - { - MultiprocessLogger.LogError( - $"Expected the currently active scene to begin with ({k_FirstPartOfTestRunnerSceneName}) but" + - $" currently active scene is {currentlyActiveScene.name}"); - } - m_OriginalActiveScene = currentlyActiveScene; - - SceneManager.sceneLoaded += OnSceneLoaded; - SceneManager.LoadScene(BuildMultiprocessTestPlayer.MainSceneName, LoadSceneMode.Additive); - } - - private void OnSceneLoaded(Scene scene, LoadSceneMode mode) - { - SceneManager.sceneLoaded -= OnSceneLoaded; - if (scene.name == BuildMultiprocessTestPlayer.MainSceneName) - { - SceneManager.SetActiveScene(scene); - } - - var transport = NetworkManager.Singleton.NetworkConfig.NetworkTransport; - switch (transport) - { - case UnityTransport unityTransport: - unityTransport.ConnectionData.ServerListenAddress = "0.0.0.0"; - MultiprocessLogger.Log($"Setting unityTransport.ConnectionData.Port {unityTransport.ConnectionData.ServerListenAddress}"); - break; - default: - MultiprocessLogger.LogError($"The transport {transport} has no case"); - break; - } - - MultiprocessLogger.Log("Starting Host"); - NetworkManager.Singleton.StartHost(); - - // Use scene verification to make sure we don't try to get clients to synchronize the TestRunner scene - NetworkManager.Singleton.SceneManager.VerifySceneBeforeLoading = VerifySceneIsValidForClientsToLoad; - - m_HasSceneLoaded = true; - } - - /// - /// We want to exclude the TestRunner scene on the host-server side so it won't try to tell clients to - /// synchronize to this scene when they connect (host-server side only for multiprocess) - /// - /// true - scene is fine to synchronize/inform clients to load and false - scene should not be loaded by clients - private bool VerifySceneIsValidForClientsToLoad(int sceneIndex, string sceneName, LoadSceneMode loadSceneMode) - { - if (sceneName.StartsWith(k_FirstPartOfTestRunnerSceneName)) - { - return false; - } - return true; - } - - [UnitySetUp] - public virtual IEnumerator Setup() - { - yield return new WaitUntil(() => NetworkManager.Singleton != null); - yield return new WaitUntil(() => NetworkManager.Singleton.IsServer); - yield return new WaitUntil(() => NetworkManager.Singleton.IsListening); - yield return new WaitUntil(() => m_HasSceneLoaded == true); - var startTime = Time.time; - m_LaunchRemotely = MultiprocessOrchestration.IsRemoteOperationEnabled(); - - MultiprocessLogger.Log($"Active Worker Count is {MultiprocessOrchestration.ActiveWorkerCount()}" + - $" and connected client count is {NetworkManager.Singleton.ConnectedClients.Count} " + - $" and WorkerCount is {GetWorkerCount()} " + - $" and LaunchRemotely is {m_LaunchRemotely}"); - if (MultiprocessOrchestration.ActiveWorkerCount() + 1 < NetworkManager.Singleton.ConnectedClients.Count) - { - MultiprocessLogger.Log("Is this a bad state?"); - } - - // Moved this out of OnSceneLoaded as OnSceneLoaded is a callback from the SceneManager and just wanted to avoid creating - // processes from within the same callstack/context as the SceneManager. This will instantiate up to the WorkerCount and - // then any subsequent calls to Setup if there are already workers it will skip this step - if (!m_LaunchRemotely) - { - if (NetworkManager.Singleton.ConnectedClients.Count - 1 < WorkerCount) - { - var numProcessesToCreate = WorkerCount - (NetworkManager.Singleton.ConnectedClients.Count - 1); - for (int i = 1; i <= numProcessesToCreate; i++) - { - MultiprocessLogger.Log($"Spawning testplayer {i} since connected client count is {NetworkManager.Singleton.ConnectedClients.Count} is less than {WorkerCount} and Number of spawned external players is {MultiprocessOrchestration.ActiveWorkerCount()} "); - string logPath = MultiprocessOrchestration.StartWorkerNode(); // will automatically start built player as clients - MultiprocessLogger.Log($"logPath to new process is {logPath}"); - MultiprocessLogger.Log($"Active Worker Count {MultiprocessOrchestration.ActiveWorkerCount()} and connected client count is {NetworkManager.Singleton.ConnectedClients.Count}"); - } - } - } - else - { - var launchProcessList = new List(); - if (NetworkManager.Singleton.ConnectedClients.Count - 1 < GetWorkerCount()) - { - var machines = MultiprocessOrchestration.GetRemoteMachineList(); - foreach (var machine in machines) - { - MultiprocessLogger.Log($"Would launch on {machine.Name} too get worker count to {GetWorkerCount()} from {NetworkManager.Singleton.ConnectedClients.Count - 1}"); - launchProcessList.Add(MultiprocessOrchestration.StartWorkersOnRemoteNodes(machine)); - } - } - } - - var timeOutTime = Time.realtimeSinceStartup + TestCoordinator.MaxWaitTimeoutSec; - while (NetworkManager.Singleton.ConnectedClients.Count <= WorkerCount) - { - yield return new WaitForSeconds(0.2f); - - if (Time.realtimeSinceStartup > timeOutTime) - { - throw new Exception($" {DateTime.Now:T} Waiting too long to see clients to connect, got {NetworkManager.Singleton.ConnectedClients.Count - 1} clients, and ActiveWorkerCount: {MultiprocessOrchestration.ActiveWorkerCount()} but was expecting {WorkerCount}, failing"); - } - } - TestCoordinator.Instance.KeepAliveClientRpc(); - MultiprocessLogger.Log($"Active Worker Count {MultiprocessOrchestration.ActiveWorkerCount()} and connected client count is {NetworkManager.Singleton.ConnectedClients.Count}"); - } - - - [TearDown] - public virtual void Teardown() - { - MultiprocessLogger.Log("Running teardown"); - if (!IgnoreMultiprocessTests) - { - TestCoordinator.Instance.TestRunTeardown(); - } - } - - [OneTimeTearDown] - public virtual void TeardownSuite() - { - MultiprocessLogger.Log($"TeardownSuite"); - if (!IgnoreMultiprocessTests) - { - MultiprocessLogger.Log($"TeardownSuite - ShutdownAllProcesses"); - MultiprocessOrchestration.ShutdownAllProcesses(); - MultiprocessLogger.Log($"TeardownSuite - NetworkManager.Singleton.Shutdown"); - NetworkManager.Singleton.Shutdown(); - Object.Destroy(NetworkManager.Singleton.gameObject); // making sure we clear everything before reloading our scene - MultiprocessLogger.Log($"Currently active scene {SceneManager.GetActiveScene().name}"); - MultiprocessLogger.Log($"m_OriginalActiveScene.IsValid {m_OriginalActiveScene.IsValid()}"); - if (m_OriginalActiveScene.IsValid()) - { - SceneManager.SetActiveScene(m_OriginalActiveScene); - } - MultiprocessLogger.Log($"TeardownSuite - Unload {BuildMultiprocessTestPlayer.MainSceneName}"); - SceneManager.UnloadSceneAsync(BuildMultiprocessTestPlayer.MainSceneName); - MultiprocessLogger.Log($"TeardownSuite - Unload {BuildMultiprocessTestPlayer.MainSceneName}"); - } - } - } -} - diff --git a/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs.meta b/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs.meta deleted file mode 100644 index 6b52bd9e90..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/BaseMultiprocessTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f77e60aa394b9419784b6c46618fb553 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs b/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs deleted file mode 100644 index f09dc0f412..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs +++ /dev/null @@ -1,293 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using NUnit.Framework.Interfaces; -using Unity.Netcode; -using Unity.Netcode.MultiprocessRuntimeTests; -using UnityEngine; -using UnityEngine.TestTools; -using Debug = UnityEngine.Debug; - -/// -/// Allows for context based delegate execution. -/// Can specify where you want that lambda executed (client side? server side?) and it'll automatically wait for the end -/// of a clientRPC server side and vice versa. -/// todo this could be used as an in-game tool too? for protocols that require a lot of back and forth? -/// -public class ExecuteStepInContext : CustomYieldInstruction -{ - public enum StepExecutionContext - { - Server, - Clients - } - - [AttributeUsage(AttributeTargets.Method)] - public class MultiprocessContextBasedTestAttribute : NUnitAttribute, IOuterUnityTestAction - { - public IEnumerator BeforeTest(ITest test) - { - yield return new WaitUntil(() => TestCoordinator.Instance != null && HasRegistered); - } - - public IEnumerator AfterTest(ITest test) - { - yield break; - } - } - - private StepExecutionContext m_ActionContext; - private Action m_StepToExecute; - private string m_CurrentActionId; - - // as a remote worker, I store all available actions so I can execute them when triggered from RPCs - public static Dictionary AllActions = new Dictionary(); - private static Dictionary s_MethodIdCounter = new Dictionary(); - - private NetworkManager m_NetworkManager; - private bool m_IsRegistering; - private List> m_ClientIsFinishedChecks = new List>(); - private Func m_AdditionalIsFinishedWaiter; - - private bool m_WaitMultipleUpdates; - private bool m_IgnoreTimeoutException; - - private float m_StartTime; - private bool isTimingOut => Time.time - m_StartTime > TestCoordinator.MaxWaitTimeoutSec; - private bool shouldExecuteLocally => (m_ActionContext == StepExecutionContext.Server && m_NetworkManager.IsServer) || (m_ActionContext == StepExecutionContext.Clients && !m_NetworkManager.IsServer); - - public static bool IsRegistering; - public static bool HasRegistered; - private static List s_AllClientTestInstances = new List(); // to keep an instance for each tests, so captured context in each step is kept - - /// - /// This MUST be called at the beginning of each test in order to use context based steps. - /// Assumes this is called from same callsite as ExecuteStepInContext (and assumes this is called from IEnumerator, the method full name is unique - /// even with the same method name and different parameters). - /// This relies on the name to be unique for each generated IEnumerator state machines - /// - public static void InitializeContextSteps() - { - var callerMethod = new StackFrame(1).GetMethod(); - var methodIdentifier = GetMethodIdentifier(callerMethod); // since this is called from IEnumerator, this should be a generated class, making it unique - s_MethodIdCounter[methodIdentifier] = 0; - } - - private static string GetMethodIdentifier(MethodBase callerMethod) - { - return callerMethod.DeclaringType.FullName; - } - - internal static void InitializeAllSteps() - { - MultiprocessLogger.Log("InitializeAllSteps - Start"); - // registering magically all context based steps - IsRegistering = true; - var registeredMethods = typeof(TestCoordinator).Assembly.GetTypes().SelectMany(t => t.GetMethods()) - .Where(m => m.GetCustomAttributes(typeof(MultiprocessContextBasedTestAttribute), true).Length > 0) - .ToArray(); - var typesWithContextMethods = new HashSet(); - foreach (var method in registeredMethods) - { - typesWithContextMethods.Add(method.ReflectedType); - } - - if (registeredMethods.Length == 0) - { - throw new Exception($"Couldn't find any registered methods for multiprocess testing. Is {nameof(TestCoordinator)} in same assembly as test methods?"); - } - - object[] GetParameterValuesToPassFunc(ParameterInfo[] parameterInfo) - { - object[] parametersToReturn = new object[parameterInfo.Length]; - for (int i = 0; i < parameterInfo.Length; i++) - { - var paramType = parameterInfo[i].GetType(); - object defaultObj = null; - if (paramType.IsValueType) - { - defaultObj = Activator.CreateInstance(paramType); - } - - parametersToReturn[i] = defaultObj; - } - - return parametersToReturn; - } - - foreach (var contextType in typesWithContextMethods) - { - var allConstructors = contextType.GetConstructors(); - if (allConstructors.Length > 1) - { - throw new NotImplementedException("Case not implemented where test has more than one constructor"); - } - - var instance = Activator.CreateInstance(contextType, allConstructors.Length > 0 ? GetParameterValuesToPassFunc(allConstructors[0].GetParameters()) : null); - s_AllClientTestInstances.Add(instance); // keeping that instance so tests can use captured local attributes - - var typeMethodsWithContextSteps = new List(); - foreach (var method in contextType.GetMethods()) - { - if (method.GetCustomAttributes(typeof(MultiprocessContextBasedTestAttribute), true).Length > 0) - { - typeMethodsWithContextSteps.Add(method); - } - } - - foreach (var method in typeMethodsWithContextSteps) - { - var parametersToPass = GetParameterValuesToPassFunc(method.GetParameters()); - var enumerator = (IEnumerator)method.Invoke(instance, parametersToPass.ToArray()); - while (enumerator.MoveNext()) { } - } - } - - IsRegistering = false; - HasRegistered = true; - MultiprocessLogger.Log("InitializeAllSteps - Done"); - } - - /// - /// Executes an action with the specified context. This allows writing tests all in the same sequential flow, - /// making it more readable. This allows not having to jump between static client methods and test method - /// - /// context to use. for example, should execute client side? server side? - /// action to execute - /// waits for timeout and just finishes step execution silently - /// parameters to pass to action - /// - /// waits multiple frames before allowing the execution to continue. This means ClientFinishedServerRpc must be called manually - /// - public ExecuteStepInContext(StepExecutionContext actionContext, Action stepToExecute, bool ignoreTimeoutException = false, byte[] paramToPass = default, NetworkManager networkManager = null, bool waitMultipleUpdates = false, Func additionalIsFinishedWaiter = null) - { - m_StartTime = Time.time; - m_IsRegistering = IsRegistering; - m_ActionContext = actionContext; - m_StepToExecute = stepToExecute; - m_WaitMultipleUpdates = waitMultipleUpdates; - m_IgnoreTimeoutException = ignoreTimeoutException; - - if (additionalIsFinishedWaiter != null) - { - m_AdditionalIsFinishedWaiter = additionalIsFinishedWaiter; - } - - if (networkManager == null) - { - networkManager = NetworkManager.Singleton; - } - - m_NetworkManager = networkManager; // todo test using this for multiinstance tests too? - - var callerMethod = new StackFrame(1).GetMethod(); // one skip frame for current method - - var methodId = GetMethodIdentifier(callerMethod); // assumes called from IEnumerator MoveNext, which should be the case since we're a CustomYieldInstruction. This will return a generated class name which should be unique - if (!s_MethodIdCounter.ContainsKey(methodId)) - { - s_MethodIdCounter[methodId] = 0; - } - - string currentActionId = $"{methodId}-{s_MethodIdCounter[methodId]++}"; - m_CurrentActionId = currentActionId; - - if (m_IsRegistering) - { - Assert.That(AllActions, Does.Not.Contain(currentActionId)); // sanity check - AllActions[currentActionId] = this; - MultiprocessLogger.Log($"InitializeAllSteps - Registering {currentActionId}"); - } - else - { - MultiprocessLogger.Log($"InitializeAllSteps - Not Registering {currentActionId}"); - if (shouldExecuteLocally) - { - m_StepToExecute.Invoke(paramToPass); - } - else - { - if (networkManager.IsServer) - { - TestCoordinator.Instance.TriggerActionIdClientRpc(currentActionId, paramToPass, m_IgnoreTimeoutException, - clientRpcParams: new ClientRpcParams - { - Send = new ClientRpcSendParams { TargetClientIds = TestCoordinator.AllClientIdsExceptMine.ToArray() } - }); - foreach (var clientId in TestCoordinator.AllClientIdsExceptMine) - { - m_ClientIsFinishedChecks.Add(TestCoordinator.ConsumeClientIsFinished(clientId)); - } - } - else - { - throw new NotImplementedException(); - } - } - } - } - - public void Invoke(byte[] args) - { - m_StepToExecute.Invoke(args); - if (!m_WaitMultipleUpdates) - { - if (!m_NetworkManager.IsServer) - { - TestCoordinator.Instance.ClientFinishedServerRpc(); - } - else - { - throw new NotImplementedException("todo implement"); - } - } - } - - public override bool keepWaiting - { - get - { - if (isTimingOut) - { - if (m_IgnoreTimeoutException) - { - Debug.LogWarning($"Timeout ignored for action ID {m_CurrentActionId}"); - return false; - } - - throw new Exception($"timeout for Context Step with action ID {m_CurrentActionId}"); - } - - if (m_AdditionalIsFinishedWaiter != null) - { - var isFinished = m_AdditionalIsFinishedWaiter.Invoke(); - if (!isFinished) - { - return true; - } - } - - if (m_IsRegistering || shouldExecuteLocally || m_ClientIsFinishedChecks == null) - { - return false; - } - - for (int i = m_ClientIsFinishedChecks.Count - 1; i >= 0; i--) - { - if (m_ClientIsFinishedChecks[i].Invoke()) - { - m_ClientIsFinishedChecks.RemoveAt(i); - } - else - { - return true; - } - } - - return false; - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs.meta b/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs.meta deleted file mode 100644 index 2b5f013d83..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1ff1efc1d00c64914905497db918aadc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs b/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs deleted file mode 100644 index ebacd0ecda..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -using System.Collections; -using System.Text.RegularExpressions; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; -using static ExecuteStepInContext; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - /// - /// Smoke tests for ExecuteStepInContext, to make sure it's working properly before being used in other tests - /// - [TestFixture(1)] - [TestFixture(2)] - public class ExecuteStepInContextTests : BaseMultiprocessTests - { - private int m_WorkerCountToTest; - - public ExecuteStepInContextTests(int workerCountToTest) - { - m_WorkerCountToTest = workerCountToTest; - } - - protected override int WorkerCount => m_WorkerCountToTest; - protected override bool IsPerformanceTest => false; - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator TestWithSameName([Values(1)] int a) - { - // ExecuteStepInContext bases itself on method name to identify steps. We need to make sure that methods with - // same names, but different signatures behave correctly - InitializeContextSteps(); - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Assert.That(a, Is.EqualTo(1)); - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - Assert.That(BitConverter.ToInt32(bytes, 0), Is.EqualTo(1)); - }, paramToPass: BitConverter.GetBytes(a)); - } - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator TestWithSameName([Values(2)] int a, [Values(3)] int b) - { - InitializeContextSteps(); - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Assert.That(b, Is.EqualTo(3)); - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - Assert.That(BitConverter.ToInt32(bytes, 0), Is.EqualTo(3)); - }, paramToPass: BitConverter.GetBytes(b)); - } - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator TestWithParameters([Values(1, 2, 3)] int a) - { - InitializeContextSteps(); - - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Assert.Less(a, 4); - Assert.Greater(a, 0); - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - var clientA = BitConverter.ToInt32(bytes, 0); - Assert.True(!NetworkManager.Singleton.IsServer); - Assert.Less(clientA, 4); - Assert.Greater(clientA, 0); - }, paramToPass: BitConverter.GetBytes(a)); - } - - [UnityTest, MultiprocessContextBasedTest] - [TestCase(1, 2, ExpectedResult = null)] - [TestCase(2, 3, ExpectedResult = null)] - [TestCase(3, 4, ExpectedResult = null)] - public IEnumerator TestWithParameters(int a, int b) - { - InitializeContextSteps(); - - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Assert.Less(a, 4); - Assert.Greater(a, 0); - Assert.Less(b, 5); - Assert.Greater(b, 1); - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - var clientB = BitConverter.ToInt32(bytes, 0); - Assert.True(!NetworkManager.Singleton.IsServer); - Assert.Less(clientB, 5); - Assert.Greater(clientB, 1); - }, paramToPass: BitConverter.GetBytes(b)); - } - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator TestExceptionClientSide() - { - InitializeContextSteps(); - - const string exceptionMessageToTest = "This is an exception for TestCoordinator that's expected"; - yield return new ExecuteStepInContext(StepExecutionContext.Clients, _ => - { - throw new Exception(exceptionMessageToTest); - }, ignoreTimeoutException: true); - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - for (int i = 0; i < m_WorkerCountToTest; i++) - { - LogAssert.Expect(LogType.Error, new Regex($".*{exceptionMessageToTest}.*")); - } - }); - - const string exceptionUpdateMessageToTest = "This is an exception for update loop client side that's expected"; - yield return new ExecuteStepInContext(StepExecutionContext.Clients, _ => - { - void UpdateFunc(float _) - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= UpdateFunc; - throw new Exception(exceptionUpdateMessageToTest); - } - - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += UpdateFunc; - }, ignoreTimeoutException: true); - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - for (int i = 0; i < m_WorkerCountToTest; i++) - { - LogAssert.Expect(LogType.Error, new Regex($".*{exceptionUpdateMessageToTest}.*")); - } - }); - } - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator ContextTestWithAdditionalWait() - { - InitializeContextSteps(); - - const int maxValue = 10; - yield return new ExecuteStepInContext(StepExecutionContext.Clients, _ => - { - int count = 0; - - void UpdateFunc(float _) - { - TestCoordinator.Instance.WriteTestResultsServerRpc(count++); - if (count > maxValue) - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= UpdateFunc; - } - } - - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += UpdateFunc; - }, additionalIsFinishedWaiter: () => - { - int nbFinished = 0; - for (int i = 0; i < m_WorkerCountToTest; i++) - { - if (TestCoordinator.PeekLatestResult(TestCoordinator.AllClientIdsExceptMine[i]) == maxValue) - { - nbFinished++; - } - } - - return nbFinished == m_WorkerCountToTest; - }); - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - Assert.That(TestCoordinator.AllClientIdsExceptMine.Count, Is.EqualTo(m_WorkerCountToTest)); - foreach (var clientId in TestCoordinator.AllClientIdsExceptMine) - { - var current = 0; - foreach (var res in TestCoordinator.ConsumeCurrentResult(clientId)) - { - Assert.That(res, Is.EqualTo(current++)); - } - - Assert.That(current - 1, Is.EqualTo(maxValue)); - } - }); - } - - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator TestExecuteInContext() - { - InitializeContextSteps(); - - int stepCountExecuted = 0; - yield return new ExecuteStepInContext(StepExecutionContext.Server, args => - { - stepCountExecuted++; - int count = BitConverter.ToInt32(args, 0); - Assert.That(count, Is.EqualTo(1)); - }, paramToPass: BitConverter.GetBytes(1)); - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, args => - { - int count = BitConverter.ToInt32(args, 0); - Assert.That(count, Is.EqualTo(2)); - TestCoordinator.Instance.WriteTestResultsServerRpc(12345); -#if UNITY_EDITOR - Assert.Fail("Should not be here!! This should only execute on client!!"); -#endif - }, paramToPass: BitConverter.GetBytes(2)); - - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - stepCountExecuted++; - int resultCountFromWorkers = 0; - foreach (var res in TestCoordinator.ConsumeCurrentResult()) - { - resultCountFromWorkers++; - Assert.AreEqual(12345, res.result); - } - - Assert.That(resultCountFromWorkers, Is.EqualTo(WorkerCount)); - }); - - const int timeToWait = 4; - yield return new ExecuteStepInContext(StepExecutionContext.Clients, _ => - { - void UpdateFunc(float _) - { - if (Time.time > timeToWait) - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= UpdateFunc; - TestCoordinator.Instance.WriteTestResultsServerRpc(Time.time); - - TestCoordinator.Instance.ClientFinishedServerRpc(); // since finishOnInvoke is false, we need to do this manually - } - } - - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += UpdateFunc; - }, waitMultipleUpdates: true); // waits multiple frames before allowing the next action to continue. - - yield return new ExecuteStepInContext(StepExecutionContext.Server, args => - { - stepCountExecuted++; - int count = 0; - foreach (var res in TestCoordinator.ConsumeCurrentResult()) - { - count++; - Assert.GreaterOrEqual(res.result, timeToWait); - } - - Assert.Greater(count, 0); - }); - - if (!IsRegistering) - { - Assert.AreEqual(3, stepCountExecuted); - } - } - } -} - diff --git a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs.meta b/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs.meta deleted file mode 100644 index 3f89ca9cb5..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ExecuteStepInContextTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 80b877babc0ce4b0d8cf31e73216d49a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers.meta b/testproject/Legacy/MultiprocessRuntime/Helpers.meta deleted file mode 100644 index 2b9c70c07b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ae0eb1e25098241b182babd91479ea26 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs deleted file mode 100644 index b992dfb53b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System; -using System.IO; -#if UNITY_EDITOR -using UnityEditor; -using UnityEditor.Build.Reporting; -#endif -using UnityEngine; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - /// - /// This is needed as Unity throws "An abnormal situation has occurred: the PlayerLoop internal function has been called recursively. Please contact Customer Support with a sample project so that we can reproduce the problem and troubleshoot it." - /// when trying to build from Setup() steps in tests. - /// - public static class BuildMultiprocessTestPlayer - { - public const string MultiprocessBaseMenuName = "Netcode/Multiprocess Test"; - public const string BuildAndExecuteMenuName = MultiprocessBaseMenuName + "/Build Test Player #t"; - public const string MainSceneName = "MultiprocessTestScene"; - - private static string BuildPathDirectory => Path.Combine(Path.GetDirectoryName(Application.dataPath), "Builds", "MultiprocessTests"); - public static string BuildPath => Path.Combine(BuildPathDirectory, "MultiprocessTestPlayer"); - public const string BuildInfoFileName = "BuildInfo.json"; - -#if UNITY_EDITOR - /// - /// Build the standalone player on the current platform - /// This method is both a menu item as well as a public method that can be called from CI - /// in order to build the standalone player - /// - [MenuItem(BuildAndExecuteMenuName)] - public static void BuildRelease() - { - var report = BuildPlayerUtility(); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } - - [MenuItem(MultiprocessBaseMenuName + "/Build Test Player (Debug)")] - public static void BuildDebug() - { - var report = BuildPlayerUtility(BuildTarget.NoTarget, null, true); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } - - [MenuItem(MultiprocessBaseMenuName + "/Delete Test Build")] - public static void DeleteBuild() - { - if (Directory.Exists(BuildPathDirectory)) - { - Directory.Delete(BuildPathDirectory, recursive: true); - } - else - { - Debug.Log($"[{nameof(BuildMultiprocessTestPlayer)}] build directory does not exist ({BuildPathDirectory}) not deleting anything"); - } - } - - private static BuildReport BuildPlayerUtility(BuildTarget buildTarget = BuildTarget.NoTarget, string buildPathExtension = null, bool buildDebug = false) - { - SaveBuildInfo(new BuildInfo() { BuildPath = BuildPath }); - - // deleting so we don't end up testing on outdated builds if there's a build failure - DeleteBuild(); - - if (buildTarget == BuildTarget.NoTarget) - { - if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor) - { - buildPathExtension += ".exe"; - buildTarget = BuildTarget.StandaloneWindows64; - } - else if (Application.platform == RuntimePlatform.OSXPlayer || Application.platform == RuntimePlatform.OSXEditor) - { - buildPathExtension += ".app"; - buildTarget = BuildTarget.StandaloneOSX; - } - else if (Application.platform == RuntimePlatform.LinuxEditor || Application.platform == RuntimePlatform.LinuxPlayer) - { - buildPathExtension += ""; - buildTarget = BuildTarget.StandaloneLinux64; - } - } - - var buildPathToUse = BuildPath; - buildPathToUse += buildPathExtension; - - var buildPlayerOptions = new BuildPlayerOptions - { - scenes = new[] { "Assets/Scenes/MultiprocessTestScene.unity" }, - locationPathName = buildPathToUse, - target = buildTarget - }; - var buildOptions = BuildOptions.None; - if (buildDebug || buildTarget == BuildTarget.Android) - { - buildOptions |= BuildOptions.Development; - buildOptions |= BuildOptions.AllowDebugging; - } - - buildOptions |= BuildOptions.StrictMode; - buildOptions |= BuildOptions.IncludeTestAssemblies; - buildPlayerOptions.options = buildOptions; - - BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions); - BuildSummary summary = report.summary; - - if (summary.result == BuildResult.Succeeded) - { - Debug.Log($"Build succeeded: {summary.totalSize} bytes at {summary.outputPath}"); - } - - return report; - } - - [MenuItem(MultiprocessBaseMenuName + "/Windows Standalone Player")] - public static void BuildWindowsStandalonePlayer() - { - var report = BuildPlayerUtility(BuildTarget.StandaloneWindows64, ".exe"); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } - - [MenuItem(MultiprocessBaseMenuName + "/Build OSX")] - public static void BuildOSX() - { - var report = BuildPlayerUtility(BuildTarget.StandaloneOSX, ".app"); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } - - [MenuItem(MultiprocessBaseMenuName + "/Build Linux")] - public static void BuildLinux() - { - var report = BuildPlayerUtility(BuildTarget.StandaloneLinux64, ""); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } - - [MenuItem(MultiprocessBaseMenuName + "/Build Android")] - public static void BuildAndroid() - { - var report = BuildPlayerUtility(BuildTarget.Android, ".apk"); - if (report.summary.result != BuildResult.Succeeded) - { - throw new Exception($"Build failed! {report.summary.totalErrors} errors"); - } - } -#endif - - [Serializable] - public struct BuildInfo - { - public string BuildPath; - public bool IsDebug; - } - - public static bool DoesBuildInfoExist() - { - var buildfileInfo = new FileInfo(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName)); - return buildfileInfo.Exists; - } - - public static BuildInfo ReadBuildInfo() - { - var jsonString = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName)); - return JsonUtility.FromJson(jsonString); - } - - public static void SaveBuildInfo(BuildInfo toSave) - { - var buildInfoJson = JsonUtility.ToJson(toSave); - File.WriteAllText(Path.Combine(Application.streamingAssetsPath, BuildInfoFileName), buildInfoJson); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta deleted file mode 100644 index 87acf05da8..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/BuildMultiprocessTestPlayer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b389565fd8544431db4c24940cb569c6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs deleted file mode 100644 index df0e14f61c..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using UnityEngine; - -/// -/// Component who's purpose is to expose callbacks to code tests -/// -public class CallbackComponent : MonoBehaviour -{ - public Action OnUpdate; - - // Update is called once per frame - private void Update() - { - try - { - OnUpdate?.Invoke(Time.deltaTime); - } - catch (Exception e) - { - TestCoordinator.Instance.WriteErrorServerRpc(e.ToString()); - throw; - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs.meta deleted file mode 100644 index 7347e89e7b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/CallbackComponent.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 55d1c75ce242745ac98f7e7aca6d2d19 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs deleted file mode 100644 index efca1c8970..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using UnityEngine; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class ConfigurationTools - { - public static async Task GetRemoteConfig() - { - var theList = new JobQueueItemArray(); - using var client = new HttpClient(); - var cancelAfterDelay = new CancellationTokenSource(TimeSpan.FromSeconds(10)); - var response = await client.GetAsync("https://multiprocess-log-event-manager.cds.internal.unity3d.com/api/JobWithFile", - HttpCompletionOption.ResponseHeadersRead, cancelAfterDelay.Token).ConfigureAwait(false); - var content = await response.Content.ReadAsStringAsync(); - JsonUtility.FromJsonOverwrite(content, theList); - return theList; - } - - public static async void CompleteJobQueueItem(JobQueueItem item) - { - await PostJobQueueItem(item, "/complete"); - } - - public static async void ClaimJobQueueItem(JobQueueItem item) - { - await PostJobQueueItem(item, "/claim"); - } - - public static async Task PostJobQueueItem(JobQueueItem item, string path = "") - { - using var client = new HttpClient(); - using var request = new HttpRequestMessage(HttpMethod.Post, "https://multiprocess-log-event-manager.cds.internal.unity3d.com/api/JobWithFile" + path); - var json = JsonUtility.ToJson(item); - using var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); - request.Content = stringContent; - MultiprocessLogger.Log($"Posting remoteConfig to server {json}"); - var cancelAfterDelay = new CancellationTokenSource(TimeSpan.FromSeconds(20)); - var response = await client - .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancelAfterDelay.Token).ConfigureAwait(false); - MultiprocessLogger.Log($"remoteConfig posted, checking response {response.StatusCode}"); - } - } - - [Serializable] - public class JobQueueItemArray - { - public List JobQueueItems; - } - - [Serializable] - public class JobQueueItem - { - public int Id; - public long JobId; - public string GitHash; - public string HostIp; - public int PlatformId; - public int JobStateId; - public string CreatedBy; - public string UpdatedBy; - public string TransportName; - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs.meta deleted file mode 100644 index daf965ddca..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationTools.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ad11397b80c04404cb24e82cc7872334 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs deleted file mode 100644 index bb9d097f62..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs +++ /dev/null @@ -1,9 +0,0 @@ - -public enum ConfigurationType -{ - Unknown, - Remote, - CommandLine, - ResourceFile, - Host -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs.meta deleted file mode 100644 index 9e89a3cb23..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/ConfigurationType.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5b189bac115ca4587ba64943bfcc67f6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs deleted file mode 100644 index 41558e04dc..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using UnityEngine; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class CustomPrefabSpawnerForPerformanceTests : INetworkPrefabInstanceHandler, IDisposable where T : NetworkBehaviour - { - private GameObjectPool m_ObjectPool; - private Action m_SetupSpawnedObject; - private Action m_OnRelease; - - public CustomPrefabSpawnerForPerformanceTests(T prefabToSpawn, int maxObjectsToSpawn, Action setupSpawnedObject, Action onRelease) - { - m_ObjectPool = new GameObjectPool(); - m_ObjectPool.Initialize(maxObjectsToSpawn, prefabToSpawn); - m_SetupSpawnedObject = setupSpawnedObject; - m_OnRelease = onRelease; - } - - public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation) - { - var netBehaviour = m_ObjectPool.Get(); - var networkObject = netBehaviour.NetworkObject; - Transform netTransform = networkObject.transform; - netTransform.position = position; - netTransform.rotation = rotation; - m_SetupSpawnedObject(netBehaviour); - return networkObject; - } - - public void Destroy(NetworkObject networkObject) - { - var behaviour = networkObject.gameObject.GetComponent(); // todo expensive, only used in teardown for now, should optimize eventually - m_OnRelease(behaviour); - Transform netTransform = networkObject.transform; - netTransform.position = Vector3.zero; - netTransform.rotation = Quaternion.identity; - m_ObjectPool.Release(behaviour); - } - - public void Dispose() - { - m_ObjectPool.Dispose(); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs.meta deleted file mode 100644 index e36dcb4466..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/CustomPrefabSpawnerForPerformanceTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dbe82ff88ee654428b03632ec6ffff07 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs deleted file mode 100644 index 41224a47c5..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using Object = UnityEngine.Object; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - /// - /// Have to implement our own pool here for compatibility with Unity 2020LTS - /// This shouldn't be needed if we were supporting only 2021 (and its new Pool) - /// - public class GameObjectPool : IDisposable where T : NetworkBehaviour - { - private List m_AllGameObject; - private Stack m_FreeIndexes; - private Dictionary m_ReverseLookup = new Dictionary(); - - public void Initialize(int originalCount, T prefabToSpawn) - { - m_AllGameObject = new List(originalCount); - m_FreeIndexes = new Stack(originalCount); - for (int i = 0; i < originalCount; i++) - { - var go = Object.Instantiate(prefabToSpawn); - go.gameObject.SetActive(false); - m_AllGameObject.Add(go); - m_FreeIndexes.Push(i); - m_ReverseLookup[go] = i; - } - } - - public void Dispose() - { - foreach (var gameObject in m_AllGameObject) - { - Object.Destroy(gameObject); - } - m_AllGameObject = null; - m_FreeIndexes = null; - m_ReverseLookup = null; - } - - public T Get() - { - if (m_FreeIndexes.Count == 0) - { - throw new Exception("Pool full!"); - } - var o = m_AllGameObject[m_FreeIndexes.Pop()]; - o.gameObject.SetActive(true); - return o; - } - - public void Release(T toRelease) - { - int index = m_ReverseLookup[toRelease]; - m_FreeIndexes.Push(index); - toRelease.gameObject.SetActive(false); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs.meta deleted file mode 100644 index 5a5f42a8e8..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/GameObjectPool.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: dc81fb2a3c7347a3a0b5e98d2ba49ed7 -timeCreated: 1622655847 \ No newline at end of file diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs deleted file mode 100644 index 37ea12c6ee..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using NUnit.Framework; -using UnityEngine; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class MultiprocessLogger - { - private static Logger s_Logger; - - static MultiprocessLogger() => s_Logger = new Logger(logHandler: new MultiprocessLogHandler()); - - public static void Log(string msg) - { - s_Logger.Log(msg); - } - - public static void LogError(string msg) - { - s_Logger.LogError("", msg); - } - - public static void LogWarning(string msg) - { - s_Logger.LogWarning("", msg); - } - } - - public class MultiprocessLogHandler : ILogHandler - { - public static long JobId; - static MultiprocessLogHandler() - { - if (JobId == 0) - { - string sJobId = Environment.GetEnvironmentVariable("YAMATO_JOB_ID"); - if (!long.TryParse(sJobId, out JobId)) - { - JobId = -2; - } - } - } - public void LogException(Exception exception, UnityEngine.Object context) - { - Debug.unityLogger.LogException(exception, context); - } - - public void LogFormat(LogType logType, UnityEngine.Object context, string format, params object[] args) - { - string testName = null; - try - { - testName = TestContext.CurrentContext.Test.Name; - } - catch (Exception) - { - // ignored - } - - if (string.IsNullOrEmpty(testName)) - { - testName = "unknown"; - } - - Debug.LogFormat(logType, LogOption.NoStacktrace, context, $"MPLOG({DateTime.Now:T}) : {testName} : {format}", args); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs.meta deleted file mode 100644 index 2c4934f392..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessLogger.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8c1a196a93520415cbf79751b2bb8eee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs b/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs deleted file mode 100644 index 6776bc4151..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs +++ /dev/null @@ -1,278 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using Unity.Netcode.MultiprocessRuntimeTests; -using UnityEngine; -using Debug = UnityEngine.Debug; - -public class MultiprocessOrchestration -{ - public static bool IsPerformanceTest; - public const string IsWorkerArg = "-isWorker"; - private static DirectoryInfo s_MultiprocessDirInfo; - public static DirectoryInfo MultiprocessDirInfo - { - private set => s_MultiprocessDirInfo = value; - get => s_MultiprocessDirInfo ?? initMultiprocessDirinfo(); - } - private static List s_Processes = new List(); - private static int s_TotalProcessCounter = 0; - public static string PathToDll { get; private set; } - public static List ProcessList = new List(); - private static FileInfo s_Localip_fileinfo; - - private static DirectoryInfo initMultiprocessDirinfo() - { - string userprofile = ""; - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - userprofile = Environment.GetEnvironmentVariable("USERPROFILE"); - } - else - { - userprofile = Environment.GetEnvironmentVariable("HOME"); - } - s_MultiprocessDirInfo = new DirectoryInfo(Path.Combine(userprofile, ".multiprocess")); - if (!MultiprocessDirInfo.Exists) - { - MultiprocessDirInfo.Create(); - } - s_Localip_fileinfo = new FileInfo(Path.Combine(s_MultiprocessDirInfo.FullName, "localip")); - - return s_MultiprocessDirInfo; - } - - static MultiprocessOrchestration() - { - initMultiprocessDirinfo(); - MultiprocessLogger.Log($" userprofile: {s_MultiprocessDirInfo.FullName} localipfile: {s_Localip_fileinfo}"); - var rootdir_FileInfo = new FileInfo(Path.Combine(MultiprocessDirInfo.FullName, "rootdir")); - MultiprocessLogger.Log($"Checking for the existence of {rootdir_FileInfo.FullName}"); - if (rootdir_FileInfo.Exists) - { - var rootDirText = (File.ReadAllText(rootdir_FileInfo.FullName)).Trim(); - PathToDll = Path.Combine(rootDirText, "multiplayer-multiprocess-test-tools/BokkenForNetcode/ProvisionBokkenMachines/bin/Debug/netcoreapp3.1/osx-x64", "ProvisionBokkenMachines.dll"); - } - else - { - MultiprocessLogger.Log("PathToDll cannot be set as rootDir doesn't exist"); - PathToDll = "unknown"; - } - } - - /// - /// This is to detect if we should ignore Multiprocess tests - /// For testing, include the -bypassIgnoreUTR command line parameter when running UTR. - /// - public static bool ShouldIgnoreUTRTests() - { - return Environment.GetCommandLineArgs().Contains("-automated") && !Environment.GetCommandLineArgs().Contains("-bypassIgnoreUTR"); - } - - public static int ActiveWorkerCount() - { - int activeWorkerCount = 0; - if (s_Processes == null) - { - return activeWorkerCount; - } - - if (s_Processes.Count > 0) - { - foreach (var p in s_Processes) - { - if ((p != null) && (!p.HasExited)) - { - activeWorkerCount++; - } - } - } - return activeWorkerCount; - } - - public static string StartWorkerNode() - { - if (s_Processes == null) - { - s_Processes = new List(); - } - - var workerProcess = new Process(); - s_TotalProcessCounter++; - if (s_Processes.Count > 0) - { - string message = ""; - foreach (var p in s_Processes) - { - message += $" {p.Id} {p.HasExited} {p.StartTime} "; - } - MultiprocessLogger.Log($"Current process count {s_Processes.Count} with data {message}"); - } - - //TODO this should be replaced eventually by proper orchestration for all supported platforms - // Starting new local processes is a solution to help run perf tests locally. CI should have multi machine orchestration to - // run performance tests with more realistic conditions. - string buildInstructions = $"You probably didn't generate your build. Please make sure you build a player using the '{BuildMultiprocessTestPlayer.BuildAndExecuteMenuName}' menu"; - string extraArgs = ""; - try - { - var buildPath = BuildMultiprocessTestPlayer.ReadBuildInfo().BuildPath; - switch (Application.platform) - { - case RuntimePlatform.OSXPlayer: - case RuntimePlatform.OSXEditor: - workerProcess.StartInfo.FileName = $"{buildPath}.app/Contents/MacOS/testproject"; - // extraArgs += "-popupwindow -screen-width 100 -screen-height 100"; - extraArgs += "-batchmode -nographics"; - break; - case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.WindowsEditor: - workerProcess.StartInfo.FileName = $"{buildPath}.exe"; - //extraArgs += "-popupwindow -screen-width 100 -screen-height 100"; - extraArgs += "-popupwindow"; - break; - case RuntimePlatform.LinuxPlayer: - case RuntimePlatform.LinuxEditor: - workerProcess.StartInfo.FileName = $"{buildPath}"; - // extraArgs += "-popupwindow -screen-width 100 -screen-height 100"; - extraArgs += "-batchmode -nographics"; - break; - default: - throw new NotImplementedException($"{nameof(StartWorkerNode)}: Current platform is not supported"); - } - } - catch (FileNotFoundException) - { - Debug.LogError($"Could not find build info file. {buildInstructions}"); - throw; - } - - string logPath = Path.Combine(MultiprocessDirInfo.FullName, $"logfile-mp{s_TotalProcessCounter}.log"); - - workerProcess.StartInfo.UseShellExecute = false; - workerProcess.StartInfo.RedirectStandardError = true; - workerProcess.StartInfo.RedirectStandardOutput = true; - workerProcess.StartInfo.Arguments = $"{IsWorkerArg} {extraArgs} -logFile {logPath}"; - - try - { - MultiprocessLogger.Log($"Attempting to start new process, current process count: {s_Processes.Count} with arguments {workerProcess.StartInfo.Arguments}"); - var newProcessStarted = workerProcess.Start(); - if (!newProcessStarted) - { - throw new Exception("Failed to start worker process!"); - } - s_Processes.Add(workerProcess); - } - catch (Win32Exception e) - { - MultiprocessLogger.LogError($"Error starting player, {buildInstructions}, {e}"); - throw; - } - return logPath; - } - - public static void ShutdownAllProcesses() - { - MultiprocessLogger.Log("Shutting down all processes.."); - foreach (var process in s_Processes) - { - MultiprocessLogger.Log($"Shutting down process {process.Id} with state {process.HasExited}"); - try - { - if (!process.HasExited) - { - // Close process by sending a close message to its main window. - process.CloseMainWindow(); - - // Free resources associated with process. - process.Close(); - } - } - catch (Exception ex) - { - Debug.LogException(ex); - } - } - - s_Processes.Clear(); - } - - public static bool IsRemoteOperationEnabled() - { - string encodedPlatformList = Environment.GetEnvironmentVariable("MP_PLATFORM_LIST"); - if (encodedPlatformList != null && encodedPlatformList.Split(',').Length > 1) - { - return true; - } - return false; - } - - public static string[] GetRemotePlatformList() - { - // "default-win:test-win,default-mac:test-mac" - if (!IsRemoteOperationEnabled()) - { - return null; - } - string encodedPlatformList = Environment.GetEnvironmentVariable("MP_PLATFORM_LIST"); - string[] separated = encodedPlatformList.Split(','); - return separated; - } - - public static List GetRemoteMachineList() - { - var machineJson = new List(); - foreach (var f in MultiprocessDirInfo.GetFiles("*.json")) - { - if (f.Name.Equals("remoteConfig.json")) - { - continue; - } - else - { - machineJson.Add(f); - } - } - return machineJson; - } - - public static Process StartWorkersOnRemoteNodes(FileInfo machine) - { - string command = $" --command launch " + - $"--input-path {machine.FullName} "; - - var workerProcess = new Process(); - - workerProcess.StartInfo.FileName = Path.Combine("dotnet"); - workerProcess.StartInfo.UseShellExecute = false; - workerProcess.StartInfo.RedirectStandardError = true; - workerProcess.StartInfo.RedirectStandardOutput = true; - workerProcess.StartInfo.Arguments = $"{PathToDll} {command} "; - try - { - var newProcessStarted = workerProcess.Start(); - - if (!newProcessStarted) - { - throw new Exception("Failed to start worker process!"); - } - } - catch (Win32Exception e) - { - MultiprocessLogger.LogError($"Error starting bokken process, {e.Message} {e.Data} {e.ErrorCode}"); - throw; - } - - - ProcessList.Add(workerProcess); - - MultiprocessLogger.Log($"Execute Command: {PathToDll} {command} End"); - return workerProcess; - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta b/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta deleted file mode 100644 index 4797a6c5a7..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/Helpers/MultiprocessOrchestration.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b59a46cbb2c54f4d977a05103227453 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs b/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs deleted file mode 100644 index 218c80d61a..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using Unity.PerformanceTesting; -using UnityEngine; -using UnityEngine.Profiling; -using UnityEngine.SceneManagement; -using UnityEngine.TestTools; -using static ExecuteStepInContext; -using Object = UnityEngine.Object; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class NetworkVariablePerformanceTests : BaseMultiprocessTests - { - protected override int WorkerCount { get; } = 1; - private const int k_MaxObjectsToSpawn = 10000; - private List m_ServerSpawnedObjects = new List(); - private static GameObjectPool s_ServerObjectPool; - private CustomPrefabSpawnerForPerformanceTests m_ClientPrefabHandler; - private OneNetVar m_PrefabToSpawn; - protected override bool IsPerformanceTest => true; - - private class OneNetVar : NetworkBehaviour - { - public static int InstanceCount; - public NetworkVariable OneInt = new NetworkVariable(); - - public void Initialize() - { - InstanceCount++; - if (IsServer) - { - OneInt.Value = 1; - } - } - - public static void Stop() - { - InstanceCount--; - } - } - - [OneTimeSetUp] - public override void SetupTestSuite() - { - base.SetupTestSuite(); - if (!IgnoreMultiprocessTests) - { - SceneManager.sceneLoaded += OnSceneLoadedInitSetupSuite; - } - } - - private void OnSceneLoadedInitSetupSuite(Scene scene, LoadSceneMode loadSceneMode) - { - SceneManager.sceneLoaded -= OnSceneLoadedInitSetupSuite; - InitializePrefab(); - s_ServerObjectPool = new GameObjectPool(); - s_ServerObjectPool.Initialize(k_MaxObjectsToSpawn, m_PrefabToSpawn); - } - - private void InitializePrefab() - { - if (m_PrefabToSpawn == null) - { - var prefabCopy = Object.Instantiate(PrefabReference.Instance.ReferencedPrefab); - m_PrefabToSpawn = prefabCopy.AddComponent(); - } - } - - [UnityTest, Performance, MultiprocessContextBasedTest] - public IEnumerator TestSpawningManyObjects([Values(1, 2, 1000, 2000, 10000)] int nbObjects) - { - InitializeContextSteps(); - - if (!IsRegistering && TestCoordinator.Instance.NetworkManager.IsServer && BuildMultiprocessTestPlayer.ReadBuildInfo().IsDebug) - { - // build test player in debug mode to enable this - var timeToWait = 20; - Debug.Log($"Debug mode tests enabled, waiting {timeToWait} seconds to give some time to attach debugger"); - yield return new WaitForSeconds(timeToWait); - } - - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - Assert.LessOrEqual(nbObjects, k_MaxObjectsToSpawn); // sanity check - }); - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, stepToExecute: nbObjectsBytes => - { - // setup clients - InitializePrefab(); - var targetCount = BitConverter.ToInt32(nbObjectsBytes, 0); - - m_ClientPrefabHandler = new CustomPrefabSpawnerForPerformanceTests(m_PrefabToSpawn, k_MaxObjectsToSpawn, SetupSpawnedObject, StopSpawnedObject); - var hasAddedHandler = NetworkManager.Singleton.PrefabHandler.AddHandler(m_PrefabToSpawn.NetworkObject, m_ClientPrefabHandler); - Assert.That(hasAddedHandler); - - // add client side reporter for later spawn steps - void UpdateFunc(float deltaTime) - { - var count = OneNetVar.InstanceCount; - if (count > 0) - { - TestCoordinator.Instance.WriteTestResultsServerRpc(count); - - if (count >= targetCount) - { - // we got what we want, don't update results any longer - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= UpdateFunc; - } - } - } - - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += UpdateFunc; - }, paramToPass: BitConverter.GetBytes(nbObjects)); - - yield return new ExecuteStepInContext(StepExecutionContext.Server, _ => - { - // start test - using (Measure.Scope($"Time Taken For Spawning {nbObjects} objects server side and getting report")) - { - // spawn prefabs for test - var totalAllocSampleGroup = new SampleGroup("GC Alloc", SampleUnit.Kilobyte); - var beforeAllocatedMemory = Profiler.GetTotalAllocatedMemoryLong(); - Measure.Custom(totalAllocSampleGroup, beforeAllocatedMemory / 1024f); - for (int i = 0; i < nbObjects; i++) - { - var spawnedObject = s_ServerObjectPool.Get(); - SetupSpawnedObject(spawnedObject); - spawnedObject.NetworkObject.Spawn(destroyWithScene: true); - m_ServerSpawnedObjects.Add(spawnedObject); - } - - var afterAllocatedMemory = Profiler.GetTotalAllocatedMemoryLong(); - Measure.Custom(totalAllocSampleGroup, afterAllocatedMemory / 1024f); - var diffAllocSampleGroup = new SampleGroup("GC Alloc diff for Spawn Server side", SampleUnit.Byte); - Measure.Custom(diffAllocSampleGroup, afterAllocatedMemory - beforeAllocatedMemory); - } - }, additionalIsFinishedWaiter: () => - { - // wait for spawn results coming from clients - int finishedCount = 0; - if (TestCoordinator.AllClientIdsWithResults.Count != WorkerCount) - { - return false; - } - - foreach (var clientIdWithResult in TestCoordinator.AllClientIdsWithResults) - { - var latestResult = TestCoordinator.PeekLatestResult(clientIdWithResult); - if (latestResult == nbObjects) - { - finishedCount++; - } - } - - return finishedCount == WorkerCount; - }); - - var serverLastResult = 0f; - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - // add measurements - // todo add more client-side metrics like memory usage, time taken to execute, etc - var allocated = new SampleGroup("NbSpawnedPerFrame client side", SampleUnit.Undefined); - - foreach (var clientId in TestCoordinator.AllClientIdsWithResults) - { - var lastResult = TestCoordinator.PeekLatestResult(clientId); - Assert.That(lastResult, Is.EqualTo(nbObjects)); - } - - Assert.That(TestCoordinator.AllClientIdsWithResults.Count, Is.EqualTo(WorkerCount)); - foreach (var (clientId, result) in TestCoordinator.ConsumeCurrentResult()) - { - Measure.Custom(allocated, result); - serverLastResult = result; - } - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, nbObjectsBytes => - { - var nbObjectsParam = BitConverter.ToInt32(nbObjectsBytes, 0); -#if UNITY_2023_1_OR_NEWER - Assert.That(Object.FindObjectsByType(FindObjectsSortMode.None).Length, Is.EqualTo(nbObjectsParam + 1), "Wrong number of spawned objects client side"); // +1 for the prefab to spawn -#else - Assert.That(Object.FindObjectsOfType(typeof(OneNetVar)).Length, Is.EqualTo(nbObjectsParam + 1), "Wrong number of spawned objects client side"); // +1 for the prefab to spawn -#endif - - - }, paramToPass: BitConverter.GetBytes(nbObjects)); - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Debug.Log($"finished with test for {nbObjects} expected objects and got {serverLastResult} objects"); - }); - } - - [UnityTearDown, MultiprocessContextBasedTest] - public IEnumerator UnityTeardown() - { - if (!IgnoreMultiprocessTests) - { - InitializeContextSteps(); - - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - foreach (var spawnedObject in m_ServerSpawnedObjects) - { - spawnedObject.NetworkObject.Despawn(false); - s_ServerObjectPool.Release(spawnedObject); - StopSpawnedObject(spawnedObject); - } - - m_ServerSpawnedObjects.Clear(); - }); - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate = null; // todo move access to callbackcomponent to singleton - - void UpdateWaitForAllOneNetVarToDespawnFunc(float deltaTime) - { - if (OneNetVar.InstanceCount == 0) - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= UpdateWaitForAllOneNetVarToDespawnFunc; - TestCoordinator.Instance.ClientFinishedServerRpc(); - } - } - - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += UpdateWaitForAllOneNetVarToDespawnFunc; - }, waitMultipleUpdates: true, ignoreTimeoutException: true); // ignoring timeout since you don't want to hide any issues in the main tests - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, _ => - { - m_ClientPrefabHandler.Dispose(); - NetworkManager.Singleton.PrefabHandler.RemoveHandler(m_PrefabToSpawn.NetworkObject); - }); - } - yield return null; - } - - [OneTimeTearDown] - public override void TeardownSuite() - { - base.TeardownSuite(); - if (!IsPerformanceTest && !IgnoreMultiprocessTests) - { - s_ServerObjectPool.Dispose(); - } - } - - private static void SetupSpawnedObject(OneNetVar spawnedObject) - { - spawnedObject.Initialize(); - } - - private static void StopSpawnedObject(OneNetVar destroyedObject) - { - OneNetVar.Stop(); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs.meta b/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs.meta deleted file mode 100644 index 492f738794..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/NetworkVariablePerformanceTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 91f4160a1de3f40c1bcdb9c18daf9bf2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs b/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs deleted file mode 100644 index 0e62bf0edb..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs +++ /dev/null @@ -1,506 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using Unity.Netcode; -using NUnit.Framework; -using UnityEngine; -using Unity.Netcode.MultiprocessRuntimeTests; -using Unity.Netcode.Transports.UTP; - -/// -/// TestCoordinator -/// Used for coordinating multiprocess end to end tests. Used to call RPCs on other nodes and gather results -/// This is needed to coordinate server and client execution steps. The current remote player test runner hardcodes test -/// to run in a bootstrap scene before launching the player and doesn't call each tests individually. There's not opportunity -/// to coordinate test execution between client and server with that model. -/// The only per tests communication already existing is to get the results per test as they are running -/// With this test coordinator, it's not possible to start a main test node with the test runner and have that server start other worker nodes -/// on which to execute client tests. We use netcode as both a test framework and as the target of our performance tests. -/// -[RequireComponent(typeof(NetworkObject))] -public class TestCoordinator : NetworkBehaviour -{ - public const int PerTestTimeoutSec = 5 * 60; // seconds - - public const float MaxWaitTimeoutSec = 60; - private const char k_MethodFullNameSplitChar = '@'; - - private bool m_ShouldShutdown; - private float m_TimeSinceLastConnected; - private float m_TimeSinceLastKeepAlive; - - public static TestCoordinator Instance; - - private Dictionary> m_TestResultsLocal = new Dictionary>(); // this isn't super efficient, but since it's used for signaling around the tests, shouldn't be too bad - private Dictionary m_ClientIsFinished = new Dictionary(); - - public static List AllClientIdsWithResults => Instance.m_TestResultsLocal.Keys.ToList(); - public static List AllClientIdsExceptMine => NetworkManager.Singleton.ConnectedClients.Keys.ToList().FindAll(client => client != NetworkManager.Singleton.LocalClientId); - - // Multimachine support - private static int s_ProcessId; - public static string Rawgithash; - - private ConfigurationType m_ConfigurationType; - public ConfigurationType ConfigurationType - { - get { return m_ConfigurationType; } - private set - { - if (m_ConfigurationType != value) - { - m_ConfigurationType = value; - } - } - } - private string m_ConnectAddress = "127.0.0.1"; - public static string Port = "7777"; - private bool m_IsClient; - - private void SetConfigurationTypeAndConnect(ConfigurationType type) - { - ConfigurationType = type; - SetAddressAndPort(); - bool startClientResult = NetworkManager.Singleton.StartClient(); - MultiprocessLogger.Log($"Starting client"); - } - - public void Awake() - { - enabled = false; - NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback; - - MultiprocessLogger.Log("Awake - Initialize All Steps"); - ExecuteStepInContext.InitializeAllSteps(); - - s_ProcessId = Process.GetCurrentProcess().Id; - ReadGitHashFile(); - - // Configuration via command line (supported for many but not all platforms) - bool isClient = Environment.GetCommandLineArgs().Any(value => value == MultiprocessOrchestration.IsWorkerArg); - if (isClient) - { - MultiprocessLogger.Log("Setting up via command line - client"); - m_IsClient = isClient; - var cli = new CommandLineProcessor(Environment.GetCommandLineArgs()); - if (Environment.GetCommandLineArgs().Any(value => value == "-ip")) - { - m_ConnectAddress = cli.TransportAddress; - } - if (Environment.GetCommandLineArgs().Any(value => value == "-p")) - { - Port = cli.TransportPort; - } - SetConfigurationTypeAndConnect(ConfigurationType.CommandLine); - } - - if (ConfigurationType == ConfigurationType.Unknown) - { - bool isHost = Environment.GetCommandLineArgs().Any(value => value == "host"); - if (isHost) - { - MultiprocessLogger.Log("Setting up via command line - host"); - var cli = new CommandLineProcessor(Environment.GetCommandLineArgs()); - ConfigurationType = ConfigurationType.CommandLine; - } - } - - - // Configuration via configuration file - all platform support but set at build time - if (ConfigurationType == ConfigurationType.Unknown) - { - //TODO: For next PR - } - - // configuration via WebApi - works on all platforms and is set at run time - if (ConfigurationType == ConfigurationType.Unknown) - { - MultiprocessLogger.Log($"Awake {s_ProcessId} - Calling ConfigureViewWebApi"); - ConfigureViaWebApi(); - MultiprocessLogger.Log($"Awake {s_ProcessId} - Calling ConfigureViewWebApi completed"); - } - - - // if we've tried all the configuration types and none of them are correct then we should log it and just go with the default values - if (ConfigurationType == ConfigurationType.Unknown) - { - MultiprocessLogger.Log("Unable to determine configuration for NetworkManager via commandline, webapi or config file"); - } - - if (Instance != null) - { - MultiprocessLogger.LogError("Multiple test coordinator, destroying this instance"); - Destroy(gameObject); - return; - } - - Instance = this; - } - - private async void ConfigureViaWebApi() - { - MultiprocessLogger.Log($"ConfigureViaWebApi - start"); - var jobQueue = await ConfigurationTools.GetRemoteConfig(); - foreach (var job in jobQueue.JobQueueItems) - { - if (Rawgithash.Equals(job.GitHash)) - { - ConfigurationTools.ClaimJobQueueItem(job); - m_ConnectAddress = job.HostIp; - m_IsClient = true; - MultiprocessLogHandler.JobId = job.JobId; - SetConfigurationTypeAndConnect(ConfigurationType.Remote); - break; - } - else - { - MultiprocessLogger.Log($"No match between {Rawgithash} and {job.GitHash}"); - } - } - MultiprocessLogger.Log($"ConfigureViaWebApi - end {ConfigurationType}"); - } - - private void ReadGitHashFile() - { - Rawgithash = "uninitialized"; - try - { - var githash_resource = Resources.Load("Text/githash"); - if (githash_resource != null) - { - Rawgithash = githash_resource.ToString(); - if (!string.IsNullOrEmpty(Rawgithash)) - { - Rawgithash = Rawgithash.Trim(); - MultiprocessLogger.Log($"Rawgithash is {Rawgithash}"); - } - } - } - catch (Exception e) - { - MultiprocessLogger.Log($"Exception getting githash resource file: {e.Message}"); - } - } - - private void SetAddressAndPort() - { - MultiprocessLogger.Log($"SetAddressAndPort - {Port} {m_ConnectAddress} {m_IsClient} "); - var ushortport = ushort.Parse(Port); - var transport = NetworkManager.Singleton.NetworkConfig.NetworkTransport; - MultiprocessLogger.Log($"transport is {transport}"); - switch (transport) - { - case UnityTransport unityTransport: - MultiprocessLogger.Log($"Setting unityTransport.ConnectionData.Port {ushortport}, isClient: {m_IsClient}, Address {m_ConnectAddress}"); - unityTransport.ConnectionData.Port = ushortport; - unityTransport.ConnectionData.Address = m_ConnectAddress; - break; - default: - MultiprocessLogger.LogError($"The transport {transport} has no case"); - break; - } - } - - public void Start() - { - MultiprocessLogger.Log($"TestCoordinator - Start"); - } - - public void Update() - { - if (Time.time - m_TimeSinceLastKeepAlive > PerTestTimeoutSec) - { - QuitApplication(); - Assert.Fail("Stayed idle too long"); - } - - if ((IsServer && NetworkManager.Singleton.IsListening) || (IsClient && NetworkManager.Singleton.IsConnectedClient)) - { - m_TimeSinceLastConnected = Time.time; - } - else if (Time.time - m_TimeSinceLastConnected > MaxWaitTimeoutSec || m_ShouldShutdown) - { - // Make sure we don't have zombie processes - MultiprocessLogger.Log($"quitting application, shouldShutdown set to {m_ShouldShutdown}, is listening {NetworkManager.Singleton.IsListening}, is connected client {NetworkManager.Singleton.IsConnectedClient}"); - if (!m_ShouldShutdown) - { - QuitApplication(); - Assert.Fail($"something wrong happened, was not connected for {Time.time - m_TimeSinceLastConnected} seconds"); - } - } - } - - private static void QuitApplication() - { -#if UNITY_EDITOR - UnityEditor.EditorApplication.isPlaying = false; -#else - Application.Quit(); -#endif - } - - public void TestRunTeardown() - { - m_TestResultsLocal.Clear(); - } - - public void OnEnable() - { - MultiprocessLogger.Log("OnEnable - Setting OnClientDisconnectCallback"); - NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback; - } - - public void OnDisable() - { - if (IsSpawned && NetworkObject != null && NetworkObject.NetworkManager != null) - { - MultiprocessLogger.Log("OnDisable - Removing OnClientDisconnectCallback"); - NetworkManager.OnClientDisconnectCallback -= OnClientDisconnectCallback; - } - - base.OnDestroy(); - } - - // Once we are connected, we can run the update method - public void OnClientConnectedCallback(ulong clientId) - { - if (enabled == false) - { - MultiprocessLogger.Log($"OnClientConnectedCallback enabling behavior clientId: {clientId} {NetworkManager.Singleton.IsHost}/{NetworkManager.Singleton.IsClient} IsRegistering:{ExecuteStepInContext.IsRegistering}"); - enabled = true; - } - } - - private static void OnClientDisconnectCallback(ulong clientId) - { - if (clientId == NetworkManager.ServerClientId || clientId == NetworkManager.Singleton.LocalClientId) - { - // if disconnect callback is for me or for server, quit, we're done here - MultiprocessLogger.Log($"received disconnect from {clientId}, quitting"); - QuitApplication(); - } - } - - private static string GetMethodInfo(Action method) - { - return $"{method.Method.DeclaringType.FullName}{k_MethodFullNameSplitChar}{method.Method.Name}"; - } - - private static string GetMethodInfo(Action method) - { - return $"{method.Method.DeclaringType.FullName}{k_MethodFullNameSplitChar}{method.Method.Name}"; - } - - public static IEnumerable<(ulong clientId, float result)> ConsumeCurrentResult() - { - foreach (var kv in Instance.m_TestResultsLocal) - { - while (kv.Value.Count > 0) - { - var toReturn = (kv.Key, kv.Value[0]); - kv.Value.RemoveAt(0); - yield return toReturn; - } - } - } - - public static IEnumerable ConsumeCurrentResult(ulong clientId) - { - var allResults = Instance.m_TestResultsLocal[clientId]; - while (allResults.Count > 0) - { - var toReturn = allResults[0]; - allResults.RemoveAt(0); - yield return toReturn; - } - } - - public static float PeekLatestResult(ulong clientId) - { - if (Instance.m_TestResultsLocal.ContainsKey(clientId) && Instance.m_TestResultsLocal[clientId].Count > 0) - { - return Instance.m_TestResultsLocal[clientId].Last(); - } - - return float.NaN; - } - - /// - /// Returns appropriate lambda according to parameters - /// Includes time check to make sure this times out - /// - /// - /// - /// - public static Func ResultIsSet(bool useTimeoutException = true) - { - var startWaitTime = Time.time; - return () => - { - if (Time.time - startWaitTime > MaxWaitTimeoutSec) - { - if (useTimeoutException) - { - throw new Exception($"timeout while waiting for results, didn't get results for {Time.time - startWaitTime} seconds"); - } - - return true; - } - - foreach (var clientIdAndTestResultList in Instance.m_TestResultsLocal) - { - if (clientIdAndTestResultList.Value.Count > 0) - { - return true; - } - } - - return false; - }; - } - - public static Func ConsumeClientIsFinished(ulong clientId, bool useTimeoutException = true) - { - var startWaitTime = Time.time; - return () => - { - if (Time.time - startWaitTime > MaxWaitTimeoutSec) - { - if (useTimeoutException) - { - throw new Exception($"timeout while waiting for client finished, didn't get results for {Time.time - startWaitTime} seconds"); - } - else - { - return true; - } - } - - if (Instance.m_ClientIsFinished.ContainsKey(clientId) && Instance.m_ClientIsFinished[clientId]) - { - Instance.m_ClientIsFinished[clientId] = false; // consume - return true; - } - - return false; - }; - } - - [Rpc(SendTo.Server)] - public void ClientFinishedServerRpc(ServerRpcParams p = default) - { - // signal from clients to the server to say the client is done with it's task - m_ClientIsFinished[p.Receive.SenderClientId] = true; - } - - public void InvokeFromMethodActionRpc(Action methodInfo, params byte[] args) - { - var methodInfoString = GetMethodInfo(methodInfo); - InvokeFromMethodNameClientRpc(methodInfoString, args, new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = AllClientIdsExceptMine.ToArray() } }); - } - - public void InvokeFromMethodActionRpc(Action methodInfo) - { - var methodInfoString = GetMethodInfo(methodInfo); - InvokeFromMethodNameClientRpc(methodInfoString, null, new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = AllClientIdsExceptMine.ToArray() } }); - } - - [ClientRpc] - public void TriggerActionIdClientRpc(string actionId, byte[] args, bool ignoreException, ClientRpcParams clientRpcParams = default) - { - MultiprocessLogger.Log($"received RPC from server, client side triggering action ID {actionId}"); - WriteLogServerRpc($"received RPC from server, client side triggering action ID {actionId} {ExecuteStepInContext.AllActions.Count}"); - try - { - ExecuteStepInContext.AllActions[actionId].Invoke(args); - } - catch (Exception e) - { - WriteErrorServerRpc(e.ToString()); - - if (!ignoreException) - { - throw; - } - else - { - Instance.ClientFinishedServerRpc(); - } - } - } - - [ClientRpc] - public void InvokeFromMethodNameClientRpc(string methodInfoString, byte[] args, ClientRpcParams clientRpcParams = default) - { - try - { - var split = methodInfoString.Split(k_MethodFullNameSplitChar); - var (classToExecute, staticMethodToExecute) = (split[0], split[1]); - - var foundType = Type.GetType(classToExecute) ?? throw new Exception($"couldn't find {classToExecute}"); - var foundMethod = foundType.GetMethod(staticMethodToExecute, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static) ?? throw new MissingMethodException($"couldn't find method {staticMethodToExecute}"); - foundMethod.Invoke(null, args != null ? new object[] { args } : null); - } - catch (Exception e) - { - WriteErrorServerRpc(e.ToString()); - throw; - } - } - - [ClientRpc] - public void CloseRemoteClientRpc() - { - try - { - NetworkManager.Singleton.Shutdown(); - m_ShouldShutdown = true; // wait until isConnectedClient is false to run Application Quit in next update - MultiprocessLogger.Log("Quitting player cleanly"); - Application.Quit(); - } - catch (Exception e) - { - WriteErrorServerRpc(e.ToString()); - throw; - } - } - - [ClientRpc] - public void KeepAliveClientRpc() - { - m_TimeSinceLastKeepAlive = Time.time; - } - - [Rpc(SendTo.Server)] - public void WriteTestResultsServerRpc(float result, ServerRpcParams receiveParams = default) - { - var senderId = receiveParams.Receive.SenderClientId; - MultiprocessLogger.Log($"Server received result [{result}] from sender [{senderId}]"); - if (!m_TestResultsLocal.ContainsKey(senderId)) - { - m_TestResultsLocal[senderId] = new List(); - } - - m_TestResultsLocal[senderId].Add(result); - } - - /// - /// Use this to communicate client-side errors for server-side logging using the MultiprocessLogger. - /// - /// - /// Use to log server-side without MultiprocessLogger formatting. - /// - [Rpc(SendTo.Server)] - public void WriteErrorServerRpc(string errorMessage, ServerRpcParams receiveParams = default) - { - MultiprocessLogger.LogError($"[Netcode-Server Sender={receiveParams.Receive.SenderClientId}] {errorMessage}"); - } - - [Rpc(SendTo.Server)] - public void WriteLogServerRpc(string logMessage, ServerRpcParams receiveParams = default) - { - MultiprocessLogger.Log($"[Netcode-Server Sender={receiveParams.Receive.SenderClientId}] {logMessage}"); - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs.meta b/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs.meta deleted file mode 100644 index f8c2a3c472..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/TestCoordinator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ef1240e0784f84eadb77fe822e2e03c7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs b/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs deleted file mode 100644 index 3152627cbd..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Collections; -using System.Linq; -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - [TestFixture(1)] - [TestFixture(2)] - public class TestCoordinatorTests : BaseMultiprocessTests - { - private int m_WorkerCount; - protected override int WorkerCount => m_WorkerCount; - - protected override bool IsPerformanceTest => false; - - public TestCoordinatorTests(int workerCount) - { - m_WorkerCount = workerCount; - } - - private static float s_ValueToValidateAgainst; - private static void ValidateSimpleCoordinatorTestValue(float resultReceived) - { - Assert.AreEqual(s_ValueToValidateAgainst, resultReceived); - } - - private static void ExecuteSimpleCoordinatorTest() - { - s_ValueToValidateAgainst = float.PositiveInfinity; - TestCoordinator.Instance.WriteTestResultsServerRpc(s_ValueToValidateAgainst); - } - - private static void ExecuteWithArgs(byte[] args) - { - s_ValueToValidateAgainst = args[0]; - TestCoordinator.Instance.WriteTestResultsServerRpc(s_ValueToValidateAgainst); - } - - [UnityTest] - public IEnumerator CheckTestCoordinator() - { - // Sanity check for TestCoordinator - // Call the method - TestCoordinator.Instance.InvokeFromMethodActionRpc(ExecuteSimpleCoordinatorTest); - - var nbResults = 0; - for (int i = 0; i < WorkerCount; i++) // wait and test for the two clients - { - yield return new WaitUntil(TestCoordinator.ResultIsSet()); - - var (clientId, result) = TestCoordinator.ConsumeCurrentResult().Take(1).Single(); - Assert.Greater(result, 0f); - nbResults++; - } - Assert.That(nbResults, Is.EqualTo(WorkerCount)); - } - - [UnityTest] - public IEnumerator CheckTestCoordinatorWithArgs() - { - TestCoordinator.Instance.InvokeFromMethodActionRpc(ExecuteWithArgs, 99); - var nbResults = 0; - - for (int i = 0; i < WorkerCount; i++) // wait and test for the two clients - { - yield return new WaitUntil(TestCoordinator.ResultIsSet()); - - var (clientId, result) = TestCoordinator.ConsumeCurrentResult().Take(1).Single(); - Assert.That(result, Is.EqualTo(99)); - nbResults++; - } - Assert.That(nbResults, Is.EqualTo(WorkerCount)); - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs.meta b/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs.meta deleted file mode 100644 index 104be914d0..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/TestCoordinatorTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f5e62651568514685a0b50d623fa8a96 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs b/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs deleted file mode 100644 index 232c8ca05f..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs +++ /dev/null @@ -1,88 +0,0 @@ -using UnityEngine; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class ThreeDText : MonoBehaviour - { - public bool IsTestCoordinatorActiveAndEnabled = false; - public string CommandLineArguments = ""; - private long m_UpdateCounter; - private bool m_HasFired; - private string m_TransportString; - - public void Awake() - { - if (MultiprocessOrchestration.IsPerformanceTest) - { - gameObject.SetActive(false); - } - } - - // Start is called before the first frame update - public void Start() - { - Debug.Log("ThreeDText - Start"); - m_HasFired = false; - m_UpdateCounter = 0; - m_TransportString = "null"; - var jsonTextFile = Resources.Load("Text/multiprocess_tests"); - Debug.Log(jsonTextFile); - - var t = GetComponent(); - t.text = "On Start"; - CommandLineArguments = System.Environment.CommandLine; - - string[] args = System.Environment.GetCommandLineArgs(); - foreach (var arg in args) - { - if (arg.Length > 15) - { - CommandLineArguments += " " + arg.Substring(0, 14); - } - else - { - CommandLineArguments += "\n" + arg; - } - } - } - - // Update is called once per frame - public void Update() - { - m_UpdateCounter++; - var testCoordinator = TestCoordinator.Instance; - if (testCoordinator == null) - { - return; - } - - var transport = NetworkManager.Singleton?.NetworkConfig.NetworkTransport; - var transportString = ""; - if (transport == null) - { - transportString = "null"; - } - else - { - transportString = transport.ToString(); - } - - var t = GetComponent(); - - if (IsTestCoordinatorActiveAndEnabled != testCoordinator.isActiveAndEnabled || - !m_HasFired || - m_UpdateCounter % 25 == 0 || - !m_TransportString.Equals(transportString)) - { - m_HasFired = true; - m_TransportString = transportString; - IsTestCoordinatorActiveAndEnabled = testCoordinator.isActiveAndEnabled; - t.text = $"On Update -\ntestCoordinator.isActiveAndEnabled:{testCoordinator.isActiveAndEnabled} {testCoordinator.ConfigurationType}\n" + - $"Transport: {transportString}\n" + - $"{CommandLineArguments}\n" + - $"IsHost: {NetworkManager.Singleton.IsHost} IsClient: {NetworkManager.Singleton.IsClient} {NetworkManager.Singleton.IsConnectedClient}\n" + - $"{m_UpdateCounter}\n"; - } - } - } -} diff --git a/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs.meta b/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs.meta deleted file mode 100644 index 9d9011054b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/ThreeDText.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 04cf3cc1396054b009a1ed283aa50021 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources.meta b/testproject/Legacy/MultiprocessRuntime/readme-ressources.meta deleted file mode 100644 index 00a2ce978f..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme-ressources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5d13190bb106b4188934d5576df7e777 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg b/testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg deleted file mode 100644 index 8663fcf7577639caf0bb5e94fa8c67306aee5fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11346 zcmeHMcT`kMlkZ{3m_Sf6NRl9F2$FL~au7iTW{8q=k}N8SB*~H_M+r(26bXWWM9HF{ zWXT{ParT1v-1olS{r20l=j{~kg z7Z2_o2}){7D=I>@7Rt%Y%+A@;-Ua;y?~)@ClWNHYs7J5joo+Il)#D^pRr>wGF)Dh|?SmR1U0PG(wOs@fsi@OR+dG-j@^f%; zaM3~9PNwEUnlf@Hx=>4$?!-uUcXtkV9u9ja3r=o9K|xL~1SbN)4oR>(d)m2}c(B_! z)Bi${F>^*aSvj~^+1t?`A(|lVU0p=!=s2MnI8UZHV*jvJjP`H(I|6@4;O_|h9f7|i z@OK3M|3%<;wqs@or8w?TE(6d@KtLTzmF%H>$$^%Kg9`{qDXL%|rC<;p^Nh#rxqhm! zkqA(ZIq#2`u=qpD7yT83K~Y-TNL^D+PVt)TafXLMY~tWxbEIr*=i;O(FGZ_&L!TCB z8cN`B0Ungloiaf=J4mXlUpvD5RUhO3@z@$XN&^A-zI(+kwJBV?62cl9^in zL+n3h@J*q#2pZaliW$nm$py+PO(CA%-NoUEe*p2sPLNR$pM1ny{NziIc;rvM`B+9< zQyP*PhWK+ROA`nKHV5%nkpHgV;@|Nn^FktkKt}f3HCi16FE`&&^M99I%se1J0FbtK z@N}}Wuymo7gra0dt7wPfxI&BILU03c6!V|6ZVVsC5_SRicc1+l09U)9@s{6x#*YE0 zT!uoh{kxAz697UP0A4vbm^hjI#Dku&Elg)~9>j4QMo||u@HcBE&HvclAKS3ux8uTbQ1&2Y42~G&a!G@`P_b(xr#9@SE9z4m-L=0IU(m*x)E7PRRjqFFB4M(4}D5ikh~dbhB2 ztwf@~Xz5vYqFJSx*^3*&Evkq-F79o|7E$LLqj8BS>VyxYQrgY*pSuiAv0g6gQYc)` z`5-}AQH`zYjbE=_{Ca0sXB0Tdn{g1w-ZY&INKMSvn=%_KP&Cj49^Bkw{E9I(D-Bc3n1~Mi@4-5$-QM+OLcXz{Amf> zaB{>do-^JZ@|tXHZ;w_TL2~ggGbA6dIjgU)Fumx%RAM0l?O8Yj&pQ{mLlOWnC=*k$knAY0n z)Kpo&>$(k9#yN;SH;~(CZ@H3OrrnKIGfSF&1|xI{)wjq=_vrO|+wAHasBlE*qd7R+ zsf}-EJaWDzsm5Da@J+#;3Lac!K!azeq*Gr9i6!^okjWCO!vh61Cx{Bek{x*Z0>cZa z0$?wxTd8Av=B4`Qw!bdEY<*3Q0?E_0L^uluk$Ur0ag`{J)h5h!W(P?mr7K?bWa?NC z4tANsx2{m7^p0}~AmTjViKq=(vYDu=yI@?PjCn=-J~+>eW4DTj{iMLkjj;H;hJHo; zh*Y`KjR!W7T+Xe6lfP&Iko3MS@sE7Mv6=eC7=Qe^$iNJsShB>Xe-= z9}7I#lxVfu7t$o?D8m_%>7qNFnXFo$*Rn?gGx3#RG{C=#2IXnnjc5=o9NNUt&pG|@ zU7RO5Pee=&eR#6@6UL>fo}%+A^ewMQ5@JceQ?VMN!D8;gYW){EG}zKQ+%a0s_=0>@ z1KU|<-IU1^Y+{`_mCQ`jmxXVzoH2ROD+_I$(X27Lm-GT9M2LiZbuPWExzc6kq<8PK zV;lWbvB?VQ>8kCEhdcTrm4{!^V4O|1@oh_g#YIx@M1^fPvCkFyf;kUJLPjKMBk{=S zqjubKJZ%r&qQPt32=@Bw`t9~!htd^<8c*k#`>fmIMruuWF}<)bw9L5ME=Mb7t$*Bm zhz56xsSW%b{Z?W#zL*dIgf*h#*KG1}<6}m9)0WkGIULJ(3k72L-%{vQQ3iw=Q&+#` zXM6HM;@rDAxE+OFM1o_g@Z_so{{V;#>=t6p5N0j3hwi8BHC9%%l>K~!*;GWrwU;&D ztDenkThP68;@j`p^0uqW+pCCF=oQjjJBXU*yh0!4rev-s4nMWsQxq8Uo*epIvh!C* z%i?8k|AY5s$>s0zdfCoJ1h${Wp+blj$h@oxdm4V-h*OxW*|z(pm-(}Q1kxz6`!q5Y zJNEjj9nu{*!8YIO)eqRal2PSGRq|XQTxOKq!t9F?#BWch*^(bjj*9=vJOm&1<54l3 z3z)Bom$mUpvfr7hkM7;Fs-I0dRKDIO*1XYL6Y&oN@(g=8BHjt#bz4WW(IC}&hn@2m zL*3=qPPw*>(l8J=k3aM*nR?-qWONL=IJ^I}n|g+iNiF|8ZT&t3_d<8* z7YfaZuD2i>Fgv%_Je0Nl1@nKRR5}~sd?9pnkGFoK(~mK8u@4Qp`S#-?EX1eJcx-c9 z7MDC%Mgx(db$zi;&ixIeHp?yNL-l`6N$o#S${Xd%HOOk6QUST9N+pL(zMsDr)14V%F!1xN058v~}IL@=5aJ z40GVLX0)lKl+@Uwd2n2P!-V}W=NI9^mC2|fUJ8TAhnGSc%K%j_W@^IjkY+rWes;`; zsgUz9uKIa&ms;yR|qRz@mNkEEZvUQrV+NznXlsaGjdtw-I~ z?(Vn+w|L?~XRiCSA+dgN7Gd`Do4mP1XN6C%+k;aUsbdFLaYKWZ>%5vb$%3Ry71}>) z&k9W3dkc)&vp=+(C?vn!RL`aV#;k0R4=4TVhPPdsHMuZv$ko4;`c+~>zO{2>&)%Lrx0u=eonMKrzAa%`CufG;RJ+lpqj5CpR}?N51Y8f0-I ziko&EA8+vU1bioP*Q__F=OEQC;yRsQ8%N)tHb3gmJ)XDk_x-%CP5l5(v5s%%8XEMd z=$E5`w%=!Hna(%eG3Prxk8B^XOHx_)v?jlJnQTsCX*2ica2@Ox(}u>7hZ#<~fFMpT zAAhVPN!?>I2EvsG1!aa!4B^9kS=)n7QN-oTD1w&0yO%s^OFEV!l$M;LquQe_8iw%LKHqMep%uI81U_QX%#1)rlNjAj_~icosa zc#zc>U4?z_aUueKXJYb0J=MH(N9m465aUZ(kFD~y3XRbChNVT;&aTu*EWPOs!^ZNA zLeqOwItC*|)@|8g(>I2L7FDd9{H&?QoX)QwBqG^^)+@){8n(XX*W5s88jy~g)ok2} zVBhavo|s+Fk87MykDfHapo3$a@!4}*F)$iE=h<*)coqOA>&7uQ=6uC{ zK0i`C*xRGteDjS7u@`wFHLj^_li1a6y-<-*^}1>pYFL9 zo$oZO#+1>EO5mnp>9DZEc|5PR#5jECVNEw9hHlKjhDpvguWB(qGnUw?n&{KU3vju^bW5y?hxiI6>ZPokyQ)Fqdn@J=y4A zT+Q9$73Q^FbRhPH?zKTk7f$En@M*Q&SEk8D9WU%cKgeA230=7Sa+W5KB;I>p{L!s~ ztMv^(&_F3!esx6KmsizB)0#h;_kHjaOq#85=Ty+Dl$$F_JY&M#HJo_AU$Zq|*>*;j zoQZ%7DcLr)Ig?&d=dDPtFrYf2eGfB?rll^kE~%Ys^=2jU(zSJj{D-~@@h_D2JB#8g zX@{@O_%o)2vK-T++#)k6eSL1P>@!@fAB$KQpOm0M_x-V3Q_*~;-)n*|MEYf`mJ?Gb z6l7@yy%RXqw8jgw@7~Jn-YQ5ntsl4Fo9mrXK7h9V*N=d~#zEf3K|yXJ=k~|LU0%;< zH1Mfk$&|Rz*&r&f<|Tp#xAT7qQ~y-%!KxP@jSwF#_$4fVqWrHD`NL@@@bTBLdORh!r*R3MIE zv2U4HO>tqW){SjauULY3LgN`EheL906OX`1~t9gMETy9zmb}*E^&8;C3)^2_lsz>hbHjxCx2j(jO@_0NZ7`}tgR)&T*eqC1v9}o{8tb$h zI#W&uiX=gxnuL!iYv*#TtzA6Z1$VZ_^PUYxTtw0?G$}NC`D3DC!emlE^4p)C9eli0 ze;kl%7m6b6P=zcUH+*i|^3!jpYN)@?JF5W@%TFDBt73z}$v+}VmN zCXlBrXA6AR%u|Zw!ck3AIxz%sc=9?kPom*v<<5D95aa1H;_|6f{wd0}C0)8+4zouF z??VhTH)L#D-QHUWwEpsg)#uNF=#SGy81V*Bos+8_NuGd3ik>aL`9!)VnCfnnpw8I} z(l}->uE|_z5&ewgU)2YYwimt;BgqBH@C!5eZxB$PIuvnCs&p}8>Y7f;j5D?D!5xk+ zGQcE!bLirO%yrn}S~UNQ1p|CDQO;(Bu_Ki9HV*e0Nw-A&SlcrfNQCc~-AAIq(fhL8 zv)`jBR?j$zBXqv{YarFL|EvMMVSTHxW+E;uX=N?e57Ez2j|6gE9+*Ne0}WQLZsZJP zgc`QdG>^aUoz9uy9xdl(?Y%CNcfe|bVgnuLBRw(U(1!Qnj}7nW1WXjF&kSSE{^v}u zUl9#-SnW{}OT4(-@ZJ6Z^TQlmTJ=?EXZA)0BC9On-RY`)9KnX~#jxV$T3UlU21WK{ zQd4DTBrm&(O0<%6_exO2lQ%mx4z4y#KMkRy;dd*j_T(mGH!~e>sF`t5O2FbP?hG}G72OjUvNOa|smk+gwP@PCxDaO7D{_uK_9E4csf! z?{IOasxAv|6>MD}Hx1VwsqGvYCmn8hB|J$Y6$(DYYi#H)xuKRcLxc{-E(pwb>!)_> z1mZpopBeAsU%tgt_Y5J~FfkjI^cFHip-$>uFoQg;!g2tkY0E}3zfjl#t3X8_AuZyg zecZUCJcncS+ZxhY%-tbzS>SSEbW8*HmbV|mQX0!=&jYDOkCS69_fh>r-w20=$Ed0Q z+ur6BTsV#UA=dm&S7Mmm=)&S!H}$8_F5W!JP=dPBS901gPA&@7z`p=yb3WByRkMqI zBn#}7i}N=aEB$48-xt#_GZ5vv!z9-)-z;wz*M8{>0g?(z%lh7=0)Ov9e-L$Ey#i|7<^Fd3fo&cwd5{boJ#Q zPj-?-n#ay~t78t#Ul3oL#5r&_nqqsuKYVc8#D~?tkj-BJoQD>4|0FrCR5XDF^?;Fa zq3yO>U*QKE#Z$w~!z|x5Njn1{1*XXY9^*{o++K;Fz3Om&e13c%V({M^%o=7@QUbS` ziOy#F%`t^K9jqO%eoMH$tlPsSXQr!+wImGipc)@*B{rSGrKRj@0^&z(nL>Gn-wJC5 zCQMyAo#W!G_&NFvxHLOnOkrcXw&2oNC^O~zU72@UPg(P6O^LQxu7@<~LX&uF@NwRk} zp@w;Q$DdKplzLdi{cHXl=X9$lZKRBh^sLz!&U;~F=$^CtaHt>3eO`D5xpi|=T(=un zscsR+5A55Wc~@3xT-!pyN=i7C374Rv&a^l^a*f`?dYRZUso*)!6(iZRu(Q4m9U%2rfv3`G;nuv>ia&V)Dd)KlEi%xSIa zGdL&-DypTF=x^+01a-Tf$pJeNe-~j=<;1{A-?M88#G=4%$^v7%k&}V)bIi zI9)t1H~2k&E*+P@D*K;`eM1y9FO#KXLnx5=jp#lF2}H9x^^%iHqPs+LkHClozBeOWqgvS@Ta>gG~ z`ufq%*|ki9!=WkhmI`uEJ(kc-PrsUFiE%L1BIil<2$-ArP^{BT%3bWOzjVl#(}N{^ zgG(OCg2}3i5vW!H%)j`J?%)5>3tjA5Lt^@J3^-Ww(<&Z4muSz#z|w-h+rRUBL~0}l z$@C{=Lf&0GC^_!gI)Y97^@eiEByYBE7Ah%4wmZnvhTion zMgxB+@#r-$U5}c2Y!XRSXX>CZwKe74gXMfBSSs29d(7KHV1Fk^C+B&B)MMtcqU>;C z<4C_as|)RGF^I+~!bqtkfF7Kj`+Z0M>#qKfn&nleP+}xrCvYK;ZRQ^P)EN9JD>9H2 z6yEEmOiuk&U07)TcwA+MX*zmFmVpI{?VarZ%46kboP06G{bFF9rB1|=fi-&a6sW*+WNu03;oM%q|vilvn*oTjy)KIPSeqbO9j z(JkT_GRsaaNm0!f?I60=eLI@XvhRyn+qqcZ9_iFt(1PuKrf&PK)875#30*pEZKp1- zk2KsMD9>?tlYHmnJ?>W0*>S!u&d)}9hc2B>gRwWyMxBEx6^RbUQd30anI?s0RHj3I<#7vCj> z^7YMf)P>#_J+FKT3CO?dee0AB)Zyy>+|MW6%hbv&$uvxbg{6h3;g+gceXJtYONNCl z%jTf2OWlU)D9SA=&y|}iPiVI9&&nS^C8*#A4O8*M@9}HQ36i-k)9`-@b8Hb$aqc_& zsj8=Mrwk1|d|g_j5qGh1=m-5-j{k2_R+PXZ)_}^3n4f>X{MQ}O=qZ{7zX|cdilt}9 z!Pqm85As&=#TQzqtaz<)D=4-C&CM|AMs8XN!mGt9`q7|~9fby>jQh}OC!|2#CY~W& zgCpviOwhW_oNsaM_nm_8?n#<01*_c99yoruTRi?lcF}J(t3C-0)_DCIIe%;CE)Li9 zqKBrqnBPEI?|F`v9V_FUmFT_c}yuPMlZ!;K=q%;AGQZt^$+Z2&Px#d7yAD>@}EW&##rc5 zRP0~+9)}&)<8eJjUv2lR-*?6mskfdh!QxZwmk%7pcZr6c4z3P2dWVEw)9lriM34L% DL-f!q diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg.meta b/testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg.meta deleted file mode 100644 index e675f9e356..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Building-Player.jpg.meta +++ /dev/null @@ -1,96 +0,0 @@ -fileFormatVersion: 2 -guid: 4d67ff4fda6ec4805b2fd16af441aa47 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg b/testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg deleted file mode 100644 index 72f13b3f05dd9bb2d2712c9224abc36245f8396a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23858 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 NZdm*?q5+%_|34=f;>-X5 diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg.meta b/testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg.meta deleted file mode 100644 index 6d73b54a8f..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme-ressources/Multiprocess.jpg.meta +++ /dev/null @@ -1,96 +0,0 @@ -fileFormatVersion: 2 -guid: d2e6ce5793e6a4e74843dca06fd36778 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg b/testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg deleted file mode 100644 index f346dd85b7317b9d9676d0deeeb5aa8d8596cac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199286 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�(tRS{%wq?oGZ0?jj$V;-0sD=99FkqBOII$SZWIk)a`w$cG6#@JB)?~G9= z_Y@6!+4ARdYZNa5$9@$LustDgH;S8!@f%})+9^)!0Up<*#tMuWPS1W54u8K&=3P{_Ik$*E4!{r%uXWYv1TkNifgQotibn~H5)>6J}SS8YtBG! zYEE%TawfB*OQ?&VUGH;)>CFYg>`#VLzRnSeLsHCsA==JXOLDZHtfAg$i;&16-m77?Ch~ ztWRJ#PF)Jc>YML+17PU2Q&@*+9*YYCdu~(s90py0gkHERu-O9HzZ_^Gk~ai3LsvAG zHA44w5b%8c*udy5jpj0U`qsIFtQf1fFpUm{Mf|gm1zw7{df~kw0$|<3y8z#*)Ba(s z9Q*EynoSFvi3dBfd+Rf~Ob4Dz?I35l732-eUrahbtSli8DQiDemYPEZ#EGj2pgJDY z&eqmv06X1S8mpF!2z-PHd|Utpx;G68RDc36JOPynwk=KYk%Y8@578u$ z4t9`73Q_OUEcDof6xSLmM>kYDe1;hM+dar*hQYe#!$zc58qe!c*q%95ALAhzsafX5 z`I2=`NPQ}MAA^=TrpxXgHG#0JgaU1N+sg+zT2%L++szw}dRxkxm*h(#J8`3UApF;j znn`(yfcPh>iQ1K>d#{T8u*|K9YbCc`WS5hI+U1D9U6K@PJov^-*B8`tl7=4tni^BR zadlIJTk-G1xP5(qE^dv41iuUfG{(Aj4z@gDt>8LwNBlug*~$e@bLWEq3T>8F*NQ zpzRI7N5iz&iOOwhIz|(ve#MsmEH06^ylAl7tt4#du7*z7&kTvj)^4@V_sM4qN@C?} z=V0^QN-`a1t?Op5R&`O9Tov51>byTe4qxX=2GT7_p&&?5PP6sRe7{2rQv{`89shNG z7p)@)59)x(1D+rw^BRLke;SuY3PwsA*J&bx_GmuXa!GD$M;KDj>?|No1Px7YAzryE zYYBLK!L|VC4)fmcqCqo4luC1L4pO3pxp6myk3H!*ZI-zO|3%5t8f1|~-hy)2WY{eR zhGs%}OCN-O*+a3$#T|~d2^woC%toNFFMz^y&vhawOhBQq2qsR1|5(&6@}2eX?&7w- z*%_o6>Ww~4O>Q@<_ij8p*&avcGMi4)ATTaB8oXs_DF2OVZzPq=d@9jbNn>dPYHx6O zLEBJi4DhWQk5E3?L*_9nd+C5i8)ivf2r=n#ekx$oF5q(^HGt=V*r8n92nf1=$U}&D>4KlA z*$ptq;4K3~CHfh*S#N$OtPW_0r#-CjG8je<;Bit0z|;jT4m@HlsP|2Tx3>@klVcaO z(tUxHd*pJf!CTe{*tS73x!tTpgf*QSakq?mo(S`{UqWhFRIdpo>?J|GpVLZU!cGXq zA!`BKZW=2L)S^H)6IO0BSSWzXfrW-MTnD5B@?h8j%|d}p-gZzmw=z1?!Ha|fjfdpB z+aayqDwHRZpUQ!-w^SssdbjDKTp1l_uZSRu5B*FAIFcDte;Vz*<^A1}odSZN?cE)N z`%3%4p-y4i&OxCwO#o^yDgF*VsJ-OqQ2M=qk>4SR`FO}`tOAF|_F(;sachh2Z2htt zjQz{#*cUr{=$GkmJZk>-&RA?b#_DK4qX`-NDFVU)qI?KAouCRj1>fe~y&f&3j=Y0X zM~Xj%RglJ44vpv+&=;Q z!tkgG*Myw=hYkOTVZU!{3Do5lL+^A3dI~lXPQfZ#nD6-t6$JyM4+e&fcy#g?|INL> zTm0iud!z|D`B!BBwxZ&q?VkLjB+QOV!v(UD4xZo}2?wbErCeW=(e!_O|I9=UUnb<3 zM`6_H!>ISQPf^wRBm7PMaDhc3{Aa&(BJv$$A)1L(Q9SifF$ awj96N@_p@V^jsVr;^-_c*5AO>y8i;?OwxP+ diff --git a/testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg.meta b/testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg.meta deleted file mode 100644 index 84c6f4f98b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme-ressources/OrchestrationOverview.jpg.meta +++ /dev/null @@ -1,96 +0,0 @@ -fileFormatVersion: 2 -guid: 7b6f909ad23994f9c9cb51710d1e1e07 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 1 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/readme.md b/testproject/Legacy/MultiprocessRuntime/readme.md deleted file mode 100644 index 6efdcba540..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme.md +++ /dev/null @@ -1,279 +0,0 @@ -# Multiprocess testing - -## Why -Multiprocess testing can be used for different use cases like -- integration tests (Netcode + actual transport or multi-scene testing for example) -- performance testing. -- Anything requiring a more realistic environment for testing that involves having a full client and server, communicating on a real network interface using real transports in separate Unity processes. - -The tests you write and test locally will be deployed dynamically to bokken instances. The tests shouldn't have to worry about what hardware it runs on, this should be abstracted away by "workers" and "coordinator". - -## How to write a multiprocess test -There's a few steps to write a multiprocess test - -1. Your test class needs to inherit from `BaseMultiprocessTests` -2. Each test method needs the `MultiprocessContextBasedTest` attribute -3. Each test method needs to run `InitializeContextSteps();` -4. Each context based step can use -```cs -yield return new ExecuteStepInContext(StepExecutionContext.Clients, stepToExecute: nbObjectsBytes => { - // Something here -}); -``` -A test method would look like -```cs - [UnityTest, MultiprocessContextBasedTest] - public IEnumerator MyTest() - { - InitializeContextSteps(); // the only call that should be made outside of context based tests - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Debug.Log("server stuff"); - }); - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - Debug.Log("client stuff"); - Assert.That(1, Is.EqualTo(1)); - throw new Exception("asdf"); // this client side exception will be communicated to the coordinator, making the test fail - }); - } -``` -Your test code shouldn't execute outside of these steps (as that test method can be executed multiple times, once for step registration and once for the actual test run for example) - -Another way to write a multiprocess test without context based steps is to use TestCoordinator directly. -```cs - private static void ExecuteSimpleCoordinatorTest() - { - TestCoordinator.Instance.WriteTestResultsServerRpc(float.PositiveInfinity); - } - - [UnityTest] - public IEnumerator CheckTestCoordinator() - { - // Call the client side method - TestCoordinator.Instance.InvokeFromMethodActionRpc(ExecuteSimpleCoordinatorTest); - - var resultCount = 0; - for (int i = 0; i < WorkerCount; i++) // wait and test for the two clients - { - yield return new WaitUntil(TestCoordinator.ResultIsSet()); - - var (clientId, result) = TestCoordinator.ConsumeCurrentResult().Take(1).Single(); - Assert.Greater(result, 0f); - resultCount++; - } - - Assert.That(resultCount, Is.EqualTo(WorkerCount)); - } -``` - -Here's a complete set of examples using the API - -```cs -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using Unity.PerformanceTesting; -using UnityEngine; -using UnityEngine.Profiling; -using UnityEngine.TestTools; -using static ExecuteStepInContext; - -namespace Unity.Netcode.MultiprocessRuntimeTests -{ - public class DemoProcessTest : BaseMultiprocessTests - { - protected override int WorkerCount { get; } = 2; // spawns 2 clients connecting to the test runner - protected override bool m_IsPerformanceTest { get; } = false; // specifies whether this should execute from editor or not - - [UnityTest, MultiprocessContextBasedTest] // attribute necessary for context based step execution - public IEnumerator MyTest() - { - InitializeContextSteps(); // necessary to initialize context based steps - - // These steps execute sequentially. - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - Debug.Log("server stuff"); - }); - // for example, the test runner will yield on the same step until clients all report they are done with this step. Once all clients report they are done, the test can continue to the same step. - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - Debug.Log("client stuff"); - Assert.That(1, Is.EqualTo(1)); - throw new Exception("asdf"); // this client side exception will be communicated to the coordinator, making the test fail - }); - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - // To write results to the test runner, call this method: - TestCoordinator.Instance.WriteTestResultsServerRpc(123); - TestCoordinator.Instance.WriteTestResultsServerRpc(123); - TestCoordinator.Instance.WriteTestResultsServerRpc(123); // could be replaced by json string instead for ease of use? - }); - yield return new ExecuteStepInContext(StepExecutionContext.Server, bytes => - { - // consumes first result sent above from any client - TestCoordinator.ConsumeCurrentResult(); - // consumes all results from all clients - foreach (var (clientID, result) in TestCoordinator.ConsumeCurrentResult()) - { - Assert.That(result, Is.EqualTo(123)); - } - // consumes results for individual clients - foreach (var clientID in TestCoordinator.AllClientIdsExceptMine) - { - TestCoordinator.ConsumeCurrentResult(clientID); - } - }); - - int someValue = 456; // one caveat to executeStepInContext is contrary to instinct, this is not shared between server and client execution. - // to send that value to clients, "paramToPass" needs to be used - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - var valueComingFromServer = BitConverter.ToInt32(bytes, 0); - }, paramToPass: BitConverter.GetBytes(456)); // could be replaced by JSON string instead for ease of use? - // useful for taking in [Values] method parameters as these are only known by the server - - // when you have client steps that take more than one frame, you can subscribe to the OnUpdate callback on CallbackComponent - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - void Update(float _) - { - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate -= Update; - TestCoordinator.Instance.ClientFinishedServerRpc(); // since finishOnInvoke is false, we need to do this manually - } - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += Update; - }, waitMultipleUpdates: true); // this keeps waiting "are you done? are you done? are you done?" and relies on the clients calling the "ClientFinishedServerRpc" - - yield return new ExecuteStepInContext(StepExecutionContext.Clients, bytes => - { - int cpt = 0; - void Update(float _) - { - TestCoordinator.Instance.WriteTestResultsServerRpc(Time.time); - } - NetworkManager.Singleton.gameObject.GetComponent().OnUpdate += Update; - }, additionalIsFinishedWaiter: () => // this keeps waiting "are you done? are you done? are you done?" until this lambda returns true - { - foreach (var (clientId, latest) in TestCoordinator.ConsumeCurrentResult()) - { - return latest >= 10; - } - return false; - }); - } - - [UnityTest, Performance] // already existing performance framework https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.8/manual/index.html - public IEnumerator PerfTest() - { - var totalAllocSampleGroup = new SampleGroup("GC Alloc", SampleUnit.Kilobyte); - var allocStat = Profiler.GetTotalAllocatedMemoryLong(); - Measure.Custom(totalAllocSampleGroup, allocStat / 1024); // this will record in Unity's shared Performance DB. - // Dashboards will be able to display these stats overtime - yield return null; - } - } -} - - -``` - - -## How to run a test -**Local**: Test players need to be built first to test locally. - -**Automated**: Integration with CI should do this automatically. - -![](readme-ressources/Building-Player.jpg) - -Then run the tests from Unity's test runner. - -Note that performance tests should be run from external processes (not from editor). This way the server code will run in a build, just as much as client code, for more realistic test results. - -![](readme-ressources/Multiprocess.jpg) - -## How it's done -### Multiple processes orchestration - -Test code and host code execute in the same process: When writing play mode tests, Unity will start a unity environment for that test, including game loop, scene, object hierarchy, all that fun stuff. This means the test itself has access to everything other unity scripts would have access to. At test startup, the test will ask unity to switch scene to MultiprocessTestScene containing a GameObject already placed in that scene called TestCoordinator . The test will callStartHost that will listen for connections, still all in the same process. -Once that's done, that same test will then spawn new client processes. These clients will also start with that MultiprocessTestScene loaded at startup, also containing a TestCoordinator . These client side TestCoordinators will detect they are clients (using command line arg) and instead of calling StartHost will call StartClient . This is where new code to specify the IP to connect to would stand (the lines I sent you). -A good way I could have clarified that code is to separate TestCoordinator into TestCoordinatorClient and TestCoordinatorServer thinking of it. Right now TestCoordinator code does both. -Once the connection is established (tests yield wait for connection in Setup code), then the tests can start sending RPCs to each other. -The test (that's server side) will call multiple TriggerActionIdClientRpc . This will trigger these actions on all clients. The clients execute their test code, then answer back with ClientFinishedServerRpc. -Once all the tests are done exchanging commands, a final RPC CloseRemoteClientRpc is called to tell the clients they are done. -If that RPC fails to send for some reason, clients also have a keep alive that tells them to self destroy when it expires. -If you look at the “how it's done” section in the multiprocess readme.md testproject/Assets/Tests/Runtime/MultiprocessRuntime/readme.md there's a few drawings to explain that flow. - -So: -Editor -- Run tests -- Run host code -- Launches builds -Separate build -- Runs client RPCs that execute test code, not the tests themselves - - -Now just to bake your noodles a bit more, Unity will take an additional step before launching these steps. The above is true if you launch these tests from the editor. If you launch these tests in a separate player, Unity in the background will create a separate process for that player. That player will then connect using a plain tcp connection to the editor to report back on its test results. This is important to know if you want to have the test/host part launch on different platforms like mobile. - -So the above would become -Editor -- Launches test player on platform -Test player -- Run tests -- Run host code -- Launches builds -Separate build -- Runs client RPCs … - -With the bokken integration, we'll need to be careful about ressource contention at Unity, these tests could be heavy on ressources. -Tests when launched locally will simply create new OS processes for each worker players. - - - -![](readme-ressources/OrchestrationOverview.jpg) -*Note that this diagram is still WIP for the CI part* -### Bokken orchestration -Bokken Orchestration can be performed with the support of the following tool: -[Multiplayer Multiprocess Test Tools](https://github.cds.internal.unity3d.com/unity/multiplayer-multiprocess-test-tools) -[Documentation](https://backstage.corp.unity3d.com/catalog/default/component/multiplayer-multiprocess-test-tools/docs/) - -### CI -todo -#### Performance report dashboards -todo -### Client-server test coordination -A Test Coordinator is in charge of managing communication between the nodes, executing remote test code. The test coordinator is also in charge of process cleanup, if for example the server crashes, so we don't have zombie clients laying around. -The test coordinator in client mode will automatically try to connect to a server on Start(). -### Context based step execution -Test methods are executed twice. Once in "registration" mode, to have all the steps register themselves using a unique ID. This ID is deterministic between client and server processes, so that when a server calls a step during actual test execution, the clients have the same ID associated with the same lambda. -During test execution, the main node's step will call an RPC on clients to trigger their pre-registered lambda. The main node's step will then yield until it receives a "client done" RPC from all clients. The main node's test will then be able to continue execution to the next step. - -## The MultiprocessTestPlayer -The MultiprocessTestPlayer, which is built by the sub-menu items under "Netcode" -> "Multiprocess Test", supports many workflows and configurations. - -### Command Line -Currently the MultiprocessTestPlayer can be configured via the command line on all platforms that support parsing of command line arguments in the C# layer. -For example, this means that command line configuration is not available on Android. - -#### Setting the transport address -Default Values on Client: 127.0.0.1, 3076 - -In order to set the transport address for either the server/host or the client, the options of "-ip" and "-p" can be used. For example: - - -ip 127.0.0.1 -p 3076 - -These options can be passed when starting the client, for example, in order to let it know where the host is to connect to. - -#### Setting the transport -Default Values: UNET - -The default transport is UNET but this can be switched to UTP by using - - -transport utp - - -# Future considerations -- Integrate with local MultiInstance tests? -- Have ExecuteStepInContext a game facing feature for sequencing client-server actions? diff --git a/testproject/Legacy/MultiprocessRuntime/readme.md.meta b/testproject/Legacy/MultiprocessRuntime/readme.md.meta deleted file mode 100644 index 5ef9bc8c31..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/readme.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 39b2fcb99dff6414e8f41b93f4c92b88 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef b/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef deleted file mode 100644 index bac74c850d..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "TestProject.MultiprocessTests", - "rootNamespace": "", - "references": [ - "Unity.Netcode.Runtime", - "TestProject", - "Unity.Netcode.GameObjects.Editor", - "Unity.Netcode.Components", - "ScriptsForAutomatedTesting", - "Unity.PerformanceTesting", - "UnityEngine.TestRunner", - "UnityEditor.TestRunner" - ], - "includePlatforms": [ - "Editor", - "macOSStandalone", - "LinuxStandalone64", - "WindowsStandalone32", - "WindowsStandalone64" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": false, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": true, - "defineConstraints": [ - "UNITY_INCLUDE_TESTS" - ], - "noEngineReferences": false, - "versionDefines": [ - ] -} diff --git a/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef.meta b/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef.meta deleted file mode 100644 index a06b37d08b..0000000000 --- a/testproject/Legacy/MultiprocessRuntime/testproject.multiprocesstests.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 66273ab9e01074f7da305fe84e13da47 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 570dcb7c5ae48b6f3960707c8ce889de1122c95c Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 12:07:32 -0500 Subject: [PATCH 81/99] fix Wrapping some unified stuff in defines. --- .../Runtime/Core/NetworkManager.cs | 3 +-- .../Runtime/TestHelpers/NetcodeIntegrationTest.cs | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 746c0e36db..d599c644c3 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1341,9 +1341,8 @@ private bool CanStart(StartType type) return true; } - public NetcodeWorld NetcodeWorld { get; internal set; } - #if UNIFIED_NETCODE + public NetcodeWorld NetcodeWorld { get; internal set; } private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) { if (this == Singleton) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index cf90f07aec..257885780e 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -6,7 +6,9 @@ using System.Runtime.CompilerServices; using System.Text; using NUnit.Framework; +#if UNIFIED_NETCODE using Unity.NetCode; +#endif using Unity.Netcode.RuntimeTests; using Unity.Netcode.Transports.UTP; using UnityEngine; @@ -1758,6 +1760,7 @@ protected void DestroySceneNetworkObjects() if (CanDestroyNetworkObject(networkObject)) { +#if UNIFIED_NETCODE // Handle removing the prefab reference and destroying it // and then destroying the ghostAdapter prior to destroying // a hybrid prefab. @@ -1770,7 +1773,7 @@ protected void DestroySceneNetworkObjects() Object.Destroy(prefabReference); Object.Destroy(ghostAdapter); } - +#endif // Destroy the GameObject that holds the NetworkObject component Object.DestroyImmediate(networkObject.gameObject); } @@ -2387,7 +2390,14 @@ protected void SpawnObjectInstance(NetworkObject networkObjectToSpawn, NetworkMa private GameObject SpawnObject(NetworkObject prefabNetworkObject, NetworkManager owner, bool destroyWithScene = false, bool isPlayerObject = false) { Assert.IsTrue(prefabNetworkObject.GlobalObjectIdHash > 0, $"{nameof(GameObject)} {prefabNetworkObject.name} has a {nameof(NetworkObject.GlobalObjectIdHash)} value of 0! Make sure to make it a valid prefab before trying to spawn!"); - NetCode.Netcode.Instance.m_ActiveWorld = owner.NetcodeWorld; +#if UNIFIED_NETCODE + // TODO-FixMe: NetCode.Netcode.Instance is a singleton and might cause issues + // assigning this. + if (prefabNetworkObject.HasGhost) + { + NetCode.Netcode.Instance.m_ActiveWorld = owner.NetcodeWorld; + } +#endif var newInstance = Object.Instantiate(prefabNetworkObject.gameObject); var networkObjectToSpawn = newInstance.GetComponent(); SpawnObjectInstance(networkObjectToSpawn, owner, destroyWithScene, isPlayerObject); From 7f1b592f5d1185c7112110d758de1ab6605d3874 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 12:23:12 -0500 Subject: [PATCH 82/99] update Adding develop-3.x.x to conventional PR branches. --- .github/workflows/conventional-pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/conventional-pr.yml b/.github/workflows/conventional-pr.yml index 30274254e2..e5176d4912 100644 --- a/.github/workflows/conventional-pr.yml +++ b/.github/workflows/conventional-pr.yml @@ -6,6 +6,7 @@ on: branches: - develop - develop-2.0.0 + - develop-3.x.x # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" From b599a1f3aaa644cbcced11c1058c3ba68fd3c8bf Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 12:26:22 -0500 Subject: [PATCH 83/99] update Missed one spot for triggers. --- .yamato/_triggers.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.yamato/_triggers.yml b/.yamato/_triggers.yml index d806f378b0..2c1e538566 100644 --- a/.yamato/_triggers.yml +++ b/.yamato/_triggers.yml @@ -95,6 +95,7 @@ pr_code_changes_checks: (pull_request.comment eq "ngo" OR (pull_request.target eq "develop" OR pull_request.target eq "develop-2.0.0" OR + pull_request.target eq "develop-3.x.x" OR pull_request.target match "release/*")) AND NOT pull_request.draft AND pull_request.changes.any match [ From a5b5e89ad52a4aba53a0c727b9f7a9aee8faf93a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 13:04:04 -0500 Subject: [PATCH 84/99] style - PVP-124-2 Removing trailing whitespaces. --- .../Runtime/Components/Helpers/UnifiedUpdateConnections.cs | 4 ++-- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 2 +- .../Runtime/Messaging/NetworkMessageManager.cs | 2 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 4 ++-- .../Runtime/Transports/Unified/UnifiedNetcodeTransport.cs | 6 +++--- .../Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs index b7730b49cd..b9e8bf55a6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/Helpers/UnifiedUpdateConnections.cs @@ -32,7 +32,7 @@ internal partial class UnifiedUpdateConnections : SystemBase private List m_TempConnections = new List(); private Dictionary m_NewConnections = new Dictionary(); - + protected override void OnUpdate() { var isServer = World.IsServer(); @@ -105,7 +105,7 @@ protected override void OnUpdate() } } } - + commandBuffer.Playback(EntityManager); } diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 8e7ac5bd27..f00c7cb0f3 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -126,7 +126,7 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int //{ // UnityEngine.Debug.Log($"Received {nameof(CreateObjectMessage)} for NetworkObjectId-{ObjectInfo.NetworkObjectId}."); //} - + // For now, we will defer the create object message until the associated Ghost is spawned if (ObjectInfo.HasGhost && !networkManager.SpawnManager.GhostsPendingSpawn.ContainsKey(ObjectInfo.NetworkObjectId)) { diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs index 2c09e56857..a2a8a11488 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs @@ -228,7 +228,7 @@ internal void HandleIncomingData(ulong clientId, ArraySegment data, float { unsafe { - + //Debug.Log($"Receiving {data.Count} bytes: {ByteArrayToString(data.Array, data.Offset, data.Count)}"); fixed (byte* dataPtr = data.Array) { diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs index e8f0ccf8cb..6bae4d5c2f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs @@ -63,10 +63,10 @@ internal void RegisterGhostPendingSpawn(NetworkObject networkObject, ulong netwo // active scene was when the client was processing the synchronization data. If the ghosts pending // synchrpnization are in the currently active scene when the new scene is loaded in SingleMode, then // they would be destroyed. - // + // // Current Fix: // If the client is not yet synchronized, then any ghost pending spawn get migrated into the DDOL. - // + // // Further review: // We need to make sure that we are migrating NetworkObjects into their assigned scene (if scene // management is enabled). Currently, we assume all instances were in the DDOL and just migrate diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs index 85393e4759..c7c813b872 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Unified/UnifiedNetcodeTransport.cs @@ -253,7 +253,7 @@ public override unsafe void Send(ulong clientId, ArraySegment payload, Net var amount = connectionInfo.SendQueue.FillWriterWithBytes(ref writer, k_MaxPacketSize); rpc.Buffer.Length = amount; rpc.Order = ++connectionInfo.LastSent; - + var req = m_NetworkManager.NetcodeWorld.EntityManager.CreateEntity(ComponentType.ReadWrite(), ComponentType.ReadWrite()); m_NetworkManager.NetcodeWorld.EntityManager.SetComponentData(req, new SendRpcCommandRequest{TargetConnection = connectionInfo.Connection.ConnectionEntity}); m_NetworkManager.NetcodeWorld.EntityManager.SetComponentData(req, rpc); @@ -371,7 +371,7 @@ private void OnServerClientDisconnected(Connection connection, NetCodeConnection { InvokeOnTransportEvent(NetworkEvent.Disconnect, (ulong)connection.NetworkId.Value, default, m_RealTimeProvider.RealTimeSinceStartup); } - + private void OnClientConnectionEvent(Connection connection, NetCodeConnectionEvent connectionEvent) { switch (connectionEvent.State) @@ -384,7 +384,7 @@ private void OnClientConnectionEvent(Connection connection, NetCodeConnectionEve break; } } - + private void OnServerConnectionEvent(Connection connection, NetCodeConnectionEvent connectionEvent) { switch (connectionEvent.State) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs index 257885780e..d6ff6392c0 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/NetcodeIntegrationTest.cs @@ -1763,7 +1763,7 @@ protected void DestroySceneNetworkObjects() #if UNIFIED_NETCODE // Handle removing the prefab reference and destroying it // and then destroying the ghostAdapter prior to destroying - // a hybrid prefab. + // a hybrid prefab. var ghostAdapter = networkObject.GetComponent(); if (ghostAdapter != null && ghostAdapter.prefabReference != null) { @@ -2397,7 +2397,7 @@ private GameObject SpawnObject(NetworkObject prefabNetworkObject, NetworkManager { NetCode.Netcode.Instance.m_ActiveWorld = owner.NetcodeWorld; } -#endif +#endif var newInstance = Object.Instantiate(prefabNetworkObject.gameObject); var networkObjectToSpawn = newInstance.GetComponent(); SpawnObjectInstance(networkObjectToSpawn, owner, destroyWithScene, isPlayerObject); From 17f0a17be9fca402d151f79faa1fb37e33674ade Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 13:05:10 -0500 Subject: [PATCH 85/99] update: PVP-Exceptions Adding some exceptions to the v3.x.x branch until we determine if we want to rename those assemblies or have them all in one assembly. --- pvpExceptions.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pvpExceptions.json b/pvpExceptions.json index 83e996338b..4fe15a52cf 100644 --- a/pvpExceptions.json +++ b/pvpExceptions.json @@ -5,10 +5,18 @@ "CHANGELOG.md: line 9: Unreleased section is not allowed for public release" ] }, - "PVP-132-2": { + "PVP-130-2": { "errors": [ - "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: name of editor assembly should end with '.Editor'" - ] + "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.CodeGen", + "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.PackageChecker", + ` "Editor/Unity.Netcode.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor", + "Tests/Editor/Unity.Netcode.Editor.Tests.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.Tests" + ], + "PVP-132-2": { + "errors": [ + "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: name of editor assembly should end with '.Editor'", + "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: name of editor assembly should end with '.Editor'" + ] + } } } -} From 5fb2d1401f30f6a27d2148c7e15e59e35d6834aa Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 13:08:03 -0500 Subject: [PATCH 86/99] fix Fixing typo. --- pvpExceptions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvpExceptions.json b/pvpExceptions.json index 4fe15a52cf..968c55aa74 100644 --- a/pvpExceptions.json +++ b/pvpExceptions.json @@ -9,7 +9,7 @@ "errors": [ "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.CodeGen", "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.PackageChecker", - ` "Editor/Unity.Netcode.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor", + "Editor/Unity.Netcode.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor", "Tests/Editor/Unity.Netcode.Editor.Tests.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.Tests" ], "PVP-132-2": { From 0d15bf7d6bdfc920a3b6e4ec781be0335b78242a Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 13:15:22 -0500 Subject: [PATCH 87/99] fix Fixing json formatting issue. --- pvpExceptions.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pvpExceptions.json b/pvpExceptions.json index 968c55aa74..334f50cde3 100644 --- a/pvpExceptions.json +++ b/pvpExceptions.json @@ -11,12 +11,13 @@ "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.PackageChecker", "Editor/Unity.Netcode.Editor.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor", "Tests/Editor/Unity.Netcode.Editor.Tests.asmdef: assembly name does not match filename: Unity.Netcode.GameObjects.Editor.Tests" - ], - "PVP-132-2": { - "errors": [ - "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: name of editor assembly should end with '.Editor'", - "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: name of editor assembly should end with '.Editor'" - ] - } + ] + }, + "PVP-132-2": { + "errors": [ + "Editor/CodeGen/Unity.Netcode.Editor.CodeGen.asmdef: name of editor assembly should end with '.Editor'", + "Editor/PackageChecker/Unity.Netcode.PackageChecker.Editor.asmdef: name of editor assembly should end with '.Editor'" + ] } } +} From 0333853177201b267ac975a30dd094941e49e9d5 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 15:12:48 -0500 Subject: [PATCH 88/99] fix Cleaning up the player prefab hash logical flow a bit and making it easier to determine if one was even found. --- .../Connection/NetworkConnectionManager.cs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs index 4c9a416c98..51ccb679f7 100644 --- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs @@ -946,6 +946,37 @@ internal void ProcessClientsToDisconnect() m_ClientsToDisconnect.Clear(); } + /// + /// The checks to find the right GlobalObjectIdHash value + /// are complex enough to deserve a method that includes + /// an easy to follow logical flow. + /// This also makes it a quick check to determine if there + /// even is a player prefab to spawn (it is valid to not + /// have any player spawned upon connection). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private (bool IsValid, uint GlobalObjectIdHash) GetPlayerPrefabHash(uint? playerPrefabHash) + { + if (playerPrefabHash != null && playerPrefabHash.HasValue) + { + return (true, playerPrefabHash.Value); + } + else + if (NetworkManager.NetworkConfig.PlayerPrefab != null) + { + var networkObject = NetworkManager.NetworkConfig.PlayerPrefab.GetComponent(); + if (networkObject != null) + { + return (true, networkObject.GlobalObjectIdHash); + } + else + { + NetworkManager.Log.Error(new Logging.Context(LogLevel.Error, $"Player prefab {NetworkManager.NetworkConfig.PlayerPrefab.name} has no {nameof(NetworkObject)}!")); + } + } + return (false, 0); + } + /// /// Server Side: Handles the approval of a client /// @@ -972,10 +1003,10 @@ internal void HandleConnectionApproval(ulong ownerClientId, bool createPlayerObj } // Server-side spawning (only if there is a prefab hash or player prefab provided) - var idHashToSpawn = (playerPrefabHash != null && playerPrefabHash.HasValue) ? playerPrefabHash.Value : NetworkManager.NetworkConfig.PlayerPrefab != null ? NetworkManager.NetworkConfig.PlayerPrefab.GetComponent()?.GlobalObjectIdHash : null; - if (!NetworkManager.DistributedAuthorityMode && createPlayerObject && idHashToSpawn.HasValue) + var idHashToSpawn = GetPlayerPrefabHash(playerPrefabHash); + if (!NetworkManager.DistributedAuthorityMode && createPlayerObject && idHashToSpawn.IsValid) { - var playerObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(idHashToSpawn.Value, ownerClientId, playerPosition, playerRotation); + var playerObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(idHashToSpawn.GlobalObjectIdHash, ownerClientId, playerPosition, playerRotation); if (playerObject == null) { From cdb89eb54da3ebc778535ec8df4cd992a0a20955 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 15:17:29 -0500 Subject: [PATCH 89/99] style removing additional whitespace from comment --- .../Runtime/Connection/NetworkConnectionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs index 51ccb679f7..aaeb67f4db 100644 --- a/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs @@ -947,7 +947,7 @@ internal void ProcessClientsToDisconnect() } /// - /// The checks to find the right GlobalObjectIdHash value + /// The checks to find the right GlobalObjectIdHash value /// are complex enough to deserve a method that includes /// an easy to follow logical flow. /// This also makes it a quick check to determine if there From 5a6d19c84b07f2589536cee516e37b74c3969808 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 15:47:25 -0500 Subject: [PATCH 90/99] update Updating the package version --- com.unity.netcode.gameobjects/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/package.json b/com.unity.netcode.gameobjects/package.json index d4a1bf74c6..a37383e00d 100644 --- a/com.unity.netcode.gameobjects/package.json +++ b/com.unity.netcode.gameobjects/package.json @@ -2,7 +2,7 @@ "name": "com.unity.netcode.gameobjects", "displayName": "Netcode for GameObjects", "description": "Netcode for GameObjects is a high-level netcode SDK that provides networking capabilities to GameObject/MonoBehaviour workflows within Unity and sits on top of underlying transport layer.", - "version": "2.11.2", + "version": "3.0.0", "unity": "6000.0", "dependencies": { "com.unity.nuget.mono-cecil": "1.11.4", From 712161c50d2e9447e57df7f5aa6ac3e3ff3fac06 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 16:43:29 -0500 Subject: [PATCH 91/99] style indented endregion. --- .../Runtime/Components/NetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs index c05579a904..5a9e7c08bc 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs @@ -3861,7 +3861,7 @@ protected void Initialize() { InternalInitialization(); } -#endregion + #endregion #region PARENTING AND OWNERSHIP /// From 077f1838f8d966c96f91083fc26902683f80d983 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 17:05:06 -0500 Subject: [PATCH 92/99] revert Reverting changes to manifest for now. --- testproject/Packages/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index f7832aaad0..69421078ce 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -53,4 +53,4 @@ "testables": [ "com.unity.netcode.gameobjects" ] -} +} \ No newline at end of file From 78e36cb872be2463f8acb908d6df745c1f1fdc0e Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 17:15:22 -0500 Subject: [PATCH 93/99] style Adding new line. --- testproject/Packages/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 69421078ce..f7832aaad0 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -53,4 +53,4 @@ "testables": [ "com.unity.netcode.gameobjects" ] -} \ No newline at end of file +} From 560bf37a57fd6e9ad42076132ff70d99318e836b Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 17:30:58 -0500 Subject: [PATCH 94/99] style adding some additional comments. --- .../Runtime/Configuration/NetworkPrefabs.cs | 4 ++++ .../Runtime/Core/NetworkManager.cs | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs index c402adf04c..a0321a7ac4 100644 --- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs +++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkPrefabs.cs @@ -331,6 +331,10 @@ public bool Contains(NetworkPrefab prefab) } #if UNIFIED_NETCODE + /// + /// TODO: Either keep or remove prior to freeze. + /// Leaving this here in case we have to control when things get registered. + /// internal bool HasPendingGhostPrefabs { get; private set; } internal bool HasGhostPrefabs { get; private set; } private List m_PendingGhostRegistration = new List(); diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index d599c644c3..806663c443 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1239,6 +1239,14 @@ internal void Initialize(bool server) RealTimeProvider = ComponentFactory.Create(this); #if UNIFIED_NETCODE && OUT_OF_BAND_RPC + // TODO-FixMe: + // We assign transport at this point to preceed the NetworkConnectionManager + // being initialized. However, HasGhostPrefabs might not be set at this point + // if the prefabs list was set after instantiating the NetworkManager. + // Integration tests do this, but user code could do this too. + // To-Investigate: + // Determine if this really impacts anything having prefabs initialze/register + // at this point versus last. NetworkConfig.InitializePrefabs(); if (NetworkConfig.Prefabs.HasGhostPrefabs) { From c95a3f0683aa91542c9b87101a0526486f156881 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 19:25:55 -0500 Subject: [PATCH 95/99] update Updating the project to 6000.3.14f1 --- testproject/Packages/manifest.json | 23 ++++++++++--------- .../ProjectSettings/ProjectVersion.txt | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index f7832aaad0..21fe1a8f2e 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -1,23 +1,23 @@ { "disableProjectUpdate": false, "dependencies": { - "com.unity.addressables": "2.7.4", - "com.unity.ai.navigation": "2.0.9", - "com.unity.collab-proxy": "2.10.1", - "com.unity.ide.rider": "3.0.38", - "com.unity.ide.visualstudio": "2.0.25", + "com.unity.addressables": "2.9.1", + "com.unity.ai.navigation": "2.0.12", + "com.unity.collab-proxy": "2.12.4", + "com.unity.ide.rider": "3.0.39", + "com.unity.ide.visualstudio": "2.0.26", "com.unity.mathematics": "1.3.3", - "com.unity.multiplayer.tools": "2.2.6", + "com.unity.multiplayer.tools": "2.2.8", "com.unity.netcode.gameobjects": "file:../../com.unity.netcode.gameobjects", "com.unity.package-validation-suite": "0.49.0-preview", - "com.unity.services.authentication": "3.5.2", - "com.unity.services.multiplayer": "1.2.0", + "com.unity.services.authentication": "3.6.1", + "com.unity.services.multiplayer": "2.1.3", "com.unity.test-framework": "1.6.0", - "com.unity.test-framework.performance": "3.2.0", - "com.unity.timeline": "1.8.9", - "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.11", + "com.unity.test-framework.performance": "3.4.0", + "com.unity.timeline": "1.8.12", "com.unity.ugui": "2.0.0", "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -44,6 +44,7 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", "com.unity.modules.vr": "1.0.0", diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index c31f18a127..88b74ddff7 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 6000.2.12f1 -m_EditorVersionWithRevision: 6000.2.12f1 (e89d5df0e333) +m_EditorVersion: 6000.3.14f1 +m_EditorVersionWithRevision: 6000.3.14f1 (d68c3f99a318) From 9f70c40342f3fce10a5415d9f0f67e24eb8936c3 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 19:36:28 -0500 Subject: [PATCH 96/99] Update Project version --- testproject/ProjectSettings/ProjectVersion.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/ProjectSettings/ProjectVersion.txt b/testproject/ProjectSettings/ProjectVersion.txt index 88b74ddff7..e0b58cc2e0 100644 --- a/testproject/ProjectSettings/ProjectVersion.txt +++ b/testproject/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 6000.3.14f1 -m_EditorVersionWithRevision: 6000.3.14f1 (d68c3f99a318) +m_EditorVersion: 6000.3.15f1 +m_EditorVersionWithRevision: 6000.3.15f1 (c1aa84e375f6) From 6067a3141b9d728b4546d3d4686db1e91e1555dc Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 20:08:10 -0500 Subject: [PATCH 97/99] update Making the minimal editor version 6000.3 and removing 6000.0. --- .yamato/project.metafile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.yamato/project.metafile b/.yamato/project.metafile index 1c3037a322..6d0ce1da0f 100644 --- a/.yamato/project.metafile +++ b/.yamato/project.metafile @@ -176,13 +176,12 @@ validation_editors: default: - 6000.3 all: - - 6000.0 - 6000.3 - 6000.4 - 6000.5 - trunk minimal: - - 6000.0 + - 6000.3 # Scripting backends used by Standalone RunTimeTests--------------------------------------------------- From 29d41247c87b3349fe0e906b29fa67771219ffbb Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 20:13:29 -0500 Subject: [PATCH 98/99] style Adding comments --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 806663c443..265702e87d 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -1350,6 +1350,9 @@ private bool CanStart(StartType type) } #if UNIFIED_NETCODE + /// + /// The world instance assigned to this NetworkManager instance. + /// public NetcodeWorld NetcodeWorld { get; internal set; } private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType) { @@ -1420,7 +1423,6 @@ private bool UnifiedIsConfiguredCorrectly() } return true; } - #endif /// From 2c7d0397e18a1a416a2ffd48784327f443ae5ee3 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 29 Apr 2026 20:18:53 -0500 Subject: [PATCH 99/99] update Updating triggers to use no less than 6000.3 --- .yamato/_triggers.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.yamato/_triggers.yml b/.yamato/_triggers.yml index 2c1e538566..87af9083fb 100644 --- a/.yamato/_triggers.yml +++ b/.yamato/_triggers.yml @@ -76,13 +76,13 @@ pr_code_changes_checks: # Run API validation to early-detect all new APIs that would force us to release new minor version of the package. Note that for this to work the package version in package.json must correspond to "actual package state" which means that it should be higher than last released version - .yamato/vetting-test.yml#vetting_test - # Run package EditMode and Playmode package tests on trunk and an older supported editor (6000.0) + # Run package EditMode and Playmode package tests on trunk and an older supported editor (6000.3) - .yamato/package-tests.yml#package_test_-_ngo_trunk_mac - - .yamato/package-tests.yml#package_test_-_ngo_6000.0_win + - .yamato/package-tests.yml#package_test_-_ngo_6000.3_win - # Run testproject EditMode and Playmode project tests on trunk and an older supported editor (6000.0) + # Run testproject EditMode and Playmode project tests on trunk and an older supported editor (6000.3) - .yamato/project-tests.yml#test_testproject_win_trunk - - .yamato/project-tests.yml#test_testproject_mac_6000.0 + - .yamato/project-tests.yml#test_testproject_mac_6000.3 # Run standalone test. We run it only on Ubuntu since it's the fastest machine, and it was noted that for example distribution on macOS is taking 40m since we switched to Apple Silicon # Coverage on other standalone machines is present in Nightly job so it's enough to not run all of them for PRs