Skip to content

develop PoolManager

Jeon-YJ1004 edited this page Mar 10, 2023 · 2 revisions

PoolManager

Instantiate와 Destroy는 생성, 삭제하면서 조각난 메모리가 계속해서 쌓이는데, 게임 도중 Garbage Collector가 실행되면 렉이 많이 걸린다. 이를 최적화하기 위해 오브젝트 풀링 사용한다.
게임 시작 전에 미리 가져와서 로드해놓고 그를 재활용. 풀에서 활성화/비활성화로 사용.

  1. PoolManager 스크립트와 오브젝트를 생성

  2. 프리펩을 생성하여 저장할 배열 변수를 생성함. 한번에 등장가능한 개수를 고려해서 배열 할당(여기서는 몬스터 종류)
    image

  3. Instantiate를 사용해 생성한 인스턴스를 배열에 저장해 준다.

  4. 프리펩으로 객체 생성하고 pools[]에 저장

  5. 생성하면 좌표 0,0,0에 모두 생성되므로 모두 비활성화

  6. pools에서 사용하고 싶으면 GameManager.instance.pool.Get()을 사용하여 하나 꺼내오기.

  7. 설정들 활성화, 초기화 해주기

[PoolManager.cs]
using System.Collections.Generic;
using UnityEngine;

public class PoolManager : MonoBehaviour
{
    public GameObject[] prefabs; // 프리펩들을 보관할 변수.
    List<GameObject>[] pools; // 풀 담당을 하는 리스트들

    void Awake()
    {
        pools = new List<GameObject>[prefabs.Length];
        // 인스펙터에서 초기화
        for (int index = 0; index < pools.Length; index++)
            pools[index] = new List<GameObject>();
    }
    public GameObject Get(int index) //게임 오브젝트 반환 함수
    {
        GameObject select = null;
        //선택한 풀의 비활성화 된 게임 오브젝트 접근.
        // 발견하면 select 변수에 할당// 생성된 적이 죽을경우 
        
        foreach (GameObject item in pools[index])
        {
            if (!item.activeSelf)
            {
                select = item;
                select.SetActive(true);
                break;
            }
        }
        // 못찾으면 새롭게 생성후 할당// 모든 적이 죽지 않고 살아있음
        if (!select)
        {
            select = Instantiate(prefabs[index], transform);
            pools[index].Add(select);
        }

        return select;
    }
    public void Clear(int index)
    {
        foreach (GameObject item in pools[index])
            item.SetActive(false);
    }

    public void ClearAll()
    {
        for (int index = 0; index < pools.Length; index++)
            foreach (GameObject item in pools[index])
                item.SetActive(false);
    }
}

참고:

오브젝트 풀링 설명 블로그

오브젝트 풀링 설명 블로그2

Clone this wiki locally