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 권장)