일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- C
- 크래프톤 정글 4기
- project3
- 알고리즘수업-너비우선탐색2
- 네트워크
- 크래프톤정글4기
- 유니티
- 파이썬
- BFS
- 크래프톤정글
- 연결리스트
- 다익스트라
- c#
- 크래프톤 정글
- 추상클래스와인터페이스
- 핀토스
- kraftonjungle
- 오블완
- 4기
- 티스토리챌린지
- anonymous page
- 전쟁-전투
- KRAFTON JUNGLE
- Unity
- 알고리즘
- TiL
- pintos
- User Stack
- 이벤트 함수 실행 순서
- 백준
Archives
- Today
- Total
말감로그
[Unity] 디자인 패턴 - 오브젝트 풀링 본문
728x90
오브젝트 풀링
빈번하게 사용하는 객체 및 오브젝트에 대하여 매번 새로 생성하고 삭제하는 것이 아닌 미리 생성한 오브젝트를 재사용하는 기법이다.
유니티에서 오브젝트를 생성하거나 삭제할 때 Instantiate()와 Destroy() 함수를 사용하는데, 새로 할당하고 삭제하는 과정에서 많은 시간과 메모리를 잡아먹는다. (가비지 컬렉터가 자주 발생 , 메모리 단편화 발생)
예제 코드
(1) Bullet 스크립트
using UnityEngine;
public class Bullet : MonoBehaviour
{
private float speed = 10f;
public void Init(Vector3 direction)
{
GetComponent<Rigidbody>().velocity = direction * speed;
Invoke(nameof(ReturnToPool), 2f); // 2초 후 자동 반환
}
private void ReturnToPool()
{
gameObject.SetActive(false);
}
}
(2) ObjectPool 스크립트
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
public GameObject prefab; // 미리 생성할 프리팹
public int poolSize = 10; // 초기 생성 개수
private Queue<GameObject> pool = new Queue<GameObject>();
private void Start()
{
for (int i = 0; i < poolSize; i++)
{
GameObject obj = Instantiate(prefab);
obj.SetActive(false);
pool.Enqueue(obj);
}
}
public GameObject GetObject()
{
if (pool.Count > 0)
{
GameObject obj = pool.Dequeue();
obj.SetActive(true);
return obj;
}
else
{
GameObject newObj = Instantiate(prefab);
return newObj;
}
}
public void ReturnObject(GameObject obj)
{
obj.SetActive(false);
pool.Enqueue(obj);
}
}
(3) 총알을 발사하는 GunController 스크립트
using UnityEngine;
public class GunController : MonoBehaviour
{
public ObjectPool bulletPool;
public Transform firePoint;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) // 스페이스바를 누르면 총알 발사
{
Shoot();
}
}
void Shoot()
{
GameObject bullet = bulletPool.GetObject();
bullet.transform.position = firePoint.position;
bullet.transform.rotation = firePoint.rotation;
bullet.GetComponent<Bullet>().Init(firePoint.forward);
}
}
최적화 팁
1. 오브젝트가 너무 많이 생성되지 않도록 풀 크기를 적절히 조절
2. ReturnToPool()을 호출할 때 CancelInvoke()를 사용하여 중복 실행 방지
3. OnDisable()을 활용하면 풀로 반환되는 시점을 자동으로 처리 가능
728x90
'Unity' 카테고리의 다른 글
[Unity] Cinemachine Collider (0) | 2025.05.01 |
---|---|
네트워크 동기화 (0) | 2025.02.22 |
[Unity] DOTween (0) | 2025.02.05 |
[Unity] 유니티 성능 최적화 방법 (렌더링, 메모리) (0) | 2025.01.10 |
[유니티C# 스크립팅 마스터하기] - 4장 이벤트 주도적 프로그래밍 (1) | 2025.01.07 |