Files
XRLib/Assets/Runtime Transform Gizmos/Scripts/Runtime Package Common/Objects/ObjectPool.cs
2025-12-08 10:59:29 +09:00

102 lines
3.1 KiB
C#

using UnityEngine;
using System.Collections.Generic;
namespace RTG
{
public class ObjectPool
{
public enum GrowMode
{
None = 0,
Increment,
ByAmount
}
private GameObject _sourceObject;
private GrowMode _growMode = GrowMode.ByAmount;
private int _growAmount = 50;
private List<GameObject> _pooledObjects = new List<GameObject>(100);
private Transform _pooledParent;
public GrowMode PoolGrowMode { get { return _growMode; } set { _growMode = value; } }
public int GrowAmount { get { return _growAmount; } set { _growAmount = Mathf.Max(1, value); } }
public ObjectPool(GameObject sourceObject, int numPooled, GrowMode growMode)
{
_sourceObject = sourceObject;
_growMode = growMode;
}
public void SetPooledObjectsParent(Transform parent)
{
_pooledParent = parent;
foreach (var pooledObject in _pooledObjects)
if (pooledObject != null && !pooledObject.activeSelf) pooledObject.transform.SetParent(parent, false);
}
public GameObject GetPooledObject()
{
foreach (var pooledObject in _pooledObjects)
{
if (pooledObject != null && !pooledObject.activeSelf)
{
pooledObject.SetActive(true);
if (_pooledParent != null) pooledObject.transform.SetParent(_pooledParent, false);
return pooledObject;
}
}
if (PoolGrowMode != GrowMode.None)
{
int objectIndex = _pooledObjects.Count;
Grow();
GameObject pooledObject = _pooledObjects[objectIndex];
pooledObject.SetActive(true);
if (_pooledParent != null) pooledObject.transform.SetParent(_pooledParent, false);
return pooledObject;
}
return null;
}
public void MarkAsUnused(GameObject gameObject)
{
if (gameObject != null) gameObject.SetActive(false);
}
public void MarkAllAsUnused()
{
foreach(var poolObject in _pooledObjects)
{
MarkAsUnused(poolObject);
}
}
private void Grow()
{
if (PoolGrowMode == GrowMode.None) return;
if (PoolGrowMode == GrowMode.ByAmount)
{
for (int objectIndex = 0; objectIndex < GrowAmount; ++objectIndex)
CreatePooledObject();
}
else
if (PoolGrowMode == GrowMode.Increment) CreatePooledObject();
}
private GameObject CreatePooledObject()
{
GameObject newPooledObject = GameObject.Instantiate(_sourceObject);
_pooledObjects.Add(newPooledObject);
if (_pooledParent != null) newPooledObject.transform.SetParent(_pooledParent, false);
newPooledObject.SetActive(false);
return newPooledObject;
}
}
}