Unity 검색

Addressables: Planning and best practices | Hero image
Addressables: Planning and best practices | Hero image
공유

최근에 출시되는 게임들은 이전에 비해 규모가 훨씬 큰 편입니다. 이러한 게임들이 최신 기기 하드웨어의 역량을 최대한으로 활용하면서, 개발자의 효율적인 런타임 콘텐츠 관리 능력이 점점 더 중요해지고 있습니다. 또한 퍼블리셔가 게임의 리텐션과 수익화 지표의 최적화를 추구하면서, 소규모 게임 클라이언트와 동적 무선 콘텐츠 업데이트는 게임의 성공을 위한 기본 요건이 되었습니다.

유니티는 개발자와 퍼블리셔가 최신 게임 시장에서 성공을 거둘 수 있도록 포괄적인 파이프라인을 제공합니다. 이 파이프라인은 2019년에 출시되었으며 현재 수천 개의 성공적인 라이브 게임과 수만 개의 개발 중인 게임을 지원하는 Unity 패키지Addressables에 모두 담겨 있습니다.

Addressables 패키지는 AssetBundle에 구축하고 런타임에 동적으로 로드 및 언로드하도록 Unity 에셋을 구성하기 위한 UI(사용자 인터페이스)와 API를 제공합니다. AssetBundle은 기본 게임과 함께 제공될 수도 있고 Cloud Content Delivery와 같은 원격 CDN(콘텐츠 제공 네트워크)에서 호스팅하는 방식으로 제공될 수도 있으며, 어떤 방식이든 Addressables는 필요한 에셋을 필요한 때에만 로드하도록 지원합니다.

Addressables 시스템으로 콘텐츠 관리의 여러 측면을 간소화할 수 있지만 , 단순히 한 번의 설정으로 끝나는 기능은 아닙니다. 어드레서블 에셋을 어떻게 구성, 구축, 로드, 언로드할지에 대한 선택에 따라 게임의 규모와 성능에 중대한 영향을 미칠 수 있습니다.

이번 가이드에서는 Addressables 시스템을 최대한 활용하기 위해 고려해야 하는 가장 중요한 몇 가지 요소를 살펴봅니다. 이 블로그 게시글의 마지막 부분에는 일반적인 Addressables 사용 사례를 바탕으로 일반 설정과 전략 권장 사항을 소개하는 참고 자료가 포함되어 있습니다. 유용하게 활용해 보세요.

물론 최적의 전략은 개발 중인 게임과 목표에 따라 달라질 수 있습니다. 이 가이드는 Unity Learn 자료, Unity 매뉴얼 기술 자료, 커뮤니티 기반 Addressables 포럼과 함께 하나의 참고 자료로 활용하시기 바랍니다.

AssetBundle

Addressables는 근본적으로 AssetBundle을 사용하여 구축하고 작업하기 위한 툴입니다. Addressables UI와 API에 대해 자세히 알아보기 전에, AssetBundle 아카이브 파일 형식과 런타임 영향에 대해 알아 두어야 합니다.

AssetBundle은 일종의 컨테이너로 볼 수 있습니다. AssetBundle은 타겟 플랫폼용으로 제작된 아카이브 파일로, 모델, 텍스처, 프리팹, 스크립터블 오브젝트, 오디오 클립 등의 에셋뿐만 아니라 Unity가 런타임에 로드할 수 있는 전체 씬도 포함할 수 있습니다.

AssetBundle의 주요 특징은 각 에셋 간의 종속성을 표현할 수 있는 점입니다. 예를 들어 AssetBundle 1에 AssetBundle 2의 텍스처에 종속된 프리팹이 있다고 가정해 보겠습니다. 런타임에 Addressables를 사용하여 프리팹을 로드하면, Addressables 시스템은 자동으로 AssetBundle 2와 종속 텍스처를 메모리에 로드합니다. 그리고 AssetBundle 1에 AssetBundle 3의 에셋에 종속된 다른 에셋이 있다면, AssetBundle 3도 메모리에 로드되는 식입니다.

Diagram of AssetBundle 1 and its dependencies on AssetBundles 2 and 3 from the example in the paragraph above
위 단락의 예시에 나온 AssetBundle 1과 AssetBundles 2 및 3에 대한 종속성 다이어그램

게임이 실행 중일 때 Addressables 시스템은 위에서 설명한 텍스처와 같은 종속된 에셋을 포함하여 모든 에셋의 활성 레퍼런스를 트래킹해서 메모리에 있어야 할 에셋을 결정합니다. AssetBundle에서 로드된 에셋은 에셋의 레퍼런스 수동일한 AssetBundle 내 다른 모든 에셋의 레퍼런스 수가 0이 될 때까지 메모리에서 해제되지 않습니다. AssetBundle 자체는 AssetBundle의 모든 에셋 레퍼런스 수가 0일 때만 메모리에서 해제할 수 있습니다.

Addressables와 AssetBundle의 긴밀한 관계를 염두에 두고, Addressables 콘텐츠를 구성할 때 가장 중요한 규칙은 같이 로드하거나 언로드할 개별 에셋 세트를 포함하는 AssetBundle을 만들어야 한다는 것입니다.

Addressables 그룹 및 번들 전략

Addressables를 사용할 때 정해야 하는 가장 중요한 결정은 에셋을 Addressables 그룹으로 구성하는 방식입니다. 몇 가지 고려해야 할 사항은 다음과 같습니다.

  • 작은 그룹을 많이 만들 것인가요, 아니면 큰 그룹을 적게 만들 것인가요?
  • 각 그룹별로 몇 개의 AssetBundle을 생성할 것인가요(해당 그룹의 에셋을 함께, 개별적으로 또는 레이블별로 패킹할지 여부)?
  • 레이블을 사용할 것인가요?
  • 그룹에 로컬 또는 원격 로드 경로를 부여할 것인가요?

한 가지 방법으로 모두 해결할 수 있으면 좋겠지만, 최적의 Addressables 그룹화 전략은 게임이 가진 특유의 요소에 따라 달라질 수 있습니다.

Addressables 그룹은 어드레서블 에셋에 대한 구성 구조를 제공하며, 이는 해당 에셋이 어떻게 AssetBundle에 구축될 것인지를 결정한다는 사실을 유념하세요. 따라서 가장 좋은 구성 전략은 게임 고유의 구조, 목표, 한계에 따라 AssetBundle을 가장 효율적으로 패킹, 로드, 언로드하는 것입니다.

Addressables 콘텐츠를 구성하기 전에 다음 사항을 정확하게 파악하고 있어야 합니다.

  1. 제작하는 게임의 구조와 로드맵
  2. 타게팅하는 게임 플랫폼의 강점과 한계점
  3. Addressables를 사용해 게임 성능을 최적화하여 달성하려는 최우선 목표

각 요소를 아래에서 자세히 살펴보겠습니다.

게임의 구조와 로드맵

가장 먼저 고려할 사항은 게임의 구조와 로드맵입니다.

여기에서 '구조'란 게임의 실제 아키텍처를 말합니다. 플레이어가 예측 가능한 레벨이나 환경을 통과하며 선형적으로 진행되는 싱글플레이어 게임인가요? 수천 가지의 데코 아이템이 예측 불가능한 시점에 인스턴스화될 수 있는 멀티플랫폼 PvP 게임인가요? 게임의 구조에 따라 에셋을 로드해서 사용할 수 있는 시점과 메모리에서 에셋과 AssetBundle을 언로드할 수 있는 시점이 결정됩니다.

함께 로드해야 하고 함께 언로드할 수 있는 에셋들로만 구성된 AssetBundle을 생성하는 편이 바람직합니다. 분명한 중단점이 존재하는 선형적인 경험의 게임이라면, Addressables 그룹을 게임의 각 섹션과 관련된 더 큰 규모의 콘텐츠 부분 집합으로 구성하는 것이 좋습니다. 그렇게 하면 해당 에셋을 함께 로드하고 언로드할 수 있습니다.

선형적이지 않고 예측 불가능하게 진행되는 게임인 경우, 상대적으로 작은 AssetBundle을 생성하는 작은 그룹을 사용하면 에셋을 더 동적으로 로드하고 언로드할 수 있습니다. 빠르게 에셋을 찾고 레이아웃을 최적화할 수 있도록 그룹에 항상 논리적이고 유의미한 이름을 지정해야 합니다.

'로드맵'이란 시간이 지나며 게임이 전개되는 방식을 의미합니다. 게임을 출시하고 나면, 가끔 버그 수정이나 게임 밸런스 패치를 제공하는 것 외에는 게임의 대부분을 변경하지 않을 예정인가요? 아니면 플레이어가 대규모 클라이언트 업데이트를 설치하게 하지 않고도 정기적으로 새로운 콘텐츠를 추가할 예정인가요?

콘텐츠 로드맵은 그룹화 전략을 세우는 데 도움이 됩니다. 게임 콘텐츠를 독립적으로 유지하고 출시 후에 업데이트하지 않을 예정이라면, 위에서 설명한 구조적 고려 사항을 중심으로 그룹화 전략을 세워야 합니다. 반면 게임 콘텐츠를 자주 업데이트할 예정이라면, 플레이어가 원할 때 정확히 필요한 콘텐츠를 다운로드할 수 있도록 콘텐츠를 그룹화해야 합니다.

시간이 지나고 게임의 성숙도가 높아지면서 점차 확장되는 데코 아이템 세트처럼, 런타임에 함께 필요한 여러 번들의 콘텐츠를 식별할 수 있도록 레이블을 사용해 보세요. Groups Settings에서 'Pack Together By Label' 번들 모드를 사용해 논리적으로 그룹화한 콘텐츠를 세분화할 수도 있습니다.

예를 들어, 플레이어가 수집할 수 있는 데코 아이템이 포함된 새로운 'Halloween 2023' 이벤트를 시작하려 한다고 가정해 보겠습니다. 'Halloween 2023 Outfits' 그룹에는 'Hats', 'Shoes', 'Masks' 등의 레이블이 지정된 에셋이 포함될 것입니다. 그러면 이 그룹에 있는 모든 에셋에 'Halloween 2023'이라는 레이블을 추가할 수 있습니다. 이 그룹에 'Pack Together By Label' 번들 모드를 사용하면 빌드 시 세 개의 AssetBundle이 생성됩니다.

그런 다음 런타임에 캐릭터 커스터마이즈 화면에서 'Hats' 레이블이 있는 모든 어드레서블 에셋을 로드하면 해당 레이블이 지정된 모든 에셋을 다운로드하고, 메모리에 로드하여, 플레이어에게 보이도록 할 수 있습니다. 또는 이벤트 프로모션 페이지에서 'Halloween 2023' 레이블이 지정된 모든 어드레서블 에셋을 로드하여 플레이어에게 보이도록 할 수도 있습니다.

이 간단한 예시에서는 Halloween 2023 그룹이 'Pack Together By Label' 번들 모드를 사용하며 세 개의 AssetBundle을 생성합니다. 'Halloween 2023' 레이블이 지정된 모든 어드레서블 에셋을 로드하면 세 개의 AssetBundle과 해당 콘텐츠가 모두 로드됩니다. 'Hats' 레이블을 로드하면 AssetBundle 1과 해당 콘텐츠만 로드됩니다.

제작하는 게임의 구조와 로드맵을 구체적으로 파악하고 있으면 정확한 정보를 기반으로 콘텐츠 구성에 대한 결정을 내릴 수 있으며, 이는 게임의 라이프사이클 전반에 많은 이점을 제공할 것입니다.

이제 플랫폼 특유의 장점과 한계 및 그러한 요소가 콘텐츠 전략에 어떤 영향을 주는지 살펴보겠습니다.

플랫폼별 강점과 한계점

고려해야 할 다음 요소는 게임을 배포할 타겟 플랫폼이 가지는 장점과 한계입니다. 이 섹션에서는 Addressables 사용자를 위한 일반적인 타겟 플랫폼과 각 플랫폼별 주요 고려 사항 몇 가지를 정리했습니다.

모바일 및 VR

모바일 및 VR 플랫폼에서 가장 중요한 고려 사항은 앱의 크기, 번들 콘텐츠 크기, 다운로드 속도입니다.

그룹의 경우, 플레이어가 앱을 설치한 직후에 필요한 콘텐츠 세트를 그룹화하는 것이 좋습니다(예: 튜토리얼을 완료할 수 있도록). 해당 콘텐츠는 기본 게임에 포함되도록 로컬 로드 경로가 있는 그룹으로 구성해야 합니다. 다른 모든 콘텐츠는 원격 로드 경로가 있는 그룹으로 구성하여 플레이어에게 콘텐츠를 무선으로 제공하세요.

상대적으로 작은 AssetBundle을 만드는 그룹화 전략을 선택하세요. 이러한 규모의 정확한 균형은 게임에 따라 다릅니다. 지나치게 큰 규모의 번들은 많은 양의 메모리를 소모하고 한 번 로드한 후에는 해제하기 어려우므로 가급적이면 지양하도록 하세요. 마찬가지로 너무 많은 수의 아주 작은 번들도 지양해야 합니다. 콘텐츠 업데이트마다 매번 다운로드되는 Addressables 카탈로그 파일의 크기가 너무 커질 수 있기 때문입니다. 작은 번들이 많으면 플레이어가 필요한 콘텐츠를 다운로드하는 속도에도 영향을 줄 수 있으므로, 게임에 맞는 규모를 정할 때 이러한 장점과 단점을 고려해야 합니다.

데스크톱 및 콘솔

데스크톱과 콘솔에서 가장 중요하게 고려해야 하는 요소는 성능입니다. 모바일 기기와 무선 VR 하드웨어에 비하면 데스크톱과 콘솔 하드웨어는 메모리와 디스크 용량에 제약이 별로 없습니다. 이 점을 고려하여 압축되지 않은 AssetBundle을 만드는 그룹 설정을 사용해 보세요. 그러면 로딩 시간을 최소로 줄일 수 있고 특정 플랫폼에서 효율적으로 패치를 적용할 수 있습니다.

특히 콘솔용 게임을 개발하는 경우에는 플랫폼에 따라 적용될 수 있는 캐싱 제한 사항에 특히 주의해야 합니다. 모바일 플랫폼의 경우 다운로드한 콘텐츠에 Unity의 AssetBundle Cache를 활용할 수 있지만, 특정 콘솔과 WebGL의 경우 이 기능이 Unity 엔진 단에서 기본적으로 비활성화됩니다. 그러한 플랫폼에서는 원격 콘텐츠를 무선으로 제공하는 대신 새로운 콘텐츠로 기본 게임을 업데이트하는 것이 좋습니다. 그렇지 않으면 자체적으로 커스텀 AssetBundle 캐싱 시스템을 만들고 솔루션이 해당 플랫폼의 서비스 약관을 준수하는지 확인해야 합니다.

최우선 목표 결정

타겟 플랫폼의 장점과 한계를 파악했다면, Addressables 시스템을 사용해 달성하려는 1~2개의 최우선 목표를 정해야 합니다. 예를 들면 기본 게임의 크기를 줄이는 것이 주된 목표일 수도, 플레이어에게 무선 콘텐츠 업데이트를 제공하는 것이 주된 목표일 수도 있습니다. 아래에서 이러한 옵션 및 기타 내용을 자세히 알아보세요.

기본 게임 크기 최소화

최우선 목표가 기본 게임 크기의 최소화이고 메모리 제한이나 설치 후 대용량 다운로드 등을 고려하지 않아도 된다면, 최대한 많은 에셋을 씬과 리소스에서 원격 로드 경로가 있는 하나 이상의 Addressables 그룹으로 마이그레이션하는 것에 초점을 맞춰야 합니다.  

프로젝트의 씬을 어드레서블로 설정하는 것을 고려해 보고, 메인 플레이어 빌드에 포함해야 하는 씬이 있는지, 있다면 어떤 씬인지 결정하세요. 설치 후에 플레이어에게 제공해도 되는 씬이 있다면, 해당 씬은 원격 로드 경로가 있는 그룹에 포함합니다. 이 Open Projects Devlog 동영상에서 설명하는 대로, 거의 비어 있는 하나의 씬에서 플레이어를 구축하고 게임의 나머지 부분은 동적으로 로드할 수도 있습니다.

Diagram of hypothetical build contents from a project that has included only an “Initialization” scene built into the base game, with two main gameplay scenes, “Beach” and “Forest,” packed into AssetBundles to be loaded when needed, and a number of other AssetBundles for assets that will be needed across multiple scenes
기본 게임에 'Initialization' 씬만 구축되어 있고, 두 개의 메인 게임플레이 씬인 'Beach'와 Forest'는 필요할 때 로드하도록 AssetBundle로 패킹하고, 다른 세 개의 씬('Persistent Managers', 'Gameplay', 'Main Menu')은 자체 AssetBundle로 패킹하고, 여러 씬에 필요한 스크립터블 오브젝트는 하나의 AssetBundle로 패킹한 프로젝트의 콘텐츠 빌드 다이어그램

씬을 어드레서블로 설정하려 한다면, 불필요한 에셋이 중복될 가능성과 그 양을 줄일 수 있도록 모든 씬을 어드레서블로 설정하는 것이 최선입니다.

원격으로 호스팅할 AssetBundle을 생성하는 그룹의 경우 AssetBundle Cache를 활성화해야 합니다. 이 설정을 사용하면 다운로드된 AssetBundle이 플레이어의 기기에 캐시되어, 각 세션을 다시 다운로드하지 않도록 합니다.

많은 수의 작은 번들과 적은 수의 큰 번들 사이에서 항상 런타임 영향을 고려하는 것이 좋지만, 이러한 고려 사항은 다른 목표를 고려할 때 중요도가 더 높아집니다.

플레이어에게 원격 콘텐츠를 효율적으로 제공

최우선 목표가 원격 콘텐츠를 효율적으로 제공하는 것이라면 그룹 구조에 콘텐츠를 '로컬'(즉, 플레이어 필드에 포함된 에셋) 및 '원격'(즉, 외부 콘텐츠 제공 네트워크에서 호스팅되는 에셋) 콘텐츠로 분할하는 방법을 반영해야 합니다. 다시 강조하지만, AssetBundle Cache를 활성화하여 다운로드된 콘텐츠를 플레이어의 기기에 캐시하도록 하세요.

이러한 그룹의 크기, 수, 번들 모드는 플레이어에게 원격 콘텐츠를 제공할 시기와 다운로드가 완료될 때까지 플레이어가 기다리는 시간에 따라 달라집니다. 예를 들어 기본 게임을 설치한 직후에 모든 원격 콘텐츠를 제공할 수 있는 게임 구조인 경우, Pack Together 또는 Pack Together By Label을 선택하여 상대적으로 큰 그룹을 사용할 수 있습니다. 그러면 대용량 다운로드가 적게 발생합니다.

세션 내내 경험에 방해가 되지 않는 소규모 원격 콘텐츠 세트를 플레이어에게 제공하려는 경우, 더 작은 AssetBundle을 생성하는 소규모 그룹이나 번들 모드 설정을 사용할 수 있습니다. 그러면 훨씬 빠르게 콘텐츠를 다운로드할 수 있습니다.

대부분의 경우에는 원격 콘텐츠가 있는 그룹에서 AssetBundle CRC(Cyclic Redundancy Check) 옵션을 Enabled, Excluding Cached로 설정하는 것이 좋습니다. 그러면 플레이어의 기기에 캐시되는 원격 콘텐츠의 무결성을 추가로 보장할 수 있을 뿐만 아니라, 이미 플레이어 기기에 있는 콘텐츠를 로드하기 위해 CRC를 수행하는 추가 오버헤드를 피할 수 있습니다.

런타임 메모리 사용량 및 성능 최적화

최우선 목표가 게임의 런타임 성능과 메모리 사용량을 최적화하는 것이라면 동시에 로드, 언로드하려는 에셋은 같은 그룹으로 지정해야 한다는 Addressables 그룹 구성의 가장 중요한 규칙을 염두에 두세요.

일반적으로 이는 상대적으로 작은 AssetBundle을 생성한다는 의미인데, 여러 방식으로 이 규칙을 준수할 수 있습니다. 상대적으로 작은 그룹을 만들 수도 있고, 게임에서 동시에 필요하지 않은 경우도 있는 에셋이 포함된 큰 그룹의 경우 Group Settings에서 'Pack Together' 번들 모드를 사용하지 않도록 선택할 수도 있습니다.

잠재적인 문제나 최적화 영역을 더 잘 발견할 수 있도록 항상 런타임 성능을 주시해야 합니다. Unity Profiler, Memory Profiler 패키지, Addressables Event Viewer 등의 공식 Unity 툴을 활용하면 게임 성능을 최적화하는 데 도움이 될 수 있습니다.

Addressables Event Viewer를 대체할 Addressables Profiler Module이 곧 출시될 예정이니 많이 기대해 주세요. 이 신규 툴은 에셋과 AssetBundle 사이의 종속성에 대한 자세한 정보를 비롯해, 코드가 어드레서블 에셋과 AssetBundle을 로드 및 언로드하는 방식에 대해 심층적인 정보를 제공합니다.

다양한 목표

대부분의 프로젝트에는 Addressables와 관련하여 다양한 목표가 있을 것입니다. 하지만 모든 사례에 적용할 수 있는 단 하나의 만능 방식이란 없습니다. 위에서 설명한 장단점을 평가하고, 원하는 수준의 성과를 달성하는 데 가장 효과적인 그룹 구조와 설정을 찾아 보세요.

어드레서블 빌드 보고서와 Addressables 1.21.3에서 곧 공개될 Addressables Profiler Module을 활용하는 것이 좋습니다. 어드레서블 빌드 보고서는 파일 크기, 중복 가능성, 구체적인 종속성 정보 등 Addressables 빌드에서 생성된 AssetBundle에 관한 자세한 정보를 제공합니다. Addressables Profiler Module은 새로운 종속성 데이터를 활용하는 새로운 런타임 분석 툴로, Addressables 코드에 의해 로드된 에셋과 그 이유에 관하여 정확한 정보를 제공합니다.

참고 자료: 일반적인 사용 사례

아래는 가장 일반적인 사용 사례를 바탕으로 권장하는 Addressables 설정과 전략을 소개하는 몇 가지 유용한 참고 자료입니다. 물론 제안 사항일 뿐이며, 제안하는 내용이 프로젝트의 고유한 구조와 구체적인 목표에 맞는지 여부는 각자의 판단으로 결정해야 합니다.

Addressables 패키지에 대해 궁금한 점이 있거나 패키지를 자세히 알아보려면 Addressables 포럼을 방문하세요. Twitter에서 @Unity_Jeff로 직접 연락하셔도 됩니다. 연재 중인 Tech from the Trenches 시리즈에서 다른 Unity 개발자들의 새로운 기술 블로그도 확인해 보시기 바랍니다.

2023년 2월 8일 엔진 & 플랫폼 | 20 분 소요
관련 게시물