유니티

[Unity] 오브젝트 풀링

simstealer 2023. 5. 7. 20:55
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PoolManager : MonoBehaviour
{
    // 복제할 프리펩
    public GameObject prefabs;

    // 오브젝트 프리펩 담을 공간
    public List<GameObject> pools;

    // 풀 사이즈
    [Range(1, 30)]
    public int poolSize;
	
    // 불러올 풀의 인덱스
    public int poolCursor;

    private void Awake()
    {
    	// 풀 리스트 초기화
        pools = new List<GameObject>();
        // 풀 사이즈 만큼 풀링 오브젝트를 생성해줍니다.
        for (int index = 0; index < poolSize; index++)
        {
            MakeOBJ();
        }
    }

    // 오브젝트 풀에 넣을 오브젝트 생성하고 풀에 넣기
    private GameObject MakeOBJ()
    {
        GameObject obj = Instantiate(prefabs, transform);
        obj.name = "PoolOBJ" + pools.Count;
        obj.SetActive(false);
        pools.Add(obj);
        return obj;
    }

    // 오브젝트 풀에서 가져오기
    private GameObject GetOBJ()
    {
        for (int index = 0; index < pools.Count; index++)
        {
            poolCursor = (poolCursor + 1) % pools.Count; 
            // (0 + 1) % 10 -> 1 % 10 = 1
            if (!pools[poolCursor].gameObject.activeSelf)
            {
                return pools[poolCursor];
            }
        }
        // 모두 사용중이라면 만들어서 반환 합니다.
        return MakeOBJ();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject obj = GetOBJ();
            obj.SetActive(true);
        }
    }

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

public class Object : MonoBehaviour
{
    private void OnEnable()
    {
        StartCoroutine(Hide());
    }

    public IEnumerator Hide()
    {
    	// 오브젝트 생성 후, 2초 후 비활성화 하게 하였습니다.
        yield return new WaitForSeconds(2f);
        gameObject.SetActive(false);
    }

    private void OnDisable()
    {
        // 갖은 정보 초기화
        // 오브젝트를 재사용하기 위해 갖은 정보가 있다면 모두 여기서 초기화 해줍니다.
        // 스피드, 위치 등등..
    }
}