Unity-Technologies / Unity-Technologies/com.unity.netcode.gameobjects

Infinite hang when reloading a scene contains a manually spawned NetworkObject with a SpriteLibrary and a SpriteResolver

Offen
#4,095 10 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

stat:reply-needed type:support
Vorherrschende Sprache
C#
Sterne
2.3k
Forks
461
Ø Merge
3 T. 16 Std.
Gemergte PRs (30 T.)
20

Beschreibung

Description

Infinite hang when reloading a scene contains a manually spawned NetworkObject with a SpriteLibrary and a SpriteResolver

Reproduce Steps
  1. Create an empty scene
  2. Add a NetworkManager, with UnityTransport
  3. Create a new prefab with NetworkObject, SpriteRenderer, Animator, SpriteLibrary, SpriteResolver (following basically this tutorial: https://www.youtube.com/watch?v=4xPHqEEa-V0)
  4. Create an empty object TestCrash with the following code, and link the prefab from (3) in the inspector
public class TestCrash : NetworkBehaviour
{
    [SerializeField] public GameObject prefab = null!;
    private bool _alreadyCalled;

    private void Start()
    {
        var networkManager = NetworkManager.Singleton;
        var unityTransport = networkManager.GetComponent<UnityTransport>();

        // Start local server
        unityTransport.UseWebSockets = false; // if applicable
        unityTransport.SetConnectionData("0.0.0.0", 7777);
        networkManager!.NetworkConfig.NetworkTransport = unityTransport;
        networkManager.StartHost();

        NetworkManager.Singleton.SpawnManager.InstantiateAndSpawn(
            prefab!.GetComponent<NetworkObject>(),
            OwnerClientId,
            destroyWithScene: true,
            position: Vector3.zero
        );
    }

    private void Update()
    {
        if (_alreadyCalled) return;
        if (Time.timeSinceLevelLoad < 3f) return;
        _alreadyCalled = true;
       NetworkManager.Singleton.SceneManager.LoadScene(SceneManager.GetActiveScene().name, LoadSceneMode.Single);
    }
}

TestCrash is some code that

  • starts a local server
  • spawns the prefab
  • waits 3 seconds
  • reloads the scene
Actual Outcome

After a few attempts, the scene never reloads and the Unity editor hangs forever (has to be force quitted)

Expected Outcome

The scene reloads every 3s

Environment
  • OS: Windows 11
  • Unity Version: 6000.4.7f1
  • Netcode Version: 2.12.0
Additional Context
  • This bug did not happen with 2.12.0 and Unity 6000.3.11f1 (started happening after upgrading to 6000.4.7f1)
  • The bug doesn't happen without destroyWithScene: true,
  • Removing the SpriteResolver/SpriteLibrary stops the bug from happening
  • The NetworkObject must be spawned with InstantiateAndSpawn, if the prefab is added to the scene, the bug doesn't happen

Here is a dump of the Main Thread stack when the editor is hanging. The CPU is at 0% at that point. Maybe a lock contention?

<unknown> 0x00007ff973d63cb4
<unknown> 0x00007ff973c30543
<unknown> 0x00007ff97107e558
UnityClassic::Baselib_SystemFutex_Wait(int * __ptr64,int,unsigned int) 0x00007ff8886af7f6
ProfilerMutexLock(Mutex & __ptr64,char const * __ptr64,profiling::Marker & __ptr64,char const * __ptr64,int) 0x00007ff88b1a4450
PersistentManager::Lock(PersistentManager::LockFlags,profiling::Marker * __ptr64) __ptr64 0x00007ff88b1a1b83
PersistentManager::GetPathName(EntityId) __ptr64 0x00007ff88b1968bb
GetGUIDFromEntityId(EntityId) 0x00007ff888e786fe
AssetChangedNotifier::UnsubscribeFromAll(EntityId) __ptr64 0x00007ff88a209aee
SpriteRenderer::MainThreadCleanup(void) __ptr64 0x00007ff88b631e42
delete_object_internal_step1(Object * __ptr64) 0x00007ff88b8cd380
CommitBatchDelete(BatchDelete & __ptr64) 0x00007ff88b5286d2
DestroyObjectHighLevel_Internal(Object * __ptr64,bool) 0x00007ff88b532e31
DestroyObjectHighLevel(Object * __ptr64,bool) 0x00007ff88b532ba8
DelayedDestroyCallback(Object * __ptr64,void * __ptr64) 0x00007ff88b7963cb
DelayedCallManager::Update(int) __ptr64 0x00007ff88b797ac8
<unknown> 0x00007ff88b4f9d6b
ExecutePlayerLoop(NativePlayerLoopSystem * __ptr64) 0x00007ff88b517f5b
ExecutePlayerLoop(NativePlayerLoopSystem * __ptr64) 0x00007ff88b51811a
PlayerLoop(void) 0x00007ff88b51d105
EditorPlayerLoop::Execute(void) __ptr64 0x00007ff889ab957a
PlayerLoopController::InternalUpdateScene(bool,bool) __ptr64 0x00007ff889ab2a9c
PlayerLoopController::UpdateSceneIfNeededFromMainLoop(void) __ptr64 0x00007ff889ab4dad
Application::TickTimer(void) __ptr64 0x00007ff889acc4c3
<unknown> 0x00007ff8894bfb2c
UnityMain 0x00007ff8894c8693
<unknown> 0x00007ff6ae972f2a
<unknown> 0x00007ff97360e957
<unknown> 0x00007ff973caad6c

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Setup mit aktiviertem NetworkManager, UnityTransport, InstantiateAndSpawn, SpriteLibrary, SpriteResolver und destroyWithScene nachzustellen, und verfolge dann NetworkManager.SceneManager.LoadScene während wiederholter Neuladungen. Vergleiche das Verhalten über die gemeldeten Unity- und Netcode-Versionen hinweg; abgeschlossen ist die Aufgabe, wenn die Szene alle 3 Sekunden neu geladen wird, ohne dass sich der Unity-Editor aufhängt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp, unity
Bereich
game-dev, networking
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.