Game Development, 게임개발/개발

Object Pooling 유니티에서 이용하기

게임이 더 좋아 2022. 6. 6. 18:49
반응형
728x170

 

Object Pooling은 많이 들어봤고

디자인 패턴 중에 가장 이해하기 쉬운 것이라고 생각한다.

[Game Developer, 게임개발자/디자인패턴] - Object Pool, 오브젝트 풀, 객체 풀 [디자인패턴](최적화)

 

더군다나 Unity 2021에서는 이제 엔진에서 지원한다.

 


 

그래서 더 좋다.

공부할 때도 유니티의 native에서 지원하는 함수들을 바탕으로 하면 될 것이다.

 

 

1. ObjectPool을 이용하는 주체

using UnityEngine;
using UnityEngine.Pool;

public class Launcher : MonoBehaviour {
    [SerializeField] Bullet bulletPrefab;

    private IObjectPool<Bullet> bulletPool;

    private void Awake()
    {
        //(생성하는 함수, Get, Release, Destroy, Max)
        //Pool의 크기를 3으로 유지하는 것이다. => 최종적으로는 3개만 풀에 저장함.
        bulletPool = new ObjectPool<Bullet>(
            CreateBullet,
            OnGet,
            OnRelease,
            OnDestroy,
            maxSize : 3
            );
    }

    private Bullet CreateBullet()
    {
        Bullet bullet = Instantiate(bulletPrefab); //생성
        bullet.SetPool(bulletPool); //풀 설정
        return bullet;
    }

    //=> Get이 실행될 때 실행되는 함수 => element가 parameter가 됨
    private void OnGet(Bullet bullet))
    {
        bullet.gameObject.SetActive(true);
    }

    //=> Release가 실행될 때 실행되는 함수 element가 실행함.
    private void OnRelease(Bullet bullet))
    {
        bullet.gameObject.SetActive(false);
    }

    private void OnDestory(Bullet bullet))
    {
        Destroy(bullet.gameObject)
    }
    private void Update() {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulletPool.Get();
        }
    }
}

 

2. 대상 Object

using UnityEngine;
using UnityEngine.Pool;

public class Bullet : MonoBehaviour {
    [SerializeField] Vector3 speed;


    //오브젝트 자체에서 어떤 Pool에 들어가야 하는지 알고 있어야함.
    private IObjectPool<Bullet> bulletPool;


    //Pool의 정보는 Bullet이 반환될 때 같이 불러준다.
    private SetPool(IObjectPool<Bullet> pool)
    {
        bulletPool = pool;
    }

    private void Update() {
        transform.position += speed * Time.deltaTime;
    }


    //화면에서 사라지면 Pool로 다시 집어 넣는다.
    private void OnBecameInvisible() {
        bulletPool.Release(this);
    }
}

 

 

최적화 중에 이것보다 쉬운 최적화는 없다고 할 수 있고 이만큼 성능이 눈에 띄게 좋아지는 것도 없다.

오브젝트 풀을 있는 것을 이용해도 좋지만

시간이 난다면 만들어보는 것도 좋다.

아니 우선 혼자 만들어보고 저거를 쓰는 것이 좋겠다.

 

반응형
그리드형