공부혜옹

[Unity] ObjectPool을 이용한 object 관리 본문

공부합시다/Unity

[Unity] ObjectPool을 이용한 object 관리

Blair06 2022. 1. 16. 20:36

유니티를 처음 시작하면서 탱크게임을 구현해보는데 총알을 objectPool로 만들어 관리해보기로 했다

겪은 문제점

총알과 같이 한 오브젝트가 여러 생성과 파괴를 반복할때 계속해서 gc가 실행되어 프로그램의 성능을 저하시킨다는 문제점을 발견하였다

해결법

생성과 파괴를 반복하기 때문에 일어나는 문제이기 때문에 생성과 파괴를 최소화하는 구조의 코드를 구현해 해결하기로 하였다.
ObjectPool을 이용해 일정 갯수의 오브젝트를 미리 생성해놓고 필요할때마다 꺼내쓰고 다시 pool안으로 집어넣어 오브젝트를 순환시키며 사용한다. 만약 pool안에 오브젝트가 없다면 하나를 생성해서 사용한다. 이렇게 되면 생성과 파괴를 최소화하며 여러가지의 오브젝트를 사용할 수 있다.

코드

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

public class ObjectPool : MonoBehaviour
{
    public static ObjectPool Instance;

    [SerializeField]
    private GameObject poolingObjectPrefab;
    Queue<Bullet> poolingObjectQueue = new Queue<Bullet>();

    private void Awake()
    {
        Instance = this;
        Initialize(20);
    }

    private void Initialize(int initCount)
    {
        for (int i = 0; i < initCount; i++)
        {
            poolingObjectQueue.Enqueue(CreateNewObject());
        }
    }

    private Bullet CreateNewObject()
    {
        Bullet newObj = Instantiate(poolingObjectPrefab).GetComponent<Bullet>();
        newObj.gameObject.SetActive(false);
        newObj.transform.SetParent(transform);
        return newObj;
    }

    public static Bullet GetObject(Vector3 direction)
    {
        if (Instance.poolingObjesctQueue.Count > 0) {
        Bullet obj = Instance.poolingObjectQueue.Dequeue();
        obj.transform.SetParent(null);

        obj.transform.position = direction;
        obj.gameObject.SetActive(true);
        return obj;
        } else {
            Bullet newObj = Instance.CreateNewObject();
            newObj.transform.SetParent(null);

            newObj.transform.position = direction;

            newObj.gameObject.SetActive(true);

            return newObj;
        }
    }
    
    public static void ReturnObject(Bullet obj)
    {
        obj.gameObject.SetActive(false);
        obj.transform.SetParent(Instance.transform);
        Instance.poolingObjectQueue.Enqueue(obj);
    }
}
반응형

'공부합시다 > Unity' 카테고리의 다른 글

[Unity] JSON Serialize  (0) 2022.02.09
[Unity] SoundManager - 배경음 플레이하기  (0) 2022.01.18
Comments