151 lines
4.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|