1. 개요
Unity에서 발사체 오브젝트 풀리을 구현하는 김에 제네릭을 사용하여 범용적인 오브젝트 풀링 시스템을 구축했다.
풀의 생성, 재사용, 회수, 파괴 로직을 제네릭으로 처리했다.
2. 주요 구성
- PoolingManager
public Dictionary<string, object> poolingDictionary = new Dictionary<string, object>();
public void RegisterPoolObject<T>(string poolName, IObjectPool<T> objectPrefab) where T : class
{
if (poolingDictionary.ContainsKey(poolName)) return;
poolingDictionary.Add(poolName , objectPrefab);
}
//외부에서 오브젝트 풀을 사용할때 오브젝트 이름으로부터 해당 오브젝트 풀을 찾아준다.
public IObjectPool<T> FindPool<T>(string _foolName) where T : class
{
if (poolingDictionary.TryGetValue(_foolName, out var projectile))
{
return projectile as IObjectPool<T>;
}
return null;
}
- 제네릭을 통해 IObjectPool 의 타입을 자유롭게 받아서 딕셔너리에 저장한다.
- 외부에서 RegisterPullObject를 통해 등록한 Pool을 FindPool을 통해 찾아서 사용 가능하다.
- 사용되는 풀들을 모두모아 한번에 관리할 수 있다.
public void OnGet<T>(T _poolObj) where T : MonoBehaviour
{
_poolObj.gameObject.SetActive(true);
}
//오브젝트 회수
public void OnRelease<T>(T _poolObj) where T : MonoBehaviour
{
_poolObj.gameObject.SetActive(false);
}
//오브젝트 파괴
public void OnDes<T>(T _poolObj) where T : MonoBehaviour
{
Destroy(_poolObj.gameObject);
}
- 제네릭을 통해 소환, 반환 역시 범용성 있게 처리 가능하다.
3. 사용 예시
- Projectile
poolingManager.RegisterPoolObject(projectilePrefab.name,
new ObjectPool<Projectile>
(
CreateProjectile, //발사체 오브젝트 생성 로직
poolingManager.OnGet, //생성된 오브젝트를 소환
poolingManager.OnRelease, //생성된 오브젝트 회수
poolingManager.OnDes, //생성된 오브젝트 파괴
maxSize: 10 //한번에 관리될 오브젝트 갯수
));
connectedPool = poolingManager.FindPool<Projectile>(projectilePrefab.name);
- 발사체 풀링하기 위해 제네릭 타입을 Proejctile로 지정하여 발사체를 관리한다.
connectedPool.Get()
.SetProjectile
(owner.projectilePivot.position,
searchTarget.GetCurrentTarget(),
owner.GetStat().GetTotalAttack()
);
- Manager로 부터 찾아온 풀에서 등록한 Get() 함수를 통해 Projectile을 풀링한다.
- Projectile의 SetProjectile을 통해 정보를 세팅하여 사용한다.
4. 마무리
제네릭 메서드를 배우기 전에는 풀을 만들때 타입이 달라질때마다 타입별로 Get Relase등의 함수를 추가해 줬다.
하지만 이제 제네릭을 통해 하나의 함수로 다양한 타입을 처리할 수 있어 범용적이고 편리한 오브젝트 풀링이 구현된거 같다.
'Unity > 기능' 카테고리의 다른 글
| [Unity] New Input System (0) | 2025.07.14 |
|---|---|
| [Unity] Animator의 CrossFade (0) | 2025.07.11 |
| [Unity] 제네릭 메서드 (0) | 2025.07.07 |
| [Unity] OverlapBox 와 OverlapBoxNonAlloc (0) | 2025.07.03 |
| [Unity] Rigidbody - MovePosition (0) | 2025.07.01 |