com.alicizax.unity.framework/Runtime/ABase/GameObjectPool/Components/PoolComponents.cs

151 lines
4.5 KiB
C#

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<ParticleSystem>(true)
: GetComponents<ParticleSystem>();
}
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;
}
}
}
}
}