본문으로 건너뛰기
Unity C# 기초집LESSON 20

Object Pool 기초

난이도초급
예상 시간50분
선수지식19강 생성 규칙

20강. Object Pool 기초

1. 이번 강의에서 해결할 문제​

빠른 생성 상황에서 Instantiate와 Destroy가 반복됩니다. 동작은 같게 유지하면서 택배 인스턴스를 재사용하고 상태 초기화를 명확히 합니다.

2. 학습 목표​

3. 핵심 개념​

Pool은 미사용 인스턴스를 보관했다 다시 빌려줍니다. 생성·파괴 횟수는 줄지만, 위치·타입·해결 상태와 이벤트 참조를 매번 초기화해야 합니다. 빈도가 낮다면 Pool이 항상 더 좋은 것은 아니므로 Profiler로 확인합니다.

4. 단계별 실습​

C# · 파일 경로: Assets/DeliverySorter/Scripts/Packages/PackageItem.cs에 반납 계약 추가

PackageItem.cs
using System;
using UnityEngine;

public sealed class PackageItem : MonoBehaviour
{
[SerializeField] private SpriteRenderer packageRenderer;
public PackageTypeData Type { get; private set; }
public bool IsResolved { get; private set; }
private Action<PackageItem> release;

public void Activate(PackageTypeData type, Vector3 position, Action<PackageItem> releaseAction)
{
Type = type;
release = releaseAction;
IsResolved = false;
transform.position = position;
packageRenderer.color = type.DisplayColor;
}

public void ResolveAndRelease()
{
if (IsResolved) return;
IsResolved = true;
release?.Invoke(this);
}
}

C# · 파일 경로: Assets/DeliverySorter/Scripts/Spawning/PackagePool.cs

PackagePool.cs
using UnityEngine;
using UnityEngine.Pool;

public sealed class PackagePool : MonoBehaviour
{
[SerializeField] private PackageItem prefab;
[SerializeField, Min(1)] private int defaultCapacity = 12;
[SerializeField, Min(1)] private int maxSize = 40;

private IObjectPool<PackageItem> pool;

private void Awake()
{
pool = new ObjectPool<PackageItem>(
CreateItem,
item => item.gameObject.SetActive(true),
item => item.gameObject.SetActive(false),
item => Destroy(item.gameObject),
collectionCheck: true,
defaultCapacity: defaultCapacity,
maxSize: maxSize);
}

private PackageItem CreateItem()
{
PackageItem item = Instantiate(prefab, transform);
item.gameObject.SetActive(false);
return item;
}

public PackageItem Get(PackageTypeData type, Vector3 position)
{
PackageItem item = pool.Get();
item.Activate(type, position, Release);
return item;
}

public void Release(PackageItem item) => pool.Release(item);
}

Spawner는 Instantiate 대신 packagePool.Get(type, spawnPoint.position)을 호출하고 Zone·MissZone은 Destroy 대신 ResolveAndRelease()를 호출합니다.

5. 코드가 동작하는 이유​

첫 요청에 만든 택배는 반납될 때 비활성화되어 Pool에 보관됩니다. 다음 Get은 같은 인스턴스를 활성화한 뒤 위치·타입·해결 상태와 반납 함수를 새 실행에 맞게 초기화합니다. collectionCheck는 개발 중 중복 반납 오류를 찾는 데 도움을 줍니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

Object Pool 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Object Pool 기초”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“Object Pool 기초” 실습 중 ‘이전 타입·속도·상태를 초기화하지 않음’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

20강. Object Pool 기초 미완료 상태