online fix
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user