online fix

This commit is contained in:
2025-10-27 12:37:18 +01:00
parent 96d50bfad5
commit e6759d6610
281 changed files with 7337 additions and 136 deletions

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Game.Scripts.Runtime.Abstractions;
using Game.Scripts.Runtime.Data;
using UnityEngine;
using Unity.Netcode;
namespace Game.Scripts.Runtime.Pooling
{
@@ -112,7 +113,7 @@ namespace Game.Scripts.Runtime.Pooling
}
bucket.Active.Add(go);
go.transform.SetParent(null, true);
SetParentSafely(go, null, true);
go.transform.SetPositionAndRotation(position + definition.PrefabPivotOffset, rotation);
go.SetActive(true);
@@ -137,7 +138,12 @@ namespace Game.Scripts.Runtime.Pooling
bucket.Active.Remove(instance);
instance.SetActive(false);
instance.transform.SetParent(poolRoot, false);
var netObj = instance.GetComponent<NetworkObject>();
SetParentSafely(instance, poolRoot, false, netObj, false);
if (netObj != null)
{
Destroy(netObj);
}
bucket.Available.Enqueue(instance);
item.Handle?.NotifyDespawned();
InstanceDespawned?.Invoke(instance, item.Definition);
@@ -172,7 +178,8 @@ namespace Game.Scripts.Runtime.Pooling
}
EnsureRoot();
var go = Instantiate(definition.Prefab, poolRoot);
var go = Instantiate(definition.Prefab);
SetParentSafely(go, poolRoot, false);
go.name = $"{definition.Prefab.name}_Pooled";
go.SetActive(false);
@@ -230,6 +237,38 @@ namespace Game.Scripts.Runtime.Pooling
root.transform.SetParent(transform, false);
poolRoot = root.transform;
}
private void SetParentSafely(GameObject instance, Transform parent, bool worldPositionStays, NetworkObject cachedNetworkObject = null, bool restoreAutoSync = true)
{
if (instance == null)
{
return;
}
var netObj = cachedNetworkObject != null ? cachedNetworkObject : instance.GetComponent<NetworkObject>();
var shouldRestore = false;
var previousAutoSync = false;
if (netObj != null && !HasListeningNetworkManager(netObj))
{
previousAutoSync = netObj.AutoObjectParentSync;
netObj.AutoObjectParentSync = false;
shouldRestore = restoreAutoSync;
}
instance.transform.SetParent(parent, worldPositionStays);
if (shouldRestore && netObj != null)
{
netObj.AutoObjectParentSync = previousAutoSync;
}
}
private static bool HasListeningNetworkManager(NetworkObject netObj)
{
var manager = netObj != null ? (netObj.NetworkManager != null ? netObj.NetworkManager : NetworkManager.Singleton) : NetworkManager.Singleton;
return manager != null && manager.IsListening;
}
}
[DisallowMultipleComponent]