오늘날 게임은 그 어느 때보다 규모가 커졌습니다. 최신 디바이스 하드웨어의 한계를 계속 탐구함에 따라 개발자는 런타임에 콘텐츠를 효율적으로 관리하는 것이 점점 더 중요해지고 있습니다. 또한 퍼블리셔가 게임의 리텐션과 수익화 지표를 최적화하기 위해 노력함에 따라, 소규모 게임 클라이언트와 동적 OTA 콘텐츠(over-the-air content) 업데이트는 많은 성공적인 게임의 기본 요건이 되었습니다.
유니티는 개발자와 퍼블리셔가 오늘날의 게임 시장에서 성공할 수 있도록 엔드투엔드 파이프라인을 제공합니다. 이러한 파이프라인은 2019년에 출시되어 현재 수천 개의 성공적인 라이브 게임과 수만 개의 개발 중인 게임을 지원하는 Unity 패키지인 어드레서블로 시작하여 어드레서블로 끝납니다.
어드레서블 패키지는 에셋번들에 빌드하고 런타임에 동적으로 로드 및 언로드할 수 있도록 Unity 에셋을 구성하기 위한 사용자 인터페이스(UI)와 API를 제공합니다. 에셋 번들을 기본 게임과 함께 제공하든, 클라우드 콘텐츠 전송과 같은 원격 콘텐츠 전송 네트워크(CDN)에서 호스팅하여 제공하든, 어드레서블은 필요할 때만 필요한 에셋을 로드할 수 있도록 지원합니다.
어드레서블 시스템은 콘텐츠 관리의 여러 측면을 간소화할 수 있지만, “한 번 설정하면 잊어버리는” 기능은 아닙니다.(it’s not a “set it and forget it” feature) 어드레서블 에셋을 구성, 빌드, 로드 및 언로드하는 방법에 대한 선택은 게임의 규모와 성능에 중대한 영향을 미칩니다.
이 가이드에서는 어드레서블 시스템을 최대한 활용할 수 있도록 고려해야 할 가장 중요한 요소 몇 가지를 살펴봅니다. 이 블로그의 마지막에는 일반적인 어드레서블 사용 사례를 기반으로 일반적인 설정과 전략 권장 사항을 제공하는 유용한 '치트 시트'(“cheat sheets”)가 있습니다.
물론 가장 좋은 전략은 제작 중인 게임과 목표에 따라 달라집니다. 이 가이드는 Unity 학습 자료, Unity 매뉴얼 문서, 어드레서블에 대한 커뮤니티 중심 포럼과 함께 참고할 수 있는 참고 자료로 활용하시기 바랍니다.
AssetBundles
어드레서블의 핵심은 에셋 번들을 빌드하고 작업하기 위한 툴입니다. 어드레서블 UI와 API를 살펴보기 전에 에셋 번들 아카이브 파일 형식과 런타임에 미치는 영향에 대해 알아두는 것이 중요합니다.
에셋번들은 모델, 텍스처, 프리팹, 스크립터블 오브젝트, 오디오 클립과 같은 에셋을 포함할 수 있는 대상 플랫폼용으로 제작된 아카이브 파일로, Unity가 런타임에 로드할 수 있는 전체 씬까지 포함할 수 있습니다.
에셋 번들의 핵심 기능은 서로 간의 종속성을 표현할 수 있다는 점입니다. 예를 들어 에셋 번들 1에는 에셋 번들 2의 텍스처에 종속되는 프리팹이 포함될 수 있습니다. 런타임에 어드레서블을 사용하여 프리팹을 로드하면 어드레서블 시스템은 에셋 번들 2와 종속 텍스처를 메모리에 자동으로 로드합니다. 또한 에셋 번들 1에 에셋 번들 3의 에셋에 종속된 다른 에셋이 있는 경우 에셋 번들 3도 메모리에 로드되는 식으로 진행됩니다.
게임이 실행 중일 때 어드레서블 시스템은 위에서 설명한 텍스처와 같은 종속 에셋을 포함한 모든 에셋의 활성 레퍼런스를 추적하여 메모리에 있어야 할 에셋을 결정합니다. 에셋 번들에서 로드된 에셋은 해당 참조 수와 동일한 에셋 번들의 다른 모든 에셋 참조 수가 모두 0이 될 때까지 메모리에서 해제할 수 없습니다. 에셋 번들 자체는 에셋 번들의 모든 에셋 참조 수가 0이 될 때만 메모리에서 해제할 수 있습니다.
어드레서블과 에셋 번들 간의 긴밀한 관계를 염두에 두고 어드레서블 콘텐츠를 구성할 때 가장 중요한 규칙은 함께 로드 및 언로드할 개별 에셋 세트가 포함된 에셋 번들을 생성하는 것입니다.
Addressables groups and bundling strategy
어드레서블을 사용하면서 가장 중요한 결정은 에셋을 어드레서블 그룹으로 구성하는 방법입니다. 다음은 고려해야 할 몇 가지 질문입니다:
- 작은 그룹을 많이 만들 것인가, 아니면 적은 수의 큰 그룹을 만들 것인가?
- 각 그룹에 대해 몇 개의 에셋 번들을 생성할 것인가(즉, 해당 그룹의 에셋을 함께 묶어야 하는가, 개별적으로 묶어야 하는가, 레이블별로 묶어야 하는가)?
- 레이블을 사용해야 하나요?
- 그룹에 로컬 또는 원격 로드 경로를 제공해야 하나요?
하나의 정답을 제시하고 싶지만, 최적의 어드레서블 그룹화 전략은 게임 고유의 여러 요소에 따라 달라질 수 있습니다.
기억하세요: 어드레서블 그룹은 어드레서블 에셋에 대한 조직 구조를 제공하여 에셋 번들에 해당 에셋을 빌드하는 방법을 결정합니다. 따라서 게임의 고유한 구조, 목표 및 제한 사항에 따라 에셋 번들을 가장 효과적으로 패킹, 로드 및 언로드하는 것이 가장 좋은 조직 전략이 될 것입니다.
어드레서블 콘텐츠 구성을 시작하기 전에 다음 사항을 확실히 파악해야 합니다:
1. 게임의 구조와 로드맵
2. 게임의 플랫폼 강점 및 제한 사항
3. 게임 성능 최적화를 위해 어드레서블을 사용하는 주요 목표
아래에서 이러한 각 요소를 살펴보겠습니다.
Game structure and roadmap
가장 먼저 고려해야 할 요소는 게임의 구조와 로드맵입니다.
여기서 '구조'란 게임의 실제 아키텍처를 의미합니다. 플레이어가 예측 가능한 레벨이나 환경을 통해 게임을 진행하는 선형적인 싱글 플레이어 여정인가요? 예측할 수 없는 시점에 인스턴스화될 수 있는 수천 개의 허영 아이템이 있는 멀티플랫폼 PvP 게임인가요? 게임 구조에 따라 에셋을 로드하고 사용할 준비가 된 시기와 메모리에서 에셋과 에셋 번들을 언로드할 수 있는 시기가 결정됩니다.
함께 로드해야 하고 함께 언로드할 수 있는 에셋만 포함된 에셋 번들을 생성하는 것을 잊지 마세요. 게임이 뚜렷한 중단점이 있는 선형 여정인 경우, 어드레서블 그룹을 게임의 각 섹션과 관련된 더 큰 콘텐츠 하위 집합으로 구성하는 것을 고려하세요. 이렇게 하면 해당 에셋을 함께 로드 및 언로드할 수 있습니다.
게임이 비선형적이고 예측하기 어려운 경우, 더 작은 에셋 번들을 생성하는 더 작은 그룹을 선택하여 더 동적으로 로드 및 언로드할 수 있도록 하세요. 에셋을 빠르게 찾고 레이아웃을 최적화할 수 있도록 그룹에 항상 논리적이고 의미 있는 이름을 사용하세요.
“로드맵"은 시간이 지남에 따라 게임이 어떻게 발전할 것인지를 나타냅니다. 게임이 플레이어에게 출시되면 가끔씩 버그 수정이나 게임 밸런스 패치를 제외하고는 대부분 변경되지 않나요? 아니면 플레이어가 대규모 클라이언트 업데이트를 설치할 필요 없이 정기적으로 새로운 콘텐츠를 추가할 예정인가요?
콘텐츠 로드맵은 그룹화 전략을 세우는 데 도움이 됩니다. 게임 콘텐츠가 출시 후 업데이트되지 않고 독립적으로 유지되는 경우에는 위에서 설명한 구조적 고려 사항을 중심으로 그룹화 전략을 세우세요. 게임에 잦은 콘텐츠 업데이트가 필요한 경우 플레이어가 필요할 때 필요한 콘텐츠를 정확하게 다운로드할 수 있는 방식으로 콘텐츠를 그룹화하세요.
게임이 성장함에 따라 시간이 지남에 따라 늘어나는 꾸미기 아이템 세트와 같이 런타임에 함께 필요한 별도의 번들 콘텐츠를 식별하는 데 도움이 되는 레이블을 사용하는 것도 고려하세요. 그룹 설정에서 “레이블별로 묶기” 번들 모드를 사용하여 논리적으로 함께 그룹화한 콘텐츠를 세분화할 수도 있습니다.
예를 들어, 플레이어가 수집할 수 있는 코스튬 아이템이 포함된 새로운 “2023 할로윈” 이벤트를 출시할 계획이라고 가정해 보겠습니다. “2023 할로윈 의상” 그룹에는 ‘모자’, ‘신발’, ‘마스크’ 레이블이 있는 에셋이 포함될 수 있습니다. 그런 다음 이 그룹의 모든 에셋에 “2023 할로윈” 레이블을 추가할 수 있습니다. 이 그룹에 “레이블별로 묶음” 번들 모드를 사용하면 빌드 시점에 세 개의 에셋 번들이 생성됩니다.
그런 다음 런타임에 캐릭터 커스터마이징 화면에서 “Hats” 레이블이 있는 모든 주소 지정 가능 에셋을 로드하여 해당 레이블이 있는 모든 에셋이 다운로드되고 메모리에 로드되어 플레이어가 볼 수 있도록 준비할 수 있습니다. 또는 이벤트 프로모션 페이지에 “Halloween 2023”이라는 레이블이 붙은 모든 주소 지정 가능 에셋을 로드하여 플레이어에게 표시할 준비가 되었는지 확인할 수 있습니다.
게임의 구조와 로드맵을 깊이 이해하면 게임 수명 주기 전반에 걸쳐 도움이 될 콘텐츠 구성에 대한 정보에 입각한 결정을 내리는 데 도움이 됩니다.
다음으로 플랫폼의 구체적인 강점과 한계, 그리고 이것이 콘텐츠 전략에 어떤 의미가 있는지 살펴보겠습니다.
Platform strengths and limitations
다음으로 고려해야 할 요소는 배포를 목표로 하는 플랫폼의 강점과 한계입니다. 이 섹션에서는 어드레서블 유저를 위한 일반적인 플랫폼 타겟과 각 플랫폼에 대한 몇 가지 주요 고려 사항을 간략하게 설명했습니다.
Mobile and VR
모바일 및 VR 플랫폼의 경우 앱 크기, 번들 콘텐츠 크기, 다운로드 속도를 가장 중요하게 고려해야 합니다.
그룹의 경우, 플레이어가 설치 직후에 필요한 콘텐츠 세트(예: 튜토리얼을 완료하는 데 필요한 콘텐츠)를 고려하세요. 이러한 콘텐츠는 기본 게임에 포함될 수 있도록 로컬 로드 경로가 있는 그룹으로 구성하세요. 다른 모든 콘텐츠는 원격 로드 경로가 있는 그룹으로 구성하여 이 콘텐츠를 플레이어에게 무선으로 제공할 수 있도록 합니다.
상대적으로 작은 에셋 번들을 빌드하는 그룹 전략을 선택하세요.(Opt for a group strategy) 정확한 밸런스는 게임에 따라 달라집니다. 상당한 양의 메모리를 소모하고 한 번 로드하면 해제하기 어려운 매우 큰 번들은 피하세요. 마찬가지로 콘텐츠 업데이트 시마다 다운로드되는 매우 큰 어드레서블 카탈로그 파일을 생성할 수 있는 수많은 작은 번들은 피하세요. 또한 많은 작은 번들은 플레이어가 필요한 콘텐츠를 다운로드하는 속도에 영향을 미칠 수 있으므로 게임에 적합한 밸런스를 결정할 때 이러한 장단점을 염두에 두어야 합니다.
Desktop and Consoles
데스크톱과 콘솔의 경우 가장 중요한 고려 사항은 성능입니다. 데스크톱과 콘솔 하드웨어는 모바일 디바이스나 무선 VR 하드웨어에 비해 일반적으로 메모리와 디스크 스토리지에 대한 제약이 적습니다. 이를 염두에 두고 비압축 에셋 번들을(uncompressed AssetBundles) 빌드하는 그룹 설정을 고려해 보세요. 이렇게 하면 로딩 시간이 가장 빨라지고 특정 플랫폼에서 효율적인 패치를 제공할 수도 있습니다.
특히 콘솔용으로 개발할 때는 플랫폼별 캐싱 제한이 적용될 수 있으므로 세심한 주의를 기울여야 합니다. 모바일 플랫폼에서는 다운로드한 콘텐츠에 대해 Unity의 에셋 번들 캐시를 활용할 수 있지만, 특정 콘솔 및 WebGL의 경우 이 기능은 Unity 엔진 수준에서 기본적으로 비활성화되어 있습니다. 무선으로 원격 콘텐츠를 전송하기보다는 해당 플랫폼의 새 콘텐츠로 기본 게임을 업데이트하는 것이 좋습니다. 그렇지 않으면 커스텀 에셋 번들 캐싱 시스템을 직접 생성하고 솔루션이 해당 플랫폼의 서비스 약관을 준수하는지 확인해야 합니다.
Determine primary goals
타겟 플랫폼의 강점과 한계를 평가한(evaluating) 후 어드레서블 시스템을 사용하여 달성하고자 하는 주요 목표 한두 가지를 파악하세요. 예를 들어 기본 게임의 크기를 줄이는 것이 주된 목표인가요, 아니면 플레이어에게 무선 콘텐츠 업데이트를 제공할 계획인가요? 아래에서 이러한 옵션과 그 외 다양한 옵션에 대해 자세히 살펴보겠습니다.
Minimizing base game size
기본 게임의 크기를 최소화하는 것이 주된 목표이고 설치 후 메모리 제한이나 대규모 다운로드에 대해 크게 걱정하지 않는다면 씬과 리소스에서 원격 로드 경로가 있는 하나 이상의 어드레서블 그룹으로 최대한 많은 에셋을 마이그레이션하는 데 중점을 두어야 합니다.
프로젝트의 씬을 어드레서블로 만들고 메인 플레이어 빌드에 포함해야 하는 씬이 있다면 어떤 씬을 포함할지 결정하세요. 설치 후 플레이어에게 전달할 수 있는 씬의 경우 원격 로드 경로가 있는 그룹에 해당 씬을 포함하세요. 이 "오픈 프로젝트 데브로그 동영상(Open Projects Devlog)"에서 설명한 대로 거의 비어 있는 하나의 씬으로 플레이어를 빌드하고 나머지 게임을 거기서 동적으로 로드할 수도 있습니다.
Open Projects Devlog
https://www.youtube.com/watch?v=XIHINtB2e1U
씬을 어드레서블로 설정하는 경우 불필요한 에셋 중복의 가능성과 양을 줄이려면 모든 씬을 어드레서블로 설정하는 것이 가장 좋습니다.
원격으로 호스팅할 에셋 번들을 생성할 그룹의 경우 에셋 번들 캐시를(AssetBundle Cache) 활성화해야 합니다. 이 설정을 사용하면 다운로드한 에셋 번들을 플레이어의 기기에 캐시하여 매 세션마다 다시 다운로드하지 않아도 됩니다.
작은 번들이 많은 경우와 큰 번들이 적은 경우의 런타임 영향을 항상 염두에 두는 것이 좋지만, 이러한 고려 사항은 다른 목표를 고려할 때 더욱 중요해집니다.
Efficiently delivering remote content to players
원격 콘텐츠를 효율적으로 전송하는 것이 주요 목표라면, 그룹 구조에 콘텐츠를 '로컬'(즉, 플레이어 빌드에 포함된 에셋)과 '원격' 콘텐츠(즉, 외부 콘텐츠 전송 네트워크에서 호스팅되는 에셋)로 분할하는 방법을 반영해야 합니다. 다시 한 번 강조하지만, 플레이어의 디바이스에서 다운로드한 콘텐츠를 캐시하려면 에셋 번들 캐시(AssetBundle Cache)를 활성화해야 합니다.
이러한 그룹의 크기, 수, 번들 모드는 플레이어에게 원격 콘텐츠를 언제 제공할지, 다운로드가 완료될 때까지 얼마나 기다리게 할지에 따라 달라집니다. 예를 들어, 게임 구조상 기본 게임을 설치한 직후에 모든 원격 콘텐츠를 제공할 수 있는 경우, 소수의 대규모 다운로드가 발생하는 'Pack Together' 또는 'Pack Together By Label'을 사용하여 더 큰 그룹을 선택할 수 있습니다.
플레이어의 세션에 걸쳐 경험에 방해가 되지 않는 소규모 원격 콘텐츠 세트를 제공하려는 경우, 소규모 그룹 및/또는 훨씬 더 빠르게 다운로드할 수 있는 소규모 에셋 번들을 생성하는 Bundle Mode 설정을 선택할 수 있습니다.
대부분의 경우 원격 콘텐츠가 포함된 그룹의 경우 에셋 번들 주기적 중복 검사(CRC) 옵션에 대해 Enabled, Excluding Cached(활성화됨, 캐시 제외 )를 고려하세요. 이렇게 하면 플레이어의 장치에 캐시되는 원격 콘텐츠의 무결성을 추가로 보장하는 동시에 이미 플레이어 장치에 있는 콘텐츠를 로드하기 위해 CRC를 수행해야 하는 추가 오버헤드를 피할 수 있습니다.
Optimizing runtime memory usage and performance
게임의 런타임 성능과 메모리 사용량을 최적화하는 것이 주요 목표라면, 어드레서블 그룹 구성의 가장 중요한 규칙을 기억하세요: 동시에 로드 및 언로드하려는 에셋은 함께 그룹화해야 합니다.
일반적으로 이는 더 작은 에셋 번들을 생성하는 것을 의미합니다. 게임에서 항상 동시에 필요하지 않은 에셋이 포함된 큰 그룹에 대해서는 그룹 설정에서 “Pack Together” Bundle Mode를 사용하지 않거나 더 작은 그룹을 만드는 등 여러 가지 방법으로 이를 달성할 수 있습니다.
또한 런타임 성능을 주시하여 잠재적인 문제나 최적화 영역을 파악하는 데 도움이 되도록 해야 합니다. Unity 프로파일러, 메모리 프로파일러 패키지, 어드레서블 이벤트 뷰어와 같은 공식 Unity 툴을 활용하면 게임 성능을 최적화하는 데 도움이 될 수 있습니다.
곧 출시될 어드레서블 이벤트 뷰어를 대체할 Addressables Profiler Module도 기대해 주세요. 이 새로운 툴은 에셋과 에셋 번들 간의 종속성에 대한 자세한 정보를 포함하여 코드가 어드레서블 에셋과 에셋 번들을 로드 및 언로드하는 방식에 대한 더욱 심층적인 정보를 제공합니다.
Addressables Profiler module
https://docs.unity3d.com/Packages/com.unity.addressables@2.3/manual/ProfilerModule.html
Multiple goals
물론 대부분의 프로젝트에는 어드레서블과 관련된 여러 가지 목표가 있을 것입니다. 이 경우 모든 프로젝트에 적용할 수 있는 정답은 없습니다. 위에서 설명한 장단점을 평가하고 정의한 성공을 가장 잘 달성할 수 있는 그룹 구조와 설정을 찾아야 합니다.
어드레서블 빌드 보고서와 어드레서블 1.21.3에서 곧 제공될 어드레서블 프로파일러 모듈을 활용하는 것이 좋습니다. 어드레서블 빌드 보고서는 파일 크기, 중복 가능성, 심층적인 종속성 정보 등 어드레서블 빌드에서 생성된 에셋 번들에 대한 자세한 정보를 제공합니다. 어드레서블 프로파일러 모듈은 이 새로운 종속성 데이터를 활용하는 새로운 런타임 분석 툴로, 어드레서블 코드에서 로드된 항목과 로드된 이유에 대한 정확한 정보를 제공합니다.
Cheat sheets: Common use cases
아래에서는 가장 일반적인 사용 사례를 바탕으로 권장되는 어드레서블 설정 및 전략에 대한 몇 가지 편리한 '치트 시트'를 제공했습니다. 물론 이는 단지 제안일 뿐이며, 제안이 프로젝트의 고유한 구조와 특정 목표에 부합하는지 여부는 사용자가 결정해야 합니다.
- 콘텐츠 업데이트가 잦은 모바일 게임
- 독립형, 독립형 데스크톱 또는 콘솔 게임
- 메타 퀘스트 2용으로 제작된 VR 게임
Addressables: Planning and best practices
원본 문서
https://unity.com/blog/engine-platform/addressables-planning-and-best-practices
'유니티 엔진 (Unity Engine)' 카테고리의 다른 글
[Unity C#] Editor 에서 버튼 스타일 토글 UI 만들기 (0) | 2025.03.14 |
---|---|
[Unity] Rigidbody, AddForce() 공식 문서 한글 번역 (2) | 2024.12.28 |
[Unity C#] 파일 경로 분리와 경로 구분자 변환: 두 가지 접근법 비교 (0) | 2024.12.06 |
유니티 엔진 라이트맵 베이커 Bakery의 Texels per unit 이란? (0) | 2024.06.03 |
[Unity] Timeline 을 구성하는 PlayableGraph의 Playable 구성 샘플 (0) | 2024.05.30 |
[Unity] ScriptableWizard 클래스로 간단하게 커스텀 툴, 에디터 창 만들기 (0) | 2024.05.15 |
[Unity] 후처리 효과 : 앰비언트 오클루젼 - Post Processing Effects: Ambient Occlusion (0) | 2024.05.14 |