본문 바로가기

유니티/Addressable

[ Addressable ] 05 . Addressable 콘텐츠 업데이트 하기

[ 학습 흐름 ]
  • 콘텐츠 업데이트 빌드를 통해 앱빌드 없이 업데이트를 수행한다 .
  • addressables_content_state.bin의 역할을 파악한다 

[ 콘텐츠 업데이트 빌드 ]

1 . 콘텐츠 업데이트

[ 콘텐츠 업데이트란 ]

- 콘텐츠 업데이트는 원격 어드레서블 콘텐츠를 앱빌드 없이 원격의 번들/카탈로그 교체로 업데이트 하는 기능이다 .

- 쉽게 말해 , 이미 올라간 게임앱은 그대로 두고 , 원격의 번들 / 카탈로그 교체로 콘텐츠를 업데이트 할 수 있다 .

- 콘텐츠 업데이트는 자체 패치 시스템이 있거나 , 원격 콘텐츠 배포를 지원하지 않는 플랫폼에서는 불가하다 .


[ 콘텐츠 업데이트 빌드의 과정 ]

소규모 콘텐츠 업데이트 다이어그램
state.bin 내부에 있는 카탈로그의 이름 (MyCat)

  • 어드레서블은 런타임 초기화에 addressable_content_state.bin을 통해 카탈로그의 내의 업데이트를 확인한다 .
  • 만약 업데이트된 카탈로그가 있다면 , 시스템은 새 카탈로그를 다운하고 에셋로드시 최신버전의 번들을 다운한다 .
  • 이를 통해 , 사용자는 업데이트후 매번 에셋을 다시 다운받을 필요 없이 , 변경된 에셋만을 받아 업데이트 시간을 줄일 수 있다 .
  • 어드레서블은 이를 위해 콘텐츠 업데이트 툴을 제공한다 .

[ addressables_content_state.bin ]

- 해당 파일은 카탈로그 이름을 포함하여, 빌드된 콘텐츠의 다양한 상태 정보를 기록한다 .

- Addressable 시스템은 이 파일을 사용하여 콘텐츠 업데이트 시 변경된 부분만을 효율적으로 처리한다.

- 카탈로그 이름, 번들 해시 값, 리소스 위치 데이터, 종속성 데이터 등 다른 요소를 확인해 콘텐츠 업데이트를 관리한다 .

- Addressable Asset Settings에서 확인해보면 , Content State Build 파일이 생성되는 Path를 지정 가능하다 .

- 기본적으로 플랫폼 별로 나뉘게 처리되어 있다 .

- 플랫폼 별로 다른 state 파일과 catalog를 사용하여 여러 플랫폼에서 관리가 용이하다 .


2 . 콘텐츠 업데이트 빌드하기

[ 콘텐츠 업데이트 하기 ]

- 그룹창에서 Update a Previous Build 를 실행하여 콘텐츠 업데이트가 가능하다 .

- 콘텐츠 카탈로그 / 해시 파일 / 에셋 번들을 생성한다 .

- Update a Previous Build는 실행에 Check for Content Update Restrictions가 포함되어 있다 .

- 그룹창에서 직접 실행도 가능한데 , 해당 툴은 그룹세팅의 Content Update Restriction 스키마에 따라 다르게 작동한다  .

- Content Update Rescriction 스키마의 Prevent Updates 프로퍼티는 다음의 옵션이 존재한다 

  • Enabled: 에셋을 옮기지 않는다. 업데이트 빌드 시 번들에 있는 에셋이 변경된 경우 전체 번들이 다시 빌드됩니다. 즉, 덮어씌운다 .
  • Disabled: 번들에 있는 에셋이 변경된 경우 Check for Content Update Restrictions 툴이 업데이트를 위해 생성한 새 그룹으로 에셋을 옮긴다. 업데이트 빌드를 만들면 이 새 그룹에서 생성된 에셋 번들의 에셋이 기존 번들의 버전을 오버라이드한다 .

[ Prevents Updates ]

프로젝트의 각 그룹에 대해 Update Restriction 스키마는 그룹 및 해당 에셋이 콘텐츠 업데이트에서 처리되는 방식을 결정한다 .

  • Prevent Updates: 활성화시 시스템은 해당 그룹의 에셋을 자주 업데이트하지 않을 것으로 예상되는 정적 콘텐츠로 취급한다 .
  • 모든 로컬 콘텐츠는 이 설정을 사용해야 한다 .

그룹의 콘텐츠 유형과 애플리케이션의 전체 플레이어 빌드 사이에 해당 콘텐츠를 업데이트하려는 빈도에 따라 설정을 선택한다 .

어떤 설정을 선택하든 상관없이 그룹 내 콘텐츠를 변경할 수 있다.

차이점은 Check for Content Update Restrictions  Update Previous Build 툴이 그룹의 에셋을 처리하는 방식과 설치된 애플리케이션이 업데이트된 콘텐츠에 액세스하는 방식이다 .

[!중요] 전체 빌드를 수행하지 않는 한 그룹의 Update Restriction 설정을 변경하면 안된다 . 콘텐츠 업데이트 전에 그룹 설정을 변경하면 어드레서블이 업데이트 빌드에 필요한 올바른 변경 사항을 생성할 수 없다 .


[ Prevent Updates 가 활성화된 경우 ]

 

- 먼저 해당 그룹에 Prevent Updates 가 활성화 되어 있는 경우이다 . 이는 변경예정이 적은 그룹에 적합하다 .

- 위와 같이 Group1에 어드레서블 에셋들을 위치시켰다 .

- 최초 빌드를 실행하면 지정된 경로에 다음과 같이 번들 , 카탈로그가 있음을 볼 수 있다 .

- 해당 그룹내에서 변화가 생겼을 경우 (Cube3 -> NewCube3로 명칭 변경) Update Previous Build를 하면 어떤 결과가 나올까 ?

 

-  Check for Content Update Restrictions툴을 실행시켰을때 다음의 창이 나온다 . 

- Apply Changes를 누르면 위와 같이 Group1에서 있던 수정된 어드레서블 에셋이 Content Update라는 그룹을 생성후 변경후 해당 그룹으로 옮김을 볼 수 있다 .

- 빌드를 실행해보면 해당 그룹에서 새로운 번들이 생성됨을 알 수 있다 .

- 원격 저장소에는 새로 생성된 번들과 카탈로그 / 해쉬만 업로드 하면 된다 .

- 해당 모드를 통해 기존 데이터가 유지된다는 장점이 있지만 관리가 어려워 질 수 있다 .


[ Prevent Updates 가 비활성화된 경우 ]

- 먼저 해당 그룹에 Prevent Updates 가 비활성화 되어 있는 경우이다 . 이는 변경될 예정이 많은 그룹에 적합하다 .

- 해당 그룹내에서 변화가 생겼을 경우 (Cube4 -> NewCube4로 명칭 변경) Update Previous Build를 하면 어떤 결과가 나올까?

- 위와 같이 덮어씌워짐을 볼 수 있다 .

- 이를 통해 관리가 용이함을 알 수 ...

- 지금까지의 설명은 다음 메뉴얼에서 자세한 예시로 볼 수 있다 .

https://docs.unity3d.com/kr/Packages/com.unity.addressables@1.21/manual/content-update-examples.html

 

콘텐츠 업데이트 예시 | Addressables | 1.21.17

콘텐츠 업데이트 예시 여기에서는 콘텐츠 업데이트 중에 어드레서블 콘텐츠가 처리되는 방식을 설명하기 위해 가상의 예제를 살펴봅니다. 이 예제에서는 다음과 같은 어드레서블 그룹으로 빌

docs.unity3d.com


3 . 콘텐츠 업데이트 빌드 설정

[ Update a Previous Build ]

- Addressable Asset Setting 의 Update a Previous Build 에는 다음의 옵션이 있다 .

  • Check For Update Issue :  Check For Content Update Restrictions검사를 자동으로 실행할지 여부와 감지된 문제를 처리하는 방법을 시스템에 알린다 .
  • Content State Build Path : 해당 값은 두가지 목적으로 사용된다 
    • 새로운 콘텐츠 빌드가 addressables_content_state.bin을 저장하는 위치를 표시한다 .
    • Update a Previous Buildaddressables_content_state.bin을 자동으로 가져오려고 시도하는 위치이다.

해당 Path는 서버에서 addressables_content_state.bin을 공유하려는 경우 원격위치가 될 수 도 있다 .

  • 새 콘텐츠 빌드는 bin파일을 ContentUpdateScript.PreviousContentStateFileCachePath에 저장하며, 이는 기본적으로 Library/com.unity.addressables/AddressablesBinFileDownload/이다 .
  • Update a Previous Build는 원격 이전 상태 파일을 ContentUpdateScript.PreviousContentStateFileCachePath에 다운로드하고 일반적인 방식으로 파일을 읽는다. 파일이 원격 위치에 존재하지 않지만 캐시 경로에 파일이 이미 있는 경우 시스템은 로컬 파일을 로드합니다.

[ Unieuq Bundle IDs ]

 

- 애플리케이션 시작 시가 아니라 즉시 콘텐츠를 업데이트하려면 Unique Bundle IDs 설정을 사용한다

- 활성화하면 애플리케이션 세션 도중에 업데이트된 에셋 번들을 더 쉽게 로드할 수 있지만, 일반적으로 빌드 속도가 느려지고 업데이트 용량이 커진다 .

- Unique Bundle IDs 옵션을 활성화하면 원래 번들이 메모리에 남아 있는 동안 에셋 번들의 변경된 버전을 로드할 수 있다.

- 고유한 내부 ID로 에셋 번들을 빌드하면 에셋 번들 ID의 충돌 없이 런타임에 콘텐츠를 쉽게 업데이트할 수 있다.

 

- 하지만 이 기능을 활성화하면 변경된 에셋을 참조하는 에셋이 포함된 모든 에셋 번들도 다시 빌드해야 한다.

- 콘텐츠 업데이트를 위해 더 많은 번들을 업데이트해야 하며 모든 빌드 속도가 느려진다.

- 일반적으로는 어드레서블 시스템이 이미 초기화되고 에셋 로딩을 시작한 후에 콘텐츠 카탈로그를 업데이트할 때만 고유한 번들 ID를 사용하면 된다.

다음 방법 중 하나를 사용하여 에셋 번들 로딩 충돌 및 고유 ID 활성화를 피할 수 있습니다.

  • 어드레서블 초기화의 일부로 콘텐츠 카탈로그를 업데이트한다. 기본적으로 Addressable Asset 설정에서 Only update catalogs manually 옵션을 활성화하지 않는 한 어드레서블은 초기화 시 새 카탈로그를 확인합니다. 이 방법을 선택하면 세션 도중에는 애플리케이션 콘텐츠를 업데이트할 수 없다.
  • 콘텐츠 카탈로그를 업데이트하기 전에 모든 원격 에셋 번들을 언로드한다.
  • 모든 원격 번들과 에셋을 언로드하면 번들 이름 충돌을 방지할 수 있지만, 새 콘텐츠가 로드되기를 기다리는 동안 사용자 세션이 중단될 수 있다

[ 카탈로그 수동으로 관리하기 ]

1 . 카탈로그 수동 관리

[ 카탈로그 수동 관리 옵션 ]

- Only Update catalogs manually 활성화시 런타임에 어드레서블 시스템이 초기화 될 때 원격 카탈로그에 대한 자동확인을 비활성화 할 수 있다 .즉 ,수동으로 관리 할 수 있게 되는 것 .


[ 카탈로그 업데이트 ]

IEnumerator CheckCatalogs()
{
	
    List<string> catalogsToUpdate = new List<string>();
    //CheckForCatalogUpdates로 업데이트가 있는 카탈로그 목록을 가져온다
    AsyncOperationHandle<List<string>> checkForUpdateHandle
        = Addressables.CheckForCatalogUpdates();
    checkForUpdateHandle.Completed += op => { catalogsToUpdate.AddRange(op.Result); };

    yield return checkForUpdateHandle;
	//업데이트가 있는 카탈로그가 있다면
    if (catalogsToUpdate.Count > 0)
    {
    	//업데이트 수행
        AsyncOperationHandle<List<IResourceLocator>> updateHandle
            = Addressables.UpdateCatalogs(catalogsToUpdate);
        yield return updateHandle;
        Addressables.Release(updateHandle);
    }
	//핸들을 Release 하여 메모리 누수 방지 및 리소스 관리
    Addressables.Release(checkForUpdateHandle);
}

- 위 메서드로 카탈로그를 수동으로 업데이트 할 수 있다 .