프로젝트 일지/Unity

[Unity/TIL] '오집마' 프로젝트에서의 오브젝트 풀링 (Object Pooling)

톰마토 2025. 4. 30. 21:56
728x90

'오집마'의 오브젝트 풀링

사용하게 된 이유

방치형 게임 특성상 오브젝트의 생성과 소멸이 매우 빈번하다. Instantiate / Destroy를 직접 사용할 경우 GC가 발생하고 프레임드랍을 유발할 수 있다. ⇒ 오브젝트 풀링이 필수적이었다.

 

연출된 상황이지만 이론상 이런 상황도 가능하다.

 

사용한 구조!! 대박박임

이전에 해온 프로젝트들에서 직접 오브젝트별 풀 관리 코드를 작성하는 것이 작업량이 많고 복잡해서 짧은 프로젝트 기간에 사용하기 부담스러운 감이 있었다. (불편했다는 뜻)

그래서 이번 프로젝트에서는 자동 풀링 시스템으로 구현해서 사용하고 있다!@! 

 

자동으로 불려지는 코드들

Poolable 컴포넌트를 가진 오브젝트는 우리가 제작한 Instantiate와 Destroy 함수를 사용하면 자동으로 풀링되도록 만들었다.

Instantiate에서 Get
Destroy에서 Release

PoolManager

오브젝트 이름을 키값으로 가지는 Dictionary로 모든 풀을 관리해주고 있다. Instantiate와 Destroy에서 사용하는 Get과 Release는 PoolManager에서 제공하고, 그 내용물로는 Pool에서 제공하는 Get과 Release를 해준다.

Pools

Pool

풀 내부 구현은 유니티에서 제공하는 ObjectPool을 사용했다. 함수들을 만들어서 생성자에 액션을 넣어주기만 하면 된다. 

using UnityEngine;
using UnityEngine.Pool;

public class Pool
{
    private GameObject original;
    private readonly Transform transform;
    private readonly ObjectPool<GameObject> poolables;

    public Pool(string key, Transform parent)
    {
        Managers.Resource.LoadAssetAsync<GameObject>(key, original => this.original = original);

        transform = new GameObject($"Pool_{key}").transform;
        transform.SetParent(parent);

        poolables = new(CreateFunc, ActionOnGet, ActionOnRelease, ActionOnDestroy);
    }

    public GameObject Get()
    {
        return poolables.Get();
    }

    public void Release(Poolable poolable)
    {
        poolables.Release(poolable.gameObject);
    }

    private GameObject CreateFunc()
    {
        return Managers.Resource.Instantiate(original);
    }

    private void ActionOnGet(GameObject gameObject)
    {
        gameObject.SetActive(true);
    }

    private void ActionOnRelease(GameObject gameObject)
    {
        gameObject.SetActive(false);
        gameObject.transform.SetParent(transform);
    }

    private void ActionOnDestroy(GameObject gameObject)
    {
        Object.Destroy(gameObject);
    }
}

 

개발하는 입장에서 새로운 개체를 구현할 때마다 풀을 직접 신경써서 구현하지 않아도 되니 너무 편하고 유용하다 ㅠㅠ 짱임

 

728x90