서비스
교육 철학

Unity Addressable Asset System 가이드

Abstract

📌
이 페이지는 Addressables 를 에디터에서 처음부터 끝까지 한 번 따라 해 보는 실습입니다 — 설치, 그룹 만들기, 에셋 등록, 빌드, 그리고 서버에 올려 빌드 없이 에셋을 바꾸는 것까지. 프레임워크와 무관한 순수 Addressables 실습이라, 한 번 해 보면 프레임워크가 뒤에서 무엇을 하는지 감이 잡힙니다.
이 실습에서 프레임워크를 쓸 때도 그대로 필요한 부분 / 필요 없는 부분
본문의 단계
프레임워크(YamYamCoding 에디션)를 쓸 때
패키지 설치
불필요. 프레임워크 패키지의 의존성으로 자동 설치된다
설정 생성, 그룹 만들기, 에셋 등록, 이름 간략화
그대로 필요. 특히 Simplify Addressable Names 로 주소를 짧게 만드는 단계가 중요하다 — 그 문자열이 ShowEntity 에 넘기는 값이 된다
레이블 추가
선택. 프레임워크는 레이블을 쓰지 않는다. 패치 때 미리 받을 묶음을 지정하는 용도로는 유용하다
스크립트 두 개 (AddressablesLoader, AddressablesController)
불필요. 로드·인스턴스화·해제는 ShowEntity / HideEntity 가 대신한다
Play Mode Script, 빌드
그대로 필요. 개발 중에는 Use Asset Database, 빌드 검증 때 Use Existing Build
원격 빌드, 프로필, 원격 카탈로그, 업로드, 에셋 업데이트
그대로 필요 (패치를 할 경우). 게임 쪽에서 카탈로그 갱신을 확인하는 코드는 따로 써야 한다
즉 프레임워크는 런타임 코드(본문의 스크립트 두 개)만 대신하고, 에디터 작업은 그대로 남습니다.
프레임워크로 같은 결과 내기
본문 스크립트가 하는 일("Prefabs 레이블의 에셋을 전부 띄운다")을 프레임워크로 하면 이렇게 됩니다. 레이블 대신 주소 목록을 코드(또는 데이터 테이블)가 들고 있다는 점이 다릅니다.
private static readonly string[] PropAddresses = { "PaintCan", "Workbench", "Shelf" }; EntityComponent entity = GameEntry.GetComponent<EntityComponent>(); for (int i = 0; i < PropAddresses.Length; i++) { int id = EntitySerialId.Next(); entity.ShowEntity(id, typeof(PropLogic), PropAddresses[i], "Prop", PropData.Create(id)); }
C#
복사
치울 때는 HideEntity 를 부르면 인스턴스가 풀로 돌아가고, 에셋 핸들 해제까지 프레임워크가 처리합니다. 본문의 스크립트에는 해제 코드가 없어서, 그대로 쓰면 띄운 것들이 메모리에서 내려가지 않습니다.
원격 업데이트를 게임에 연결하기
본문 마지막의 "에셋 업데이트"는 서버에 새 번들을 올리는 데까지입니다. 이미 실행 중이거나 캐시를 가진 앱이 새 카탈로그를 확인하고 미리 받아 두게 하려면 게임 시작 Procedure 에 몇 줄이 더 필요합니다. 그 코드는 Resource Updating(리소스 업데이트)-Addressable 의 Abstract 에 ProcedureCheckUpdate 로 정리해 두었습니다.
⚠️
본문을 읽을 때 주의할 점 — 버전 차이
본문은 2020년 무렵의 Addressables 1.x 화면을 기준으로 합니다. 이 프로젝트가 쓰는 2.x 에서는 몇 군데가 다릅니다.
•
메뉴 경로는 Windows 가 아니라 Window 입니다(Window → Asset Management → Addressables → Groups).
•
레이블 창은 Groups 창의 Tools → Window → Labels 에 있습니다.
•
빌드 결과물의 카탈로그는 기본이 .json 이 아니라 .bin(바이너리 카탈로그)입니다. 올릴 파일은 .bin 또는 .json, .hash, .bundle 입니다.
•
로컬 빌드 결과는 Assets\AddressableAssetsData\ 가 아니라 Library\com.unity.addressables\ 아래에 생깁니다. addressables_content_state.bin 만 Assets\AddressableAssetsData\<플랫폼>\ 에 남습니다. 이 파일은 "이전 빌드 업데이트"에 필요하므로 출시한 빌드의 것을 보관해 두어야 합니다.
•
본문 스크린샷의 화면 배치는 현재 버전과 조금 다릅니다. 메뉴 이름을 기준으로 따라가세요.
•
플레이 모드 스크립트 세 가지 중 개발용 기본은 Use Asset Database (fastest) 입니다. 이 값은 Library/ 에 저장되어 git 으로 공유되지 않습니다.
어드레서블 패키지 설치
2-1 select-package-manager
2-2 install-addressables
Windows > Package Manager 선택.
Addressables 검색 후 설치.
📦 어드레서블
어드레서블 설정 생성
3-1 select-addressables-groups
3-2 create-addressable-settings
Windows > Asset Management > Addressables > Groups 선택.
Create Addressables Settings 클릭.
그룹 생성
4 create-groups
Assets\ExampleAssets 폴더처럼 Materials, Models, Prefabs, Shaders, Textures 로 분류.
_Addressable Groups_창에서 Create > Group > Packed Assets 선택 후 이름 변경.
어셋을 어드레서블로 만들기
5-1 move-assets-to-addressable-group
5-2 simplify-addressable-names
어셋들을 Assets\ExampleAssets 폴더에서 _Addressable Groups_창의 적절한 그룹으로 이동.
이름을 간략화하기 위해 어셋들을 선택한 후 우클릭 Simplify Addressable Names 선택.
레이블 추가
6-1 create-labels
6-2 add-labels
Tools > Labels 선택.
이전 단계에서 생성했던 그룹에 따라 레이블 생성.
각각의 어드레서블에 적절한 레이블 추가.
기존 오브젝트 제거
7 remove-existing-objects
씬에서 Example Assets 게임오브젝트 아래의 Workshop Set, Props 제거.
📜 스크립트
아래 두 클래스를 추가.
AddressablesLoader.cs
using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; public static class AddressablesLoader { public static async Task InitAssets<T>(string label, List<T> createdObjs, Transform parent) where T : Object { var locations = await Addressables.LoadResourceLocationsAsync(label).Task; foreach (var location in locations) { createdObjs.Add(await Addressables.InstantiateAsync(location, parent).Task as T); } } }
C#
복사
AddressablesController.cs
이 모노비헤이비어를 아무 게임오브젝트에 붙여야됨.
Example Assets가 이미 있으니 이걸 사용.
using System.Collections.Generic; using UnityEngine; public class AddressablesController : MonoBehaviour { [SerializeField] private string _label; private Transform _parent; private List<GameObject> _createdObjs { get; } = new List<GameObject>(); private void Start() { _parent = GameObject.Find("Example Assets").transform; Instantiate(); } private async void Instantiate() { await AddressablesLoader.InitAssets(_label, _createdObjs, _parent); } }
C#
복사
불러올 레이블 명시
8 specify-label-to-be-loaded
인스펙터의 Label 필드에 Prefabs 기입.
확인
9 check-out
Play 버튼 클릭 후 확인.
🚧 빌드
플레이 모드 스크립트
10 play-mode-script
플레이 모드에서 어드레서블을 사용하는데는 3가지 모드가 있음.
프로덕션 환경에서 동작하는지 확인하기 위해서는 Play Mode Script를 Use Existing Build (requires built groups) 로 변경.
어드레서블 빌드
11-1 build-addressables
11-2 files-built
빌드를 하기 위해 Build > New Build > Default Build Script 선택.
Assets\AddressableAssetsData\Windows 폴더 내에서 빌드된 파일을 찾을 수 있음.
확인
12 requires-build
Play 버튼을 클릭 후 확인.
빌드를 하지않았다면 위와 같은 에러 메세지 발생.
☁️ 원격 빌드
빌드된 파일들은 서버에 저장하고 가져올 수 있음.
여기서는 AWS S3로 할것임.
이 가이드에서는 클라우드 서비스 설정은 다루지않을 것임.
필요하다면 이 레퍼런스를 참조할 것.
프로필 생성
13-1 manage-profiles
13-2 create-profile
13-3 set-active
Profile:Default > Manage Profiles 선택.
_Addressable Profiles_창에서 Create > Profile 선택.
생성된 프로필을 원하는 이름으로 변경.
생성된 프로필에서, RemoteLoadPath 값을 http://localhost에서 버킷 URL로 변경.
생성된 프로필 우클릭 후 Set Active 선택.
원격 카탈로그 활성화
14-1 inspect-system-settings
14-2 enable-remote-catalog
Tools > Inspect system Settings 선택.
인스펙터에서 Build Remote Catalog 체크.
Build Path를 RemoteBuildPath로 설정.
Load Path 역시 RemoteLoadPath로 설정.
원격 그룹 설정
15-1 inspect-group-settings
15-2 set-group-paths
Prefabs 그룹 우클릭 후 Inspect Group Settings 선택.
인스펙터에서 Build Path를 RemoteBuildPath로 설정.
Load Path 역시 RemoteLoadPath로 설정.
빌드
16 files-built-for-remote
로컬 빌드 했듯이 Build > New Build > Default Build Script 선택.
ServerData\StandaloneWindows 폴더 내에서 빌드된 파일들을 찾을 수 있음.
파일들은 .json, .hash, .bundle 세 가지.
업로드
17-1 errors-without-uploading
17-2 upload
17-3 grant-public-read
Unity가 원격 그룹을 서버에서 가져오려고 시도하기 때문에, 이 시점에서 플레이 모드에 진입시 에러가 발생함.
업로드를 합시다.
AWS 콘솔 S3 서비스에서 S3 버킷의 루트로 이동. StandaloneWindows 폴더를 버킷에 업로드.
Next 버튼을 눌러 Set permissons 섹션으로 가서 Manage public permissions를 Grant public read access to object(s) 로 변경.
Upload 버튼 클릭.
🔧 어셋 업데이트
변경
18 make-change
어셋에 아무거나 변화를 줌.
여기서는 페인트 통의 머테리얼을 바꿧음.
이전 빌드 업데이트
19-1 update-previous-build
19-2 select-bin-file
어셋 업데이트를 위해 Build > Update a Previous Build 선택.
Assets\AddressableAssetsData\Windows\ 폴더의 addressables_content_state.bin 파일 선택.
변경된 파일 업로드
20 upload-files-changed
변경된 파일들 (.json, .hash, .bundle)을 버킷의 StandaloneWindows 폴더로 업로드.
grant public read permissions 부여하는 걸 잊지말 것.
🎉 짜잔!
21 tada
이제 서버에서 (원격이 설정된) 어셋들을 저장하거나 불러올수 있음.
또한 어셋을 수정할 때마다 프로젝트를 새로 빌드할 필요가 없음. 😄