상세 컨텐츠

본문 제목

유니티 오브젝트 풀링 기초

유니티/기능

by MJ_119 2025. 1. 28. 18:48

본문

유니티 오브젝트 풀링 기초

 

주의사항 : 오브젝트를 껐다 켰다 하는거라서 Start()나 Awake()에 위치값, 데이터값 넣는걸 주의해야함.

 

  1. Awake
    오브젝트가 최초 생성될 때 1번만 호출
    SetActive(false/true)로는 호출되지 않음
    풀링된 오브젝트의 초기 세팅에 사용
  2. Start
    오브젝트가 최초로 활성화될 때 1번만 호출
    SetActive(false/true)로는 다시 호출되지 않음
    최초 1회 실행이 필요한 초기화에 사용
  3. OnEnable
    SetActive(true)할 때마다 호출
    풀에서 꺼낼 때마다 호출됨
    재사용시 필요한 초기화에 적합
  4. OnDisable
    SetActive(false)할 때마다 호출
    풀로 반환될 때마다 호출됨
    정리 작업에 적합

 

- 어차피 큐를 꺼낼 때 오브젝트를 키켜서 꺼내기 때문에 OnEnable()을 안쓰고 꺼내는 함수에다가 데이터 초기화를 설정 해도 됨.

 

 

 

 

1. 큐만 사용하는 기본 방식

  • 오브젝트 풀을 큐(Queue)로 관리.
  • 한 종류의 오브젝트를 대상으로 함.
  • 사용하지 않는 오브젝트를 큐에 저장하고 필요할 때 꺼내 씀.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    // 큐 초기화
    [SerializeField] private GameObject prefab;
    [SerializeField] private int initialPoolSize = 10;

    private Queue<GameObject> objectPool = new Queue<GameObject>();

    Queue<GameObject> objPool = new Queue<GameObject>();

    private void Start()
    {
        for (int i = 0; i < initialPoolSize; i++)
        {
            GameObject obj = Instantiate(prefab);
            obj.SetActive(false);
            objectPool.Enqueue(obj);
        }
    }

    // 오브젝트 가져오기
    public GameObject GetObject()
    {
        if (objectPool.Count > 0)
        {
            GameObject obj = objectPool.Dequeue();
            obj.SetActive(true);
            return obj;
        }
        else
        {
            // 풀에 오브젝트가 없으면 새로 생성
            GameObject obj = Instantiate(prefab);
            return obj;
        }
    }

    // 오브젝트 반환
    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);
        objectPool.Enqueue(obj);
    }
}

 

 

사용 예시 : 

// 투사체 발사
void Shoot()
{
    GameObject bullet = objectPool.GetObject();
    bullet.transform.position = firePoint.position;
    bullet.transform.rotation = firePoint.rotation;
}

// 투사체 반환
void OnBulletHit(GameObject bullet)
{
    objectPool.ReturnObject(bullet);
}

 

 

 

 

관련글 더보기