유니티 오브젝트 풀링 기초
주의사항 : 오브젝트를 껐다 켰다 하는거라서 Start()나 Awake()에 위치값, 데이터값 넣는걸 주의해야함.
- 어차피 큐를 꺼낼 때 오브젝트를 키켜서 꺼내기 때문에 OnEnable()을 안쓰고 꺼내는 함수에다가 데이터 초기화를 설정 해도 됨.
1. 큐만 사용하는 기본 방식
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);
}
유니티 유닛겹치기( Nav Mesh Agent ) (0) | 2025.02.22 |
---|---|
유니티 내위치에서 타겟으로 Y축 회전하기 (0) | 2025.01.25 |
유니티 유한상태기계 - FSM(Finite State Machine) 1 (0) | 2025.01.25 |
유니티 스킬 쿨타임 (0) | 2025.01.20 |
유니티 몬스터가 캐릭터한테 점프해서 도달하기 (0) | 2025.01.20 |