Company
교육 철학

유니티 에셋 관리 (Resources , Assetbundle, Addressables)

Resources vs Asset Bundles vs Addressables 비교

Resources System

특징

Unity의 가장 기본적인 에셋 관리 시스템
Resources 폴더에 배치된 에셋들을 런타임에 로드
간단하고 직관적인 사용법

장점

간단함: 복잡한 설정 없이 바로 사용 가능
즉시 사용: 별도 빌드 과정 없음
동기 로딩: Resources.Load()로 즉시 로드 가능

단점

메모리 비효율: 모든 Resources 에셋이 메모리에 상주
빌드 시간 증가: 모든 에셋이 빌드에 포함됨
유연성 부족: 동적 다운로드나 업데이트 불가능
플랫폼 최적화 어려움: 모든 플랫폼에 동일한 에셋 포함

사용 예제

// 동기 로딩 GameObject prefab = Resources.Load<GameObject>("Prefabs/MyPrefab"); // 비동기 로딩 ResourceRequest request = Resources.LoadAsync<Texture2D>("Textures/MyTexture"); yield return request; Texture2D texture = request.asset as Texture2D;
C#
복사

Asset Bundles

특징

에셋들을 번들 단위로 묶어서 관리
런타임에 동적으로 로드/언로드 가능
원격 서버에서 다운로드 가능

장점

메모리 효율성: 필요한 번들만 로드
동적 컨텐츠: 런타임에 새로운 컨텐츠 다운로드
플랫폼 최적화: 플랫폼별 번들 생성 가능
압축: 번들 압축으로 용량 절약

단점

복잡한 관리: 의존성 관리가 어려움
수동 설정: 번들 빌드와 로딩 코드를 직접 작성
중복 문제: 의존성 에셋의 중복 포함 가능성
버전 관리: 수동으로 버전 체크 및 업데이트 관리

사용 예제

// 번들 로드 AssetBundle bundle = AssetBundle.LoadFromFile(path); // 에셋 로드 GameObject prefab = bundle.LoadAsset<GameObject>("MyPrefab"); // 번들 언로드 bundle.Unload(false); // 에셋은 유지 bundle.Unload(true); // 에셋도 함께 해제
C#
복사

Addressable Assets

특징

Asset Bundle의 고급 버전으로, 자동화된 에셋 관리
주소(Address) 기반 에셋 참조
의존성과 메모리 관리 자동화

장점

자동 의존성 관리: 의존성 자동 해결
간편한 사용: Asset Bundle의 복잡함 없이 간단한 API
유연한 배포: Local/Remote 배포 자동 전환
메모리 최적화: 자동 참조 카운팅
Hot-fix 지원: 런타임 컨텐츠 업데이트
프로파일링: 상세한 메모리 및 성능 분석

단점

학습 곡선: 초기 설정과 개념 이해 필요
빌드 시간: 번들 분석 및 빌드 시간 추가
Unity 버전 의존성: 비교적 최신 기능

사용 예제

// 비동기 로딩 var handle = Addressables.LoadAssetAsync<GameObject>("MyPrefab"); GameObject prefab = await handle.Task; // 메모리 해제 Addressables.Release(handle);
C#
복사

2. 언제 어떤 시스템을 사용할까?

Resources 사용 시기

프로토타입 개발: 빠른 테스트가 필요할 때
소규모 프로젝트: 에셋 수가 적고 복잡도가 낮을 때
항상 필요한 에셋: 게임 전반에 걸쳐 계속 사용되는 에셋

Asset Bundles 사용 시기

커스텀 관리 필요: 특별한 로딩 로직이 필요할 때
레거시 프로젝트: 이미 Asset Bundle로 구축된 프로젝트
세밀한 제어: 번들 로딩/언로딩을 직접 제어해야 할 때

Addressables 사용 시기 (권장)

현대적 프로젝트: 새로운 프로젝트 시작 시
DLC/업데이트: 런타임 컨텐츠 업데이트가 필요할 때
메모리 최적화: 효율적인 메모리 관리가 중요할 때
팀 협업: 복잡한 의존성을 자동으로 관리하고 싶을 때

성능 비교

항목
Resources
Asset Bundles
Addressables
메모리 효율성
로딩 속도
구현 복잡도
유지보수성
확장성

Addressable Assets System 프로젝트 적용 방법

패키지 설치
Window → Package Manager → Unity Registry → Addressables 검색 → Install
Plain Text
복사

초기 설정

1.
Addressables Groups 창 열기
Window → Asset Management → Addressables → Groups
2.
첫 설정
Create Addressables Settings 클릭
Default Local Group (Default) 자동 생성됨

에셋을 Addressable로 만들기

방법 1: Inspector에서 설정

에셋 선택 → Inspector → Addressable 체크박스 활성화
Plain Text
복사

방법 2: Groups 창에서 드래그 앤 드롭

에셋을 Addressables Groups 창의 그룹으로 드래그
Plain Text
복사

방법 3: 스크립트로 설정

using UnityEditor.AddressableAssets; using UnityEditor.AddressableAssets.Settings; // 에셋을 Addressable로 설정 var settings = AddressableAssetSettingsDefaultObject.Settings; var entry = settings.CreateOrMoveEntry(assetGuid, settings.DefaultGroup); entry.address = "MyAssetAddress";
C#
복사

에셋 로딩 코드 예제

using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class AddressableLoader : MonoBehaviour { // 단일 에셋 로드 public async void LoadSingleAsset() { AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("MyPrefabAddress"); GameObject prefab = await handle.Task; Instantiate(prefab); } // 인스턴스 직접 생성 public async void InstantiateAsset() { AsyncOperationHandle<GameObject> handle = Addressables.InstantiateAsync("MyPrefabAddress"); GameObject instance = await handle.Task; // 사용 완료 후 해제 Addressables.ReleaseInstance(instance); } // 라벨로 여러 에셋 로드 public async void LoadAssetsByLabel() { AsyncOperationHandle<IList<GameObject>> handle = Addressables.LoadAssetsAsync<GameObject>("UI", null); IList<GameObject> assets = await handle.Task; foreach (var asset in assets) { Instantiate(asset); } Addressables.Release(handle); } }
C#
복사

빌드 설정

1.
Build Scripts 설정
Groups 창에서 Build → New Build → Packed Assets
2.
Profile 설정
Window → Asset Management → Addressables → Profiles
Local/Remote 경로 설정
3.
그룹 설정
각 그룹의 Build & Load Paths 설정
Bundle Mode (Pack Together/Pack Separately) 선택

주소 명명 규칙

카테고리/서브카테고리/에셋명 예: "Characters/Heroes/Warrior" "UI/MainMenu/StartButton" "Audio/BGM/MainTheme"
Plain Text
복사

메모리 관리

항상 Addressables.Release() 호출
큰 에셋은 사용 후 즉시 해제
Addressables Event Viewer로 메모리 모니터링

빌드 최적화

자주 바뀌지 않는 에셋은 별도 그룹으로 분리
의존성이 많은 에셋은 Shared 그룹에 배치
번들 크기를 적절히 유지 (1-10MB 권장)