본문으로 건너뛰기
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 기초 미완료 상태