using UnityEngine; namespace AlicizaX { [DisallowMultipleComponent] public sealed class PoolAutoRecycleParticleStop : MonoBehaviour, IGameObjectPoolable { [SerializeField] private bool includeChildren = true; private ParticleSystem[] _particleSystems; private bool _subscribed; public void OnPoolCreate() { _particleSystems = includeChildren ? GetComponentsInChildren(true) : GetComponents(); } public void OnPoolGet(in PoolSpawnContext context) { if (_particleSystems == null) { OnPoolCreate(); } for (int i = 0; i < _particleSystems.Length; i++) { ParticleSystem particle = _particleSystems[i]; if (particle == null) { continue; } var main = particle.main; main.stopAction = ParticleSystemStopAction.Callback; particle.Clear(true); particle.Play(true); } _subscribed = true; } public void OnPoolRelease() { _subscribed = false; } public void OnPoolDestroy() { _subscribed = false; } private void OnParticleSystemStopped() { if (!_subscribed || !AppServices.TryGet(out GameObjectPoolManager poolManager)) { return; } poolManager.Release(gameObject); } } [DisallowMultipleComponent] public sealed class PoolSleepableGameObjectGroup : MonoBehaviour, IPoolSleepable { [SerializeField] private Behaviour[] disableOnSleep; [SerializeField] private Renderer[] hideOnSleep; [SerializeField] private Collider[] disableCollider3D; [SerializeField] private Collider2D[] disableCollider2D; public void EnterSleep() { int disableCount = disableOnSleep == null ? 0 : disableOnSleep.Length; for (int i = 0; i < disableCount; i++) { if (disableOnSleep[i] != null) { disableOnSleep[i].enabled = false; } } int hideCount = hideOnSleep == null ? 0 : hideOnSleep.Length; for (int i = 0; i < hideCount; i++) { if (hideOnSleep[i] != null) { hideOnSleep[i].enabled = false; } } int collider3DCount = disableCollider3D == null ? 0 : disableCollider3D.Length; for (int i = 0; i < collider3DCount; i++) { if (disableCollider3D[i] != null) { disableCollider3D[i].enabled = false; } } int collider2DCount = disableCollider2D == null ? 0 : disableCollider2D.Length; for (int i = 0; i < collider2DCount; i++) { if (disableCollider2D[i] != null) { disableCollider2D[i].enabled = false; } } } public void ExitSleep(in PoolSpawnContext context) { int disableCount = disableOnSleep == null ? 0 : disableOnSleep.Length; for (int i = 0; i < disableCount; i++) { if (disableOnSleep[i] != null) { disableOnSleep[i].enabled = true; } } int hideCount = hideOnSleep == null ? 0 : hideOnSleep.Length; for (int i = 0; i < hideCount; i++) { if (hideOnSleep[i] != null) { hideOnSleep[i].enabled = true; } } int collider3DCount = disableCollider3D == null ? 0 : disableCollider3D.Length; for (int i = 0; i < collider3DCount; i++) { if (disableCollider3D[i] != null) { disableCollider3D[i].enabled = true; } } int collider2DCount = disableCollider2D == null ? 0 : disableCollider2D.Length; for (int i = 0; i < collider2DCount; i++) { if (disableCollider2D[i] != null) { disableCollider2D[i].enabled = true; } } } } }