Skip to content

Can use Don't destroy on load on in scene networkObjects #3402

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Urganway opened this issue Apr 14, 2025 · 3 comments
Open

Can use Don't destroy on load on in scene networkObjects #3402

Urganway opened this issue Apr 14, 2025 · 3 comments
Labels
stat:awaiting-response Awaiting response from author. This label should be added manually. type:support Questions or other support

Comments

@Urganway
Copy link

Is your feature request related to a problem? Please describe.

I'm trying to make a persistent Manager object in my game using single scenes but the DontDestroyOnLoad Method does not work as the documentation suggests here :

Instead it throw this error :

Exception: PlayerDataManager tried to registered with ScenePlacedObjects which already contains the same GlobalObjectIdHash value 281576103 for PlayerDataManager! Unity.Netcode.NetworkSceneManager.PopulateScenePlacedObjects (UnityEngine.SceneManagement.Scene sceneToFilterBy, System.Boolean clearScenePlacedObjects) (at ./Library/PackageCache/com.unity.netcode.gameobjects@f2477a6c90fe/Runtime/SceneManagement/NetworkSceneManager.cs:2835) Unity.Netcode.NetworkSpawnManager.ServerSpawnSceneObjectsOnStartSweep () (at ./Library/PackageCache/com.unity.netcode.gameobjects@f2477a6c90fe/Runtime/Spawning/NetworkSpawnManager.cs:1457) Unity.Netcode.NetworkManager.HostServerInitialize () (at ./Library/PackageCache/com.unity.netcode.gameobjects@f2477a6c90fe/Runtime/Core/NetworkManager.cs:1523) Unity.Netcode.NetworkManager.StartHost () (at ./Library/PackageCache/com.unity.netcode.gameobjects@f2477a6c90fe/Runtime/Core/NetworkManager.cs:1474) UnityEngine.Debug:LogException(Exception) Unity.Netcode.NetworkManager:StartHost() (at ./Library/PackageCache/com.unity.netcode.gameobjects@f2477a6c90fe/Runtime/Core/NetworkManager.cs:1479) Unity.Services.Multiplayer.GameObjectsNetcodeNetworkHandler:StartAsHost() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/Handlers/Connection/GameObjectsNetcodeNetworkHandler.cs:174) Unity.Services.Multiplayer.GameObjectsNetcodeNetworkHandler:SetupRelay(NetworkConfiguration) (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/Handlers/Connection/GameObjectsNetcodeNetworkHandler.cs:113) Unity.Services.Multiplayer.GameObjectsNetcodeNetworkHandler:StartAsync(NetworkConfiguration) (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/Handlers/Connection/GameObjectsNetcodeNetworkHandler.cs:26) Unity.Services.Multiplayer.<SetupConnectionAsync>d__31:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/ConnectionModule.cs:315) System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start(<SetupConnectionAsync>d__31&) Unity.Services.Multiplayer.ConnectionModule:SetupConnectionAsync(NetworkConfiguration) Unity.Services.Multiplayer.<CreateConnectionAsync>d__26:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/ConnectionModule.cs:138) System.Runtime.CompilerServices.AsyncTaskMethodBuilder:SetResult() Unity.Services.Multiplayer.<FetchJoinCodeAsync>d__18:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Multiplayer/Modules/Connection/Handlers/Relay/RelayHandler.cs:106) System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(String)
Unity.Services.Relay.d__11:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/SDK/WrappedRelayService.cs:134)
System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(Response1)
Unity.Services.Relay.Apis.RelayAllocations.d__8:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Apis/RelayAllocationsApi.cs:160)
System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(HttpClientResponse) Unity.Services.Relay.Http.<MakeRequestAsync>d__1:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Http/HttpClient.cs:41) System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(HttpClientResponse)
Unity.Services.Relay.Http.d__3:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Http/HttpClient.cs:56)
System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(HttpClientResponse) Unity.Services.Relay.Http.<CreateHttpClientResponse>d__4:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Http/HttpClient.cs:84) System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(HttpClientResponse)
Unity.Services.Relay.Http.<b__0>d:MoveNext() (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Http/HttpClient.cs:81)
System.Threading.Tasks.TaskCompletionSource1:SetResult(HttpClientResponse) Unity.Services.Relay.Http.<>c__DisplayClass0_0:<GetAwaiter>b__0(AsyncOperation) (at ./Library/PackageCache/com.unity.services.multiplayer@124598b145d4/Runtime/Relay/Http/UnityWebRequestHelpers.cs:34) UnityEngine.AsyncOperation:InvokeCompletionEvent()

Describe the solution you'd like

Either DontDestroyOnLoad can be called on in-scene NetworkObjects without error
Or Update the documentation to not tell it works this way and propose a suitable solution for Netcode Managers

Describe alternatives you've considered

I'm currently spawning my manager as suggested for the "hybrid approach", which works, but this feels not right for this purpose since in the doc it says that i can have my netcode manager as an in-scene object and the "hybride approch" is not for this purpose specificaly.

Additional context

The Manager is a PlayerDataManager which spawns, stores and gives access to playerData components which contains elements needed in both Menu and Game scenes (and can't be separated)

@Urganway Urganway added stat:awaiting-triage Status - Awaiting triage from the Netcode team. stat:reply-needed Awaiting reply from Unity account type:feature New feature, request or improvement labels Apr 14, 2025
@NoelStephensUnity
Copy link
Collaborator

NoelStephensUnity commented Apr 14, 2025

This error is most likely due to the fact that when you are ending your session you are not destroying the PlayerDataManager which will be in the DDOL scene.

It might be you have something like:

  • Menu Scene
    • Loads the Lobby Scene
  • Lobby Scene
    • Loads the Network Session Scene
  • Network Session Scene
    • Contains the PlayerDataManager in-scene placed NetworkObject.
    • Upon ending a session, you load the Menu Scene as LoadSceneMode.Single.
      • The PlayerDataManager will persist during this scene loading.
      • If you enter into a new session, you will get an error like the one you are getting because you now have two instances of the same in-scene placed NetworkObject.

To avoid this issue, you will want to have your PlayerDataManager subscribe to the NetworkManager.OnClientStopped if you are only using a Host and NetworkManager.OnServerStopped if you are using a dedicated server. Upon the NetworkManager shutting down, you can destroy the PlayerDataManager.

The other approach (since it is persisting throughout your session) is to do something like this:

    public class PlayerDataManager : NetworkBehaviour
    {
        public PlayerDataManager Instance;

        public bool DestroyNewInstance;

        private void Awake()
        {
            if (Instance != null && Instance.gameObject != gameObject)
            {
                if (!DestroyNewInstance)
                {
                    // Destroys the last instance
                    Destroy(Instance.gameObject);
                }
                else
                {
                    // Preserves the original/first instance
                    Destroy(gameObject);
                }
            }
            Instance = this;
        }

        private void Start()
        {
            DontDestroyOnLoad(gameObject);
        }
    }

Let me know if this resolves your issue?

@github-actions github-actions bot added stat:awaiting-response Awaiting response from author. This label should be added manually. and removed stat:reply-needed Awaiting reply from Unity account labels Apr 14, 2025
@NoelStephensUnity NoelStephensUnity added type:support Questions or other support and removed type:feature New feature, request or improvement labels Apr 14, 2025
@Urganway
Copy link
Author

Urganway commented Apr 15, 2025

The problem occurs even if i reboot both Unity and my PC, so i think the "not destroying properly the manager" part is not the source of the problem

My scene layout is, for the moment, way simpler : A "Main Menu" scene handling connection and lobby, a "Main Game" scene handling the game itself

I tried your fix on my singleton parent class, the DDOL part does not throw an error anymore but when a client tries to join the session (when creating, it's fine) a warning and an error are thrown :

Warning :
[SceneEventData- Scene Handle Mismatch] serverSceneHandle (-1336) could not be found in ServerSceneHandleToClientSceneHandle. Using the currently active scene. UnityEngine.Debug:LogWarning (object) Unity.Netcode.NetworkSceneManager:SetTheSceneBeingSynchronized (int) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:1017) Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/SceneEventData.cs:1135) Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2388) Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2283) Unity.Netcode.NetworkSceneManager:OnClientBeginSync (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2205) Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2370) Unity.Netcode.NetworkSceneManager:HandleSceneEvent (ulong,Unity.Netcode.FastBufferReader) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2802) Unity.Netcode.SceneEventMessage:Handle (Unity.Netcode.NetworkContext&) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/Messages/SceneEventMessage.cs:29) Unity.Netcode.NetworkMessageManager:ReceiveMessage<Unity.Netcode.SceneEventMessage> (Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkContext&,Unity.Netcode.NetworkMessageManager) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:563) Unity.Netcode.NetworkMessageManager:HandleMessage (Unity.Netcode.NetworkMessageHeader&,Unity.Netcode.FastBufferReader,ulong,single,int) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:422) Unity.Netcode.NetworkMessageManager:ProcessIncomingMessageQueue () (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:448) Unity.Netcode.NetworkManager:NetworkUpdate (Unity.Netcode.NetworkUpdateStage) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkManager.cs:339) Unity.Netcode.NetworkUpdateLoop:RunNetworkUpdateStage (Unity.Netcode.NetworkUpdateStage) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkUpdateLoop.cs:191) Unity.Netcode.NetworkUpdateLoop/NetworkEarlyUpdate/<>c:<CreateLoopSystem>b__0_0 () (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkUpdateLoop.cs:214)

Error :
[Netcode] NetworkPrefab hash was not found! In-Scene placed NetworkObject soft synchronization failure for Hash: 1232464011! UnityEngine.Debug:LogError (object) Unity.Netcode.NetworkLog:LogError (string) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Logging/NetworkLog.cs:34) Unity.Netcode.NetworkSpawnManager:CreateLocalNetworkObject (Unity.Netcode.NetworkObject/SceneObject) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Spawning/NetworkSpawnManager.cs:900) Unity.Netcode.NetworkObject:AddSceneObject (Unity.Netcode.NetworkObject/SceneObject&,Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkManager,bool) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkObject.cs:3226) Unity.Netcode.SceneEventData:SynchronizeSceneNetworkObjects (Unity.Netcode.NetworkManager) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/SceneEventData.cs:1137) Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2388) Unity.Netcode.NetworkSceneManager:ClientLoadedSynchronization (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2283) Unity.Netcode.NetworkSceneManager:OnClientBeginSync (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2205) Unity.Netcode.NetworkSceneManager:HandleClientSceneEvent (uint) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2370) Unity.Netcode.NetworkSceneManager:HandleSceneEvent (ulong,Unity.Netcode.FastBufferReader) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/SceneManagement/NetworkSceneManager.cs:2802) Unity.Netcode.SceneEventMessage:Handle (Unity.Netcode.NetworkContext&) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/Messages/SceneEventMessage.cs:29) Unity.Netcode.NetworkMessageManager:ReceiveMessage<Unity.Netcode.SceneEventMessage> (Unity.Netcode.FastBufferReader,Unity.Netcode.NetworkContext&,Unity.Netcode.NetworkMessageManager) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:563) Unity.Netcode.NetworkMessageManager:HandleMessage (Unity.Netcode.NetworkMessageHeader&,Unity.Netcode.FastBufferReader,ulong,single,int) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:422) Unity.Netcode.NetworkMessageManager:ProcessIncomingMessageQueue () (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Messaging/NetworkMessageManager.cs:448) Unity.Netcode.NetworkManager:NetworkUpdate (Unity.Netcode.NetworkUpdateStage) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkManager.cs:339) Unity.Netcode.NetworkUpdateLoop:RunNetworkUpdateStage (Unity.Netcode.NetworkUpdateStage) (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkUpdateLoop.cs:191) Unity.Netcode.NetworkUpdateLoop/NetworkEarlyUpdate/<>c:<CreateLoopSystem>b__0_0 () (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/Core/NetworkUpdateLoop.cs:214)

And when i try to access a NetworkList in the PlayerDataManager it throws an error :
ObjectDisposedException: The Unity.Collections.NativeList1[System.UInt64] has been deallocated, it is not allowed to access it
Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckGetSecondaryDataPointerAndThrow (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <2431722e3e3e41d78b6718bb39ab9111>:0)
Unity.Collections.NativeList1[T].AsArray () (at ./Library/PackageCache/com.unity.collections@56bff8827a7e/Unity.Collections/NativeList.cs:608) Unity.Collections.NativeList1[T].GetEnumerator () (at ./Library/PackageCache/com.unity.collections@56bff8827a7e/Unity.Collections/NativeList.cs:773)
Unity.Netcode.NetworkList1[T].GetEnumerator () (at ./Library/PackageCache/com.unity.netcode.gameobjects@d8bc8d81f1fa/Runtime/NetworkVariable/Collections/NetworkList.cs:418) PlayerDataManager.TryGetPlayerData (System.UInt64 clientId, PlayerData& playerData) (at Assets/Scripts/Multiplayer/PlayerDataManager.cs:58) ReadyButton.SetLocalPlayerReady () (at Assets/Scripts/Ui/ConnectionMenu/ReadyButton.cs:27) UnityEngine.Events.InvokableCall.Invoke () (at <2431722e3e3e41d78b6718bb39ab9111>:0) UnityEngine.Events.UnityEvent.Invoke () (at <2431722e3e3e41d78b6718bb39ab9111>:0) UnityEngine.UI.Button.Press () (at ./Library/PackageCache/com.unity.ugui@22ebcc83720a/Runtime/UGUI/UI/Core/Button.cs:70) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at ./Library/PackageCache/com.unity.ugui@22ebcc83720a/Runtime/UGUI/UI/Core/Button.cs:114) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at ./Library/PackageCache/com.unity.ugui@22ebcc83720a/Runtime/UGUI/EventSystem/ExecuteEvents.cs:57) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction1[T1] functor) (at ./Library/PackageCache/com.unity.ugui@22ebcc83720a/Runtime/UGUI/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at ./Library/PackageCache/com.unity.ugui@22ebcc83720a/Runtime/UGUI/EventSystem/EventSystem.cs:530)
`

@github-actions github-actions bot added stat:reply-needed Awaiting reply from Unity account and removed stat:awaiting-response Awaiting response from author. This label should be added manually. labels Apr 15, 2025
@michalChrobot michalChrobot removed the stat:awaiting-triage Status - Awaiting triage from the Netcode team. label Apr 15, 2025
@NoelStephensUnity
Copy link
Collaborator

Hi @Urganway,

My apologies on the script as the public PlayerDataManager Instance; should have been public static PlayerDataManager Instance;.

To avoid making another mistake, I am attaching a replication project that is close to your setup (minus the lobby) that includes the above PlayerDataManager component (with the static adjustment) that also has an Rpc that clients invoke when they connect to verify it is spawned and working as expected.

InSceneDDOL.zip

I am also including a small video to show it working:

InSceneDDOL.mp4

Take a look at the video and the project I provided and see if this helps you resolve/find the issue in your project?

@github-actions github-actions bot added stat:awaiting-response Awaiting response from author. This label should be added manually. and removed stat:reply-needed Awaiting reply from Unity account labels Apr 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stat:awaiting-response Awaiting response from author. This label should be added manually. type:support Questions or other support
Projects
None yet
Development

No branches or pull requests

3 participants