Unity3D/Addressable Asset2020. 5. 25. 11:33

Asset Hosting Services

Overview

Hosting Services는 Addressable Assets configuration data를 사용하여 Unity Editor 내에서 로컬 또는 네트워크로 연결된 애플리케이션 빌드에 압축된 콘텐츠를 제공하기 위한 통합 기능을 제공한다. Hosting Services는 패킹된 콘텐츠를 테스트할 때 반복 속도를 향상시키기 위해 설계되었으며, 로컬 및 원격 네트워크에서 연결된 클라이언트에 콘텐츠를 서비스하는 데도 사용할 수 있다.

Packed mode testing and iteration

Editor Play mode testing에서 platform application build testing트로 전환하면 개발 프로세스에 복잡성과 시간 비용이 발생한다. Hosting Services는 Addressables group configuration에 직접 매핑되는 확장 가능한 편집자 내장 콘텐츠 전송 서비스를 제공한다. custom Addressables profile을 사용하여 Unity Editor 자체에서 모든 콘텐츠를 로드하도록 응용 프로그램을 빠르게 구성할 수 있다. 여기에는 모바일 장치 또는 개발 시스템에 네트워크로 액세스할 수 있는 다른 플랫폼에 구축된 빌드가 포함된다.

Turn-key content server

배치 모드(헤드리스)로 실행하여 인트라넷 및 인터넷 지향 Unity 애플리케이션 클라이언트 모두의 컨텐츠를 호스팅함으로써 서버 환경에 자산 호스팅 서비스를 배포할 수 있다.

Setup

이 자료에는 프로젝트의 에셋 호스팅 서비스의 초기 설정이 자세히 설명되어 있다. 설정 가이드는 편집기 워크플로우에 초점을 맞추고 있지만, API를 사용하여 AddressableAssetSettings 클래스의 HostingServicesManager 속성을 설정하여 호스팅 서비스를 구성할 수 있다.

Configuring a new Hosting Service

호스팅 창을 사용하여 새 호스팅 서비스를 추가, 구성 및 활성화하십시오. Editor에서 Window > Asset Management > Hosting Services를 선택하거나, Addressables 창 메뉴에서 Hosting 버튼을 클릭하여 Hosting 창에 액세스한다.

새 호스팅 서비스를 추가하려면 Add Service 버튼을 클릭하십시오.

표시되는 Add Service dialog에서 미리 정의된 서비스 유형을 선택하거나 사용자 지정 서비스 유형을 정의할 수 있다. 미리 정의된 서비스 유형을 사용하려면 서비스 유형 드롭다운 옵션에서 선택하십시오. Descriptive Name field에 서비스의 이름을 입력하십시오.

참고: 사용자 지정 호스팅 서비스 유형 구현에 대한 자세한 내용은 사용자 지정 서비스 섹션을 참조하십시오.

새로 추가된 서비스는 호스팅 창의 호스팅 서비스 섹션에 나타나며, 기본적으로 비활성화된 상태가 된다. 서비스를 시작하려면 Enable Service button을 클릭하십시오.

HTTP Hosting Service는 시작할 때 자동으로 포트 번호를 할당한다. 포트 번호가 저장되고 Unity 세션 간에 재사용된다. 다른 포트를 선택하려면 [ Port ] 필드에서 특정 포트 번호를 할당하거나 [ Reset ] 단추를 사용하여 다른 포트를 임의로 할당하십시오.

참고: 포트 번호를 재설정하는 경우 전체 애플리케이션 빌드를 실행하여 올바른 URL을 생성 및 포함하십시오.

이제 HTTP Hosting Service가 활성화되어 있으며 각 에셋 그룹의 BuildPath에 지정된 디렉토리에서 콘텐츠를 서비스할 준비가 되어 있다.

Profile setup

개발 중에 Hosting Services와 함께 작업할 때 Unity는 모든 에셋그룹이 해당 목적으로 특별히 작성된 디렉토리 또는 디렉토리를 사용하여 Hosting Service에서 콘텐츠를 로드하도록 구성하는 프로파일을 만들 것을 권장한다.

Addressables window  메뉴(Window > Asset Management >Addressable Assets)에서 Profiles> Inspect Profile Settings를 선택하십시오. AddressableAssetSettings Inspector를 통해 이러한 설정에 액세스할 수도 있다.

다음으로, 새 프로필을 만드십시오. 다음 예에서, 새로운 프로파일은 "Editor Hosted"라고 불린다.

대신 호스팅 서비스에서 로드하도록 loading path fields를 수정하십시오. HttpHostingService는 로컬 IP 주소와 서비스에 할당된 포트를 사용하는 URL이다. 호스팅 창에서 PrivateIpAddress 및 HostingServicePort라는 프로파일 변수를 사용하여 URL을 구성할 수 있다(예: http://[PrivateIpAddress]:[HostingServicePort]).

또한 프로젝트의 에셋 폴더 외부의 공통 디렉터리를 가리키도록 모든 빌드 경로 변수를 수정하십시오.

각 그룹이 올바르게 구성되었는지 확인하십시오. BuildPath 및 LoadPath 경로가 Hosting Services와 함께 사용하도록 수정된 각 프로파일 키로 설정되어 있는지 확인하십시오. 이 예에서는 LoadPath의 프로파일 변수를 확장하여 Hosted Services에서 로드하기 위한 올바른 기본 URL을 구축하는 방법을 볼 수 있다.

마지막으로 Addressables window에서 새 프로필을 선택하고 빌드를 생성한 후 대상 장치에 배포하십시오. 이제 Unity Editor는 HttpHostingService 서비스를 통해 애플리케이션의 모든 로드 요청을 처리한다. 이제 재배치 없이 내용을 추가 및 변경할 수 있다. Addressable content를 재구성하고 이미 배포된 애플리케이션을 다시 시작하여 콘텐츠를 새로 고치십시오.

Batch mode

또한 Hosting Services를 사용하여 배치 모드로 실행되는 Unity Editor의 콘텐츠를 서비스할 수 있다. 이렇게 하려면 다음 옵션을 사용하여 명령줄에서 Unity를 실행하십시오.

-batchMode -executeMethod UnityEditor.AddressableAssets.HostingServicesManager.BatchMode

그러면 기본 AddressableAssetSettings 개체에서 Hosting Services 구성이 로드되며, 구성된 모든 서비스를 시작하십시오.

대체 AddressableAssetSettings 구성을 사용하려면, 고유한 정적 메서드 진입점을 생성하여

UnityEditor.AddressableAssets.HostingServicesManager.BatchMode(AddressableAssetSettings settings) overload

를 통해 호출할 고유한 정적 메서드 진입정을 생성하십시오.

Custom Services

Hosting Services는 확장 가능하도록 설계되어Addressable Assets System의 컨텐츠 로딩 요청을 처리하기 위한 사용자 정의 로직을 구현할 수 있다. 예를 들면 다음과 같다.

* 콘텐츠를 다운로드하는 데 비 HTTP 프로토콜을 사용하는 사용자 지정 IResourceProvider 지원

* 프로덕션 CDN 솔루션(예: Apache HTTP 서버)과 일치하는 콘텐츠를 제공하기 위한 외부 프로세스를 관리하십시오.

Implementing a custom service

HostingServicesManager는 IHostingService 인터페이스를 구현하는 모든 클래스를 관리할 수 있다(메서드 매개 변수 및 반환 값에 대한 자세한 내용은 API 설명서를 참조하십시오.

새 사용자 지정 서비스를 생성하려면:

1. Add Service dialog에 액세스하려면 위의  configuring a new Hosting Service 에 설명된 단계를 수행하십시오.

2. Custom을 선택한 다음 해당 스크립트를 필드에 끌어다 놓거나 개체 선택기에서 선택하십시오. 대화상자는 선택한 스크립트가 IHostingService 인터페이스를 구현하는지 검증한다.

3.서비스 추가를 완료하려면 추가 버튼을 클릭하십시오.

나중에 사용자 지정 서비스가 서비스 유형 드롭다운 옵션에 표시됨

'Unity3D > Addressable Asset' 카테고리의 다른 글

Addressable Assets development cycle  (0) 2020.05.23
Addressable Asset : Getting started  (0) 2020.05.23
Addressable Assets overview(1.8.3)  (0) 2020.05.23
Posted by 퍼니스테이지
Unity3D/Addressable Asset2020. 5. 23. 23:04

Addressable Assets development cycle

Addressable Asset의 주요 이점 중 하나는 컨텐츠를 배열, 빌드 및 로드하는 방법을 분리하는 것이다. 전통적으로 이러한 발전 측면은 서로 강하게 연결되어 있다.

Traditional asset management

만일 당신이 자원 디렉토리에 콘텐츠를 배열한다면, 그것은 기본 어플리케이션에 내장되고 당신은 Resources.Load 메소드를 사용하여 콘텐츠를 로드해야 하며, 자원에 대한 경로를 제공해야 한다. 다른 곳에 저장된 콘텐츠에 액세스하려면 직접 참조 또는 에셋 번들을 사용하십시오. 에셋 번들을 사용할 경우, 부하와 조직 전략을 함께 묶어 경로별로 다시 로드할 수 있다. 에셋 번들이 원격이거나 다른 번들에 종속성이 있는 경우 모든 번들의 다운로드, 로드 및 언로드 작업을 관리하는 코드를 작성해야 한다.

Asset group schemas

스키마는 데이터 집합을 정의한다. 에셋 그룹의 인스펙터에 스키마를 첨부할 수 있다. 그룹에 첨부된 스키마 집합은 빌드가 내용을 처리하는 방법을 정의한다. 예를 들어 포장 모드에서 빌드할 때 BundleAssetGroupSchema 스키마가 연결된 그룹은 에셋 번들의 소스로 작용한다. 스키마 집합을 새 그룹을 정의하는 데 사용하는 템플릿으로 결합할 수 있다. AddressableAssetSettings Inspector를 통해 스키마 템플릿을 추가할 수 있다.

Build scripts

빌드 스크립트는 IDataBuilder 인터페이스를 구현하는 프로젝트에서 ScriptableObject 에셋으로 표현된다. 사용자는 자체 빌드 스크립트를 생성하고 해당 검사기를 통해 AddressableAssetSettings 개체에 추가할 수 있다. Addressables Groups window (Window > Asset Management > Addressables > Groups)에서 빌드 스크립트를 적용하려면 Play Mode Script를 선택하고 드롭다운 옵션을 선택하십시오. 현재 전체 애플리케이션 빌드를 지원하기 위해 구현된 스크립트 3개와 편집기에서 반복하기 위한 Play Mode Script 3개가 있다.

Play mode scripts

Addressable Assets 패키지에는 앱 개발을 가속화하기 위해 재생 모드 데이터를 생성하는 세 가지 빌드 스크립트가 있다.

Use Asset Database (faster)

Asset Database mode (BuildScriptFastMode)를 사용하면 게임의 흐름을 따라 작업할 때 게임을 빠르게 실행할 수 있다. 분석이나 에셋 번들 생성 없이 신속하게 반복할 수 있도록 에셋 데이터베이스를 통해 에셋을 직접 로드한다.

Simulate Groups (advanced)

Simulate Groups mode(BuildScriptVirtualMode)는 에셋 번들을 생성하지 않고 레이아웃 및 종속성에 대한 컨텐츠를 분석한다. 에셋은 번들을 통해 로드된 것처럼 리소스 관리자를 통해 에셋 데이터베이스로부터 로드된다. 게임 실행 중에 번들이 로드되거나 언로드되는 시기를 확인하려면 Addressables Event Viewer 윈도우에서 에셋 사용량을 확인하십시오.(Window > Asset Management > Addressables > Event Viewer).

Simulate Groups mode는 로드 전략을 시뮬레이션하고 컨텐츠 그룹을 조정하여 프로덕션 릴리스에 적합한 균형을 찾도록 도와준다.

Use Existing Build (requires built groups)

 Existing Build mode를 사용하면 배포된 애플리케이션 빌드와 가장 밀접하게 일치하지만 별도의 단계로 데이터를 빌드해야 한다. 에셋을 수정하지 않는 경우 재생 모드로 들어갈 때 데이터를 처리하지 않기 때문에 이 모드가 가장 빠르다. Addressables Groups window(Window > Asset Management > Addressables > Groups) 에서 Build > New Build > Default Build Script를 선택하여 이 모드에 대한 콘텐츠를 빌드하거나,  AddressableAssetSettings.BuildPlayerContent() 메소드를 게임스크립트에서 사용할 수 있다.

Analysis and debugging

기본적으로 Addressable Assets은 경고 및 오류만 기록한다. Player settings window(Edit > Project Settings... > Player)을 열어 상세 로깅을 활성화할 수 있다. Other Settings > Configuration section으로 이동하고, Scripting Define Symbols 필드에 "ADDRESTABLE_LOG_ALL"을 추가한다.

AddressableAssetSettings 개체 Inspector에서 Log Runtime Exceptions 옵션을 선택 해제하여 예외를 비활성화할 수도 있다. 리소스 관리자를 구현할 수 있다.원하는 경우 사용자 고유의 예외 처리기가 있는 ExceptionHandler 속성이지만 이 작업은 주소록이 런타임 초기화를 완료한 후에 수행해야 한다(아래 참조).

Initialization objects

오브젝트들을 Addressable Assets setting에 연결하고 런타임에 초기화 프로세스에 개체를 전달하십시오. CacheInitializationSettings 오브젝트는 런타임에 Unity의 캐싱 API를 제어한다. 고유한 초기화 개체를 생성하려면 IObjectInitializationDataProvider 인터페이스를 구현하는 ScriptableObject를 생성하십시오. 런타임 데이터와 직렬화되는 ObjectInitializationData를 생성하는 것을 담당하는 시스템의 Editor 구성요소 입니다.

Customizing URL Evaluation

런타임에 자산의 경로나 URL(일반적으로 AssetBundle)을 사용자 정의해야 하는 몇 가지 시나리오가 있다. 가장 일반적인 예는 서명된 URL을 만드는 것이다. 다른 하나는 동적 호스트 결정일 수 있다.

아래 코드는 모든 URL에 쿼리 문자열을 추가하는 예:

//Implement a method to transform the internal ids of locations
string MyCustomTransform(IResourceLocation location)
{
    if (location.ResourceType == typeof(IAssetBundleResource) && location.InternalId.StartsWith("http"))
        return location.InternalId + "?customQueryTag=customQueryValue";
    return location.InternalId;
}

//Override the Addressables transform method with your custom method.  This can be set to null to revert to default behavior.
[RuntimeInitializeOnLoadMethod]
static void SetInternalIdTransform()
{
    Addressables.InternalIdTransformFunc = MyCustomTransform;
}

*참고하십시오*: Android 플랫폼에 비디오 파일을 로드할 목적으로 주소록에 비디오 파일을 번들링할 때는 CacheInitializationSettings개체를 생성하고 해당 개체에서 압축 번들을 사용하지 않도록 설정한 다음 아직 없는 경우 AddressableAssetSettings 개체의 초기화 개체 목록에 추가해야 한다.

Content update workflow

Unity는 게임 콘텐츠를 두 가지 범주로 구성할 것을 권장한다.

* Static content  결코 업데이트 하지 않을 컨텐츠

* Dynamic content 업데이트할 것으로 예상되는 컨텐츠

이 구조에서 정적 콘텐츠(Static content)는 애플리케이션(또는 설치 직후 다운로드)과 함께 제공되며 매우 적은 수의 대형 번들로 상주한다. 동적 콘텐츠는 온라인에 저장되며, 각 업데이트에 필요한 데이터 양을 최소화하기 위해 더 작은 번들로 구성된 것이 이상적이다. Addressable Assets 자산 시스템의 목표 중 하나는 스크립트를 변경하지 않고도 이 구조를 쉽게 작업하고 수정할 수 있도록 하는 것이다.

그러나 Addressable Assets System 시스템은 완전히 새로운 애플리케이션 빌드를 게시하지 않으려는 경우에도 "static" 컨텐츠의 변경이 필요한 상황을 수용할 수 있다.

원격 업데이트를 허용하지 않는 경우(예: 현재 대부분의 비디오 게임 콘솔 또는 서버가 없는 게임)에는 매번 완전하고 새로운 빌드를 만들어야 한다는 점에 유의하십시오.

How it works

주소록(Addressables)은 content catalog를 사용하여 주소를 각 에셋에 매핑하여 로딩 위치와 방법을 지정한다. 앱에 매핑을 수정할 수 있는 기능을 제공하려면 원래 앱이 이 카탈로그의 온라인 사본을 알고 있어야 한다.이를 설정하려면 AddressableAssetSettings Inspector에서 Build Remote Catalog setting을 실행하십시오. 이렇게 하면 카탈로그의 복사본이 지정된 경로에 빌드되어 로드될 수 있다. 이 로드 경로는 앱이 일단 출시되면 변경할 수 없다. 컨텐츠 업데이트 프로세스는 이전에 지정된 로드 경로에 있는 파일을 덮어쓰는 새로운 버전의 카탈로그(동일한 파일 이름)를 생성한다.

애플리케이션을 구축하면 고유한 앱 콘텐츠 버전 문자열이 생성되며, 이는 각 앱이 로드해야 하는 콘텐츠 카탈로그를 식별한다. 특정 서버는 충돌 없이 여러 버전의 앱 카탈로그를 포함할 수 있다. 필요한 데이터는 addressable_content_state.bin 파일에 저장한다. 여기에는 StaticContent로 표시된 그룹에 포함된 모든 자산에 대한 해시 정보와 함께 버전 문자열이 포함된다. 기본적으로 이 디렉토리는 Assets/AddressableAssetsData/<플랫폼> 프로젝트 디렉토리에 위치하며, 여기서 <플랫폼>은 당신의 목표 플랫폼이다.

addressable_content_state.bin 파일에는 주소록 시스템의 모든 StaticContent 자산 그룹에 대한 해시 및 종속성 정보가 포함되어 있다. StreamingAssets 폴더에 구축되는 모든 그룹은 StaticContent로 표시해야 하지만 대규모 원격 그룹도 이 지정의 혜택을 받을 수 있다. 다음 단계(콘텐츠 업데이트 준비, 이하 설명) 동안 이 해시 정보는 StaticContent 그룹이 변경된 에셋을 포함하고 있는지 여부를 결정하므로 해당 에셋을 다른 곳으로 이동해야 한다.

Preparing for content updates(컨텐츠 업데이트 준비)

StaticContent 그룹에서 에셋을 수정한 경우 컨텐츠 업데이트 준비 명령(Prepare For Content Update command)을 실행하십시오. 이렇게 하면 정적 그룹(static groups)에서 수정된 에셋이 모두 제거되고 새 그룹으로 이동한다.  new asset groups을 생성하려면:

1. Open the Addressables window in the Unity Editor (Window > Asset Management > Addressable Assets).

2. Addressables window에서 상단 메뉴 모음에서 Build를 선택한 다음 내용  Prepare For Content Update를 선택하십시오.

3. Build Data File dialog에서 addressable_content_state.bin 파일(기본적으로 이 파일은 Assets/AddressableAssetsData Project 디렉터리에 있음)을 선택하십시오.

이 데이터는 응용 프로그램이 마지막으로 구축된 이후 어떤 에셋이나 종속성이 수정되었는지 확인하는 데 사용된다. 이 시스템은 콘텐츠 업데이트 빌드를 준비하기 위해 이러한 에셋을 새로운 그룹으로 이동시킨다.

참고: 이 명령은 모든 변경 사항이  non-static groups에 국한된 경우 아무 것도 수행하지 않는다.

중요: 준비 작업을 실행하기 전에 Unity는 버전 제어 시스템의 분기를 권장한다. 준비 작업을 수행하면 컨텐츠 업데이트에 적합한 방식으로 에셋그룹이 재구성된다. 브랜딩은 다음에 새 플레이어를 발송할 때 선호하는 콘텐츠 배열로 돌아갈 수 있도록 보장한다.

Building for content updates

콘텐츠 업데이트를 위해 빌드하려면:

1. Open the Addressables window in the Unity Editor (Window > Asset Management > Addressable Assets).

2. Addressables window,에서 상단 메뉴에서 Build 를 선택한 다음 Build For Content Update를 선택하십시오.

3. Build Data File dialog에서 기존 응용 프로그램 빌드의 빌드 폴더를 선택하십시오. 빌드 폴더는 addressable_content_state.bin 파일을 포함해야 한다.

빌드는 content catalog, hash file,asset bundles을 생성한다.

생성된 콘텐츠 카탈로그는 선택한 애플리케이션 빌드의 카탈로그와 이름이 동일하여 이전 카탈로그와 해시 파일을 덮어쓴다. 응용 프로그램은 새 카탈로그가 사용 가능한지 확인하기 위해 해시 파일을 로드한다. 시스템은 애플리케이션과 함께 제공되거나 이미 다운로드된 기존 번들에서 수정되지 않은 에셋을 로드한다.

시스템은 addressable_content_state.bin 파일의 컨텐츠 버전 문자열과 위치 정보를 사용하여 자산 번들을 생성한다. 업데이트된 콘텐츠를 포함하지 않는 에셋번들은 업데이트를 위해 선택한 빌드에 있는 것과 동일한 파일 이름으로 작성된다. 에셋번들에 업데이트된 콘텐츠가 포함된 경우, 원본과 공존할 수 있도록 새로운 파일 이름과 함께 업데이트된 콘텐츠가 포함된 새로운 에셋 번들이 생성된다. 새 파일 이름을 가진 에셋번들만 컨텐츠를 호스팅하는 위치에 복사해야 한다.

또한 시스템은 static content용 자산 번들을 구축하지만, Addressables asset  항목이 이를 참조하지 않으므로 컨텐츠 호스팅 위치에 업로드할 필요는 없다.

Content update examples

이 예에서 출시된 애플리케이션은 다음과 같은 그룹을 알고 있다.

이 버전이 라이브이기 때문에, 기기에 Local_Static이 있는 플레이어가 있다. 그리고 원격 번들 중 하나 또는 둘 모두를 로컬로 캐시할 수 있다.

각 그룹(AssetA, AssetL 및 AssetX)에서 하나의 자산을 수정한 다음 컨텐츠 업데이트 준비를 실행하면 이제 로컬 주소 지정 가능 설정의 결과가 다음과 같이 된다.

준비 작업은 실제로 정적 그룹을 편집하며, 이는 역직관적으로 보일 수 있다는 점에 유의하십시오. 그러나 핵심은 시스템이 위의 레이아웃을 구축하지만 정적 그룹에 대한 빌드 결과는 무시한다는 것이다. 이와 같이 선수 입장에서는 다음과 같은 결과를 초래하게 된다.

Local_Static 번들은 이미 플레이어 장치에 있으며, 변경할 수 없다. 이 이전 버전의 AssetA는 더 이상 참조되지 않는다. 대신 플레이어 기기에 데드 데이터로 고정된다.

Remote_Static 번들은 변경되지 않는다. 플레이어의 장치에 아직 캐시되지 않은 경우, 자산M 또는 자산N을 요청할 때 다운로드한다. AssetA와 마찬가지로 이 이전 버전의 AssetL은 더 이상 참조되지 않는다.

Remote_NonStatic 번들은 이제 오래되었다. 서버에서 삭제할 수 있지만 어느 쪽이든 이 시점부터는 다운로드되지 않을 것이다. 캐싱하면 결국 캐시를 떠난다. AssetA 및 AssetL과 마찬가지로 이 이전 버전의 AssetX는 더 이상 참조되지 않는다.

이전 Remote_NonStatic 번들은 해시 파일로 구분되는 새 버전으로 대체된다. 수정된 AssetX 버전이 이 새로운 번들로 업데이트되었다.

content_update_group 번들은 향후 참조될 수정된 에셋으로 구성된다.

이 예제의 의미는 다음과 같다.

1. 변경된 모든 로컬 에셋은 사용자의 기기에서 영구히 사용되지 않은 상태로 남아 있다.

2. 사용자가 이미 비정적 번들을 캐시했으므로 변경되지 않은 에셋(예: AssetY 및 AssetZ)을 포함하여 번들을 다시 다운로드해야 한다. 이상적으로는 사용자가 번들을 캐시하지 않았으며, 이 경우 새로운 Remote_NonStatic 번들을 다운로드하기만 하면 된다.

3. 사용자가 이미 Static_Remote 번들을 캐시했다면 업데이트된 에셋(이 경우 content_update_group을 통한 AssetL)만 다운로드하면 된다. 이것은 이 경우에 이상적이다. 사용자가 번들을 캐시하지 않은 경우, 사용자는 content_update_group을 통해 새로운 AssetL을 다운로드해야 하며, 손대지 않은 Remote_Static 번들을 통해 현재 삭제된 AssetL을 다운로드해야 한다. 초기 캐시 상태에 관계 없이, 사용자는 언제부턴가 장치에 삭제된 AssetL 이 접속되지 않았음에도 불구하고 무한정 캐시된 AssetL 은 액세스되지 않음에도 불구하고 무한정 캐싱된다.

원격 콘텐츠에 대한 최상의 설정은 특정 사용 사례에 따라 달라진다.

'Unity3D > Addressable Asset' 카테고리의 다른 글

Asset Hosting Services  (0) 2020.05.25
Addressable Asset : Getting started  (0) 2020.05.23
Addressable Assets overview(1.8.3)  (0) 2020.05.23
Posted by 퍼니스테이지
Unity3D/Addressable Asset2020. 5. 23. 20:55

Getting started

Installing the Addressable Assets package


중요: 어드레스 가능한 자산 시스템에는 Unity 버전 2018.3 이상이 필요하다.
이 패키지를 설치하려면 패키지 관리자 설명서의 지침을 따르십시오.

Preparing Addressable Assets

Marking assets as Addressable

  • In the object's Inspector.
  • In the Addressables Groups window.

Using the Inspector

프로젝트 창에서 검사자를 볼 자산을 선택하십시오. Inspector에서 Addressable 체크박스를 누르고 자산을 식별할 이름을 입력하십시오.


Marking an asset as Addressable in the Inspector window.


Using the Addressables window

Window > Asset Management > Addressables > Groups to open the Addressables Groups window 를 선택한다.그런 다음 프로젝트 창에서 원하는 자산을 주소록 그룹 창의 자산 그룹 중 하나로 끄십시오.


Marking an asset as Addressable in the Addressables Groups window.


Specifying an address


자산의 기본 주소는 프로젝트의 자산 경로(예: Assets/images/myImage.png)이다. Addressables Groups window에서 자산의 주소를 변경하려면 자산을 마우스 오른쪽 버튼으로 클릭하고 Change Address을 선택하십시오.

주소 지정 가능 자산을 처음 사용할 때 시스템은 프로젝트에 대한 일부 편집 시간 및 런타임 데이터 자산을 버전 제어 체크인에 추가해야 하는 Assets/AddressableAssetsData 파일에 저장한다.



Building your Addressable content


Addressables Asset System 은 응용프로그램을 작성하기 전에 실행 중인 게임에서 사용할 수 있는 파일로 컨텐츠를 작성해야 한다. 이 단계는 자동이 아니다. Editor 또는 API를 통해 이 콘텐츠를 빌드할 수 있다.

  • Editor에서 콘텐츠를 빌드하려면 Addressable Groups 창을 연 다음 Build > New Build > Default Build Script를 선택하십시오.
  • API를 사용하여 컨텐츠를 작성하려면 AddressableAssetSettings.BuildPlayerContent()

Using Addressable Assets

Loading or instantiating by address

런타임에 Addressable Asset을 로드하거나 인스턴스화할 수 있다. 자산을 로드하면 모든 종속성이 메모리에 로드되며(해당되는 경우 자산의 번들 데이터를 포함) 필요할 때 자산을 사용할 수 있다. 이것은 실제로 당신의 현장에 원하는 자산을 투입하지 않는다. 씬(scene)에 자산을 추가하려면 인스턴스화해야 한다. Addressable Asset 인터페이스를 사용하면 자산이 로드된 후 즉시 씬(scene)에 추가된다.

문자열 주소를 사용하여 게임 스크립트에서 자산에 액세스하려면, UnityEngine.AddressableAsset네임스페이스를 선언하고,  다음 메서드를 호출하십시오.

Addressables.LoadAssetAsync<GameObject>("AssetAddress");

이것은 지정된 주소로 자산을 로드한다.


Addressables.InstantiateAsync("AssetAddress");

이렇게 하면 씬(scene)에 지정된 주소로 에셋이 인스턴스화된다.


참고: LoadAssetAsync와 InstantiAsync는 비동기식 작업이다. 자산 로드가 완료되면 콜백을 제공하여 자산과 함께 작업할 수 있다(자세한 내용은 비동기 작동 처리 설명서 참조).


using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;

public class AddressablesExample : MonoBehaviour {

    GameObject myGameObject;

        ...
        Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;
    }

    private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
    {
        // 프로덕션 환경에서는 null 결과와 같은 시나리오를 포착하기 위해 예외 처리를 추가해야 한다.
        myGameObject = obj.Result;
    }
}

Sub-assets and components

하위 자산과 구성요소는 자산 적재를 위한 특별한 경우다.


구성 요소들


주소록을 통해 GameObject의 구성요소를 직접 로드할 수 없다. GameObject를 로드하거나 인스턴스화한 다음 GameObject에서 구성 요소 참조를 검색하십시오. 주소록을 확장하여 구성 요소 로드를 지원하는 방법은 ComponentReference 샘플을 참조하십시오.


하위 자산


이 시스템은 하위 시스템 로드를 지원하지만 특별한 구문이 필요하다. 잠재적인 하위 집합의 예로는 스프라이트 시트의 스프라이트 또는 FBX 파일의 애니메이션 클립이 있다. 스프라이트를 직접 로드하는 예는 당사의 스프라이트 로드 샘플을 참조하십시오.


자산의 모든 하위 개체를 로드하려면 다음 예제 구문을 사용하십시오.

Addressables.LoadAssetAsync<IList<Sprite>>("MySpriteSheetAddress");


자산에 단일 하위 객체를 로드하려면 다음을 수행하십시오: 

Addressables.LoadAssetAsync<Sprite> ("MySpriteSheetAddress[MySpriteName]");


자산 내에서 사용할 수 있는 이름은 main Addressables group editor window창에서 볼 수 있다. 또한 자산 참조를 사용하여 자산의 하위 개체에 액세스할 수 있다. 아래 섹션의 참고 사항을 참조하십시오.


Using the AssetReference class

AssetReference 클래스는 주소를 알 필요 없이 Addressable Assets에 접근할 수 있는 방법을 제공한다. AssetReference 클래스를 사용하여 Addressable Assets에 액세스하려면:


1. Scene 계층 구조 또는 Project 창에서 GameObject를 선택하십시오.

2. Inspector에서 Add Component 버튼을 누른 다음 구성 요소 유형을 선택하십시오. 모든 직렬화 가능한 구성요소는 AssetReference 변수(예: 게임 스크립트, ScriptableObject 또는 기타 직렬화 가능 클래스)를 지원할 수 있다.

3. 구성 요소에 공용 AssetReference 변수 추가(예:public AssetReference explosion;).

4. Inspector에서 프로젝트 창에서 노출된 AssetReference 필드로 에셋을 끌거나 프로젝트에서 이전에 정의된 Addressable Assets(주소 가능 자산) 드롭다운에서 선택하여 개체에 연결할 Addressable Asset을 선택하십시오(아래 참조).


Referencing an Addressable Asset via script component.


AssetReference 에셋을 로드하거나 인스턴스화하려면 해당 메소드를 호출하십시오. 예를 들면 다음과 같다.


AssetRefMember.LoadAssetAsync<GameObject>();

or

AssetRefMember.InstantiateAsync(pos, rot);

참고: 일반적인 어드레스 가능 자산과 마찬가지로 LoadAssetAsync와 InstantiAsync는 비동기식 운영이다. 에셋 로드가 완료되면 콜백을 제공하여 자산과 함께 작업할 수 있다(자세한 내용은 비동기 작동 처리(Async operation handling )설명서 참조).


Sub-assets
하위 에셋(예: SpriteAtlas 또는 FBX)이 포함된 에셋이 AssetReference에 추가된 경우 에셋 자체 또는 하위 에셋을 참조할 수 있는 옵션이 주어진다. 당신이 보는 데 익숙한 하나의 드롭다운은 두 개가 된다. 첫째는 에셋 자체를 선택하고, 둘째는 하위 에셋 선택한다. 두 번째 드롭다운에서 ""를 선택하면 메인 에셋에 대한 참조로 처리된다.

Build considerations

Local data in StreamingAssets
Addressable Asset 시스템은 무엇을 로드하고 어떻게 로드해야 하는지 알기 위해 런타임에 일부 파일을 필요로 한다. 이러한 파일은 주소록 데이터를 빌드할 때 생성되며, 모든 파일이 빌드에 포함된 Unity의 특수 폴더인 StreamingAssets 폴더에 저장된다. 주소록 콘텐츠를 작성하면 시스템이 해당 파일을 라이브러리에 준비한다. 그런 다음 애플리케이션을 빌드할 때 시스템이 필요한 파일을 스트리밍어셋에 복사하고 빌드한 후 폴더에서 삭제한다. 이렇게 하면 각 빌드에 관련 데이터만 포함하면서 여러 플랫폼용 데이터를 빌드할 수 있다.

주소록별 데이터(Addressables-specific data) 외에도, 로컬 사용을 위해 데이터를 작성하는 모든 그룹은 라이브러리 플랫폼별 준비 위치도 사용할 것이다. 이 기능이 작동하는지 확인하려면 [UnityEngine]으로 시작하는 프로필 변수에 대한 빌드 경로 및 로드 경로를 설정하십시오[UnityEngine.AddressableAssets.Addressables.BuildPath] 및 {UnityEngine.AddressableAssets.Addressables.RuntimePath} 각각AddressableAssetSettings 인스펙터 에서 이러한 설정을 지정할 수 있다(기본적으로 이 개체는 프로젝트의 Assets/AddressableAssetsData 디렉토리에 위치함).

Downloading in advance

 Addressables.DownloadDependenciesAsync() 을 호출하는  메서드는 사용자가 전달하는 주소 또는 레이블에 대한 종속성을 로드한다. 일반적으로 이것은 에셋 번들이다.

이 호출로 반환된 AsyncOperationHandle 구조에는 다운로드 진행률을 모니터링하고 표시하는 데 사용할 수 있는 PercentComplete 특성이 포함되어 있다. 콘텐츠가 로드될 때까지 앱에서 대기하도록 할 수도 있다.

다운로드하기 전에 사용자에게 동의를 요청하려면 주소록을 사용하십시오.GetDownloadSize()를 사용하여 지정된 주소 또는 레이블에서 콘텐츠를 다운로드하는 데 필요한 공간을 반환하십시오. 이는 Unity의 자산 번들 캐시에 아직 남아 있는 이전에 다운로드한 번들을 고려한다는 점에 유의하십시오.

미리 앱을 위해 에셋을 다운로드하는 것이 유리할 수 있지만, 그렇지 않은 경우도 있다. 예를 들면 다음과 같다.

* 만약 당신의 앱이 많은 양의 온라인 콘텐츠를 가지고 있고, 당신은 일반적으로 사용자가 그것의 일부분만 상호작용할 것으로 예상한다.
* 기능하려면 온라인으로 연결해야 하는 앱이 있다. 앱의 모든 콘텐츠가 작은 번들로 되어 있는 경우 필요에 따라 콘텐츠를 다운로드하도록 선택할 수 있다.

콘텐츠가 로드될 때까지 기다리는 % 완료 값을 사용하는 대신 사전 로드 기능을 사용하여 다운로드가 시작되었음을 표시한 후 계속 진행하십시오. 이 구현에는 에셋이 필요한 시간까지 로드를 완료하지 못한 경우를 처리하기 위해 로드 또는 대기 화면이 필요하다.

Building for multiple platforms


Addressable Asset 시스템은 애플리케이션 컨텐츠를 구축할 때 Addressable Asset을 포함하는 자산 번들을 생성한다. 에셋 번들은 플랫폼에 의존하므로 지원하려는 모든 고유한 플랫폼에 대해 재구성되어야 한다.

기본적으로 주소록 앱 데이터를 빌드할 때 해당 플랫폼에 대한 데이터는 주소록 빌드 경로의 플랫폼별 하위 디렉터리에 저장된다. 런타임 경로는 이러한 플랫폼 폴더를 설명하며 해당 앱 데이터를 가리킨다.

참고: 주소록 BuildScriptPackedPlayMode 스크립트를 Editor Play 모드에서 사용할 경우 주소록은 현재 활성 빌드 대상에 대한 데이터 로드를 시도한다. 이와 같이 현재 빌드 대상 데이터가 현재 편집기 플랫폼과 호환되지 않을 경우 문제가 발생할 수 있다. 자세한 내용은 재생 모드 스크립트에 대한 설명서를 참조하십시오.

Grouping assets


자산을 모두 하나의 큰 그룹으로 묶기보다는 여러 그룹으로 논리적으로 모으는 것이 좋은 관행이다. 이 방법의 주요 이점은 여러 명의 기여자가 동일한 파일을 편집할 때 버전 제어 시스템(VCS)에서 충돌을 피하는 것이다. 하나의 큰 자산 그룹을 가지면 VCS가 이러한 다양한 변경 사항을 완전히 병합하지 못할 수 있다.


Building scenes that are packed together

Addressable Assets 그룹에서 여러 장면이 있는 빌드를 실행한 후 다음과 같은 경우 해당 장면은 상호의존적이 된다.

프로젝트 창의 포장된 자산에서 그룹의 번들 모드는 함께 포장됨으로 설정되어 있다.
해당 그룹의 씬(scene)은 모두 동일한 자산 레이블을 가지며 번들 모드는 레이블별로 함께 포장되도록 설정됨

이러한 그룹화된 장면 중 하나를 수정한 다음 내용 업데이트 빌드를 수행하면 상호 의존적인 모든 장면이 새 내용 업데이트 그룹으로 함께 이동한다.


Loading Content Catalogs

컨텐츠 카탈로그는 주소록이 시스템에 제공된 키를 기반으로 자산의 물리적 위치를 조회하는 데 사용하는 데이터 저장소다. 기본적으로 주소록은 로컬 주소록 그룹에 대한 로컬 내용 카탈로그를 작성한다. AddressableAssetSettings에서 원격 카탈로그 작성 옵션을 설정한 경우, 원격 주소 지정 그룹의 위치를 저장하기 위해 하나의 추가 카탈로그가 작성된다. 궁극적으로 주소록은 이러한 카탈로그 중 하나만 사용한다. 원격 카탈로그가 구축되어 로컬 카탈로그와 다른 해시를 가지고 있는 경우, 내장 로컬 카탈로그 대신 다운로드, 캐시, 사용하게 된다.


그러나 로드할 추가 내용 카탈로그를 지정할 수 있다. 다른 프로젝트에서 사용하고자 하는 아트 전용 프로젝트 구축과 같이 추가 카탈로그 로딩이 프로젝트에 적합하다고 결정할 수 있는 여러 가지 이유가 있다.


추가 카탈로그를 로드하는 것이 자신에게 적합한 경우 LoadContentCatalogAsync와 관련하여 도움이 될 수 있는 방법이 있다.


LoadContentCatalogAsync의 경우 로드할 카탈로그의 위치를 제공하기만 하면 된다. 그러나 이것만으로는 카탈로그 캐싱을 사용하지 않으므로 원격 위치에서 카탈로그를 로드할 때는 주의하십시오. 카탈로그를 로드해야 할 때마다 해당 WebRequest가 발생함


매번 원격 카탈로그를 다운로드할 필요가 없도록 .hash 파일에 로드 중인 카탈로그와 함께 카탈로그 해시를 제공하면 이를 사용하여 컨텐츠 카탈로그를 올바르게 캐시할 수 있다.

참고: 해시 파일은 같은 위치에 있어야 하며 카탈로그와 이름이 같아야 한다. 경로에 대한 유일한 차이점은 확장이어야 한다.


추가 참고 사항 하나: 이 방법에는 autoReleaseHandle 매개 변수가 함께 제공됨을 알 수 있을 것이다. 시스템이 새 원격 카탈로그를 다운로드하려면 로드하려는 카탈로그를 가리키는 LoadContentCatalogAsync에 대한 사전 호출을 해제해야 한다. 그렇지 않으면 시스템이 작업 캐시에서 컨텐츠 카탈로그 로드 작업을 선택한다. 캐시된 작업을 선택하면 새 원격 카탈로그가 다운로드되지 않는다. true로 설정하면 autoReleaseHandle 매개 변수는 작업이 완료된 후 운영 캐시에 남아 있지 않도록 보장할 수 있다.





'Unity3D > Addressable Asset' 카테고리의 다른 글

Asset Hosting Services  (0) 2020.05.25
Addressable Assets development cycle  (0) 2020.05.23
Addressable Assets overview(1.8.3)  (0) 2020.05.23
Posted by 퍼니스테이지
Unity3D/Addressable Asset2020. 5. 23. 18:35

어드레스 가능한 자산 시스템은 다음 두 가지 패키지로 구성된다.

  • 주소 지정 가능한 자산 패키지(기본 패키지)

  • 스크립트 가능 빌드 파이프라인 패키지(종속성)

주소 지정 가능한 자산 패키지를 설치하면 스크립트 가능 빌드 파이프라인 패키지가 동시에 설치된다. Unity Scriptable Build Pipeline 문서의 최신 버전을 참조하십시오.

 

 

Concepts

이 설명서 전체에서 다음 개념을 참조한다.

  • Address :간편한 런타임 검색을 위한 자산의 위치 식별자.

  • AddressableAssetDatadirectory : 주소 지정 가능한 자산 메타데이터를 프로젝트의 자산 디렉터리에 저장하십시오.

  • Asset group : 빌드 시간 처리에 사용할 수 있는 주소 지정 가능한 자산 집합.

  • Asset group schema : 그룹에 할당하고 빌드하는 동안 사용할 수 있는 데이터 집합을 정의하십시오.

  • AssetReference : 직접 참조처럼 작동하지만 초기화가 지연되는 개체. AssetReference 개체는 GUID를 요청 시 로드할 수 있는 주소 지정으로 저장한다.

  • Asynchronous loading : 게임 코드를 변경하지 않고 개발 과정에서 자산 위치 및 자산의 종속성을 변경할 수 있도록 허용. 비동기 로딩은 어드레스 가능 자산 시스템에 기초한다.

  • Build script : 자산 그룹 프로세서를 실행하여 자산을 패키징하고 리소스 관리자의 주소와 리소스 위치 간의 매핑을 제공하십시오.

  • Label : 유사한 항목의 런타임 로드를 위한 주소 지정 가능한 자산 식별자 추가 제공

     

        (예, Addressables.DownloadDependenciesAsync("spaceHazards"); )

'Unity3D > Addressable Asset' 카테고리의 다른 글

Asset Hosting Services  (0) 2020.05.25
Addressable Assets development cycle  (0) 2020.05.23
Addressable Asset : Getting started  (0) 2020.05.23
Posted by 퍼니스테이지