기본 패턴
csharp
AsyncOperationHandle<GameObject> handle = enemyRef.LoadAssetAsync<GameObject>();설명
- Addressables를 실제로 쓸 때 가장 중요한 것은 "로드"보다 "언제 해제할 것인가"입니다. 이 시스템은 참조 카운트와 핸들을 통해 수명주기를 관리하므로, 로드만 하고 release를 잊으면 메모리 흐름이 바로 흐려집니다.
LoadAssetAsync<T>는 에셋 자체를 로드하고,InstantiateAsync는 인스턴스 생성까지 포함합니다. 여러 번 생성할 프리팹이면 asset을 한 번 로드해 두고 직접 instantiate하는 방식이 맞을 때도 있고, 수명주기를 단순화하려면InstantiateAsync가 더 낫기도 합니다.AsyncOperationHandle은 단순히 "결과를 담는 변수"가 아니라 로드 작업과 수명주기를 대표하는 핸들입니다. 완료 여부, 진행률, 결과, release 시점이 여기에 묶입니다.- 씬과 프리팹, UI 리소스, 캐릭터 스킨처럼 자산 종류에 따라 해제 정책이 달라집니다. 한 번만 잠깐 쓰는 자산은 사용 직후 해제하고, 세션 내내 쓰는 공용 자산은 더 오래 유지할 수 있습니다.
- 그래서 Addressables 도입 시에는 API 자체보다 "누가 로드하고, 누가 release하고, 같은 자산을 여러 시스템이 공유할 때 정책을 어떻게 맞출 것인가"를 먼저 정하는 편이 좋습니다.
빠른 정리
| 항목 | 설명 |
|---|---|
LoadAssetAsync<T> | 에셋을 비동기로 로드 |
InstantiateAsync | 로드와 인스턴스 생성을 함께 처리 |
AsyncOperationHandle | 결과와 수명주기를 대표하는 핸들 |
Addressables.Release | 더 이상 쓰지 않는 에셋 해제 |
| 핵심 질문 | 누가 소유하고 언제 해제하는가 |
주의할 점
Addressables에서 가장 흔한 실수는 "불러왔으니 끝"이라고 생각하는 것입니다. 핸들 관리와 release 정책이 없으면 디버깅이 어려운 메모리 누수처럼 보이는 문제가 생기기 쉽습니다.
참고 링크
3 sources