-
StoreKit과 백그라운드 애셋으로 게임 내 콘텐츠 활용하기
Steam Asset Converter와 앱 내 구입을 지원할 수 있는 새로운 Unity 플러그인을 사용하여 크로스 플랫폼 개발을 간소화하세요. 필요한 것만 제공할 수 있는 언어별 애셋 팩으로 게임을 더 가볍게 만들고 멋진 플레이어 경험을 선사하는 방법을 알아보세요.
챕터
- 0:01 - Introduction
- 0:33 - Background Assets
- 1:35 - Localized asset packs
- 3:14 - Convert Steam depots to asset packs
- 4:15 - Unity plug-ins
- 5:52 - StoreKit and Background Assets sample code
- 8:25 - Game presence
- 9:10 - Next steps
리소스
관련 비디오
WWDC26
WWDC25
Meet with Apple
WWDC22
-
비디오 검색…
안녕하세요, StoreKit 팀의 엔지니어 Sam입니다 이 세션에서는 새로운 도구들을 Apple 플랫폼에서 최고의 게임을 만드는 방법을 다룹니다 먼저 Background Assets 업데이트를 살펴보겠습니다 그런 다음 새로운 Unity 플러그인을 훌륭한 앱 내 구입 경험을 제공하는 방법을 소개합니다 마지막으로 App Store와 Apple Games 앱에서의 홍보 방법을 살펴봅니다 Background Assets 업데이트부터 시작하겠습니다
제가 작업 중인 "The Coast"라는 앱이 있습니다 다양한 레벨이 가득한 풍성한 게임입니다 게임 콘텐츠 외에도 오디오, 비디오, 텍스처, 머신러닝 모델 등 많은 에셋이 포함되어 있습니다 하지만 이런 에셋들은 특정 순간에만 필요합니다 모든 에셋을 미리 다운로드해 저장 공간을 차지하는 대신 Managed Background Assets로 시간과 저장 공간을 절약하세요 시스템이 필요할 때 에셋 팩을 자동으로 다운로드해 플레이어에게 훌륭한 게임 경험을 제공합니다 App Store 앱의 경우 Apple이 앱당 최대 200GB의 에셋을 호스팅하며 개발자 프로그램 멤버십에 포함되어 있습니다 Apple-Hosted Background Assets는 iOS부터 지원됩니다 iPadOS, macOS, tvOS, visionOS 26도 포함됩니다 설정 및 API 통합에 대한 자세한 내용은 다음 세션을 확인하세요 WWDC25의 "Discover Apple-Hosted Background Assets" iOS 27에서 Managed Background Assets는 더욱 강력해집니다 지역화된 에셋 팩과 함께요 지역화된 에셋 팩은 에셋 크기를 크게 줄여줍니다 플레이어가 다운로드할 시스템이 플레이어의 기본 설정 언어를 파악하고 설정에서 선택된 언어를 확인해 해당 언어의 게임 에셋만 제공하기 때문입니다 사용자가 선택한 언어의 에셋 팩이 없는 경우 시스템이 자동으로 가장 유사한 언어로 전환합니다
"The Coast"에서는 영어를 기본 언어로 설정했고 프랑스어와 독일어도 지원됩니다 지역화된 에셋 팩이 없으면 시스템이 모든 에셋을 플레이어 기기에 설치합니다 에셋 팩을 지역화하면 독일어를 시스템 언어로 설정한 플레이어의 경우 독일어 에셋 팩만 기기에 설치됩니다 에셋 팩 지역화로 게임에 필요한 저장 공간이 크게 줄어듭니다
영국 영어를 시스템 언어로 선택하면 시스템은 영국 영어 에셋 팩이 제공되지 않음을 파악합니다 대신 선호 언어의 기본 에셋 팩이 사용됩니다 이 경우 미국 영어가 기본값입니다 다른 예로, 스페인어를 시스템 언어로 선택하면 "The Coast"는 스페인어 에셋 팩을 제공하지 않고 유사한 지역 변형도 없습니다 이 경우 시스템은 앱의 기본 언어로 전환합니다 바로 영어입니다
게임에서 지역화된 에셋 팩을 지원하려면 에셋 팩 매니페스트 JSON 파일에 언어 태그를 추가하세요
Steam에서 게임을 빌드하는 경우 이미 depot으로 게임 에셋을 관리하고 있을 수 있습니다 Steam depot을 에셋 팩으로 손쉽게 변환할 수 있습니다 Apple 플랫폼 게임과 함께 배포하는 것도 가능합니다 macOS에서 Steam 에셋 변환기를 사용하려면 Xcode 27을 설치하고 커맨드라인에서 xcrun ba-package convert를 실행하세요 세 가지 인수를 전달합니다 에셋 팩 ID, 해당하는 경우 언어 ID 그리고 원하는 다운로드 정책입니다
Steam 매니페스트 빌드 스크립트를 입력으로 전달하면 지정한 이름의 에셋 팩 매니페스트가 출력됩니다 같은 도구가 곧 Linux와 Windows에서도 제공됩니다
에셋 팩 매니페스트를 생성하면 ba-package를 다시 실행해 에셋 팩 아카이브를 생성하세요 새 매니페스트 파일을 입력으로 사용해 에셋 팩 아카이브가 출력됩니다
패키징된 에셋 팩 아카이브를 게임에서 바로 사용할 수 있습니다 Unity로 개발하는 경우 Background Assets 업데이트도 활용할 수 있습니다 새로운 플러그인 두 가지를 소개합니다 Apple Unity 플러그인 포트폴리오에 새롭게 추가됩니다 Background Assets와 StoreKit입니다 Apple Unity 플러그인을 사용하면 게임에서 최신 기능과 Apple 플랫폼의 게임 서비스를 활용할 수 있습니다
Background Assets와 StoreKit 플러그인은 지금 다운로드할 수 있습니다 GitHub의 기존 Apple 플러그인과 함께 제공됩니다 리포지터리는 이 세션의 리소스에서 찾을 수 있으며 플러그인 빌드 및 설치 방법도 안내되어 있습니다
새로운 Unity 플러그인을 다운로드하면 동일한 Python 스크립트로 빌드할 수 있습니다 다른 Apple Unity 플러그인을 빌드할 때 사용하는 것과 같습니다 두 새 플러그인 모두 C# 기반 Unity API를 제공합니다 이 API는 기본 네이티브 프레임워크로의 브릿지 역할을 합니다
플러그인을 빌드, 패키징, 테스트하려면 Xcode 27, Python 3, Unity 2022 LTS 이상을 사용하세요 다음 Meet with Apple 세션을 확인하세요 "Chart your game's course to Apple platforms" 다른 Apple Unity 플러그인으로 프로젝트를 설정하고 구성하는 방법을 알아볼 수 있습니다 게임 빌드 모범 사례는 WWDC22의 "Plug-in and play: Add Apple frameworks to your Unity game projects"를 확인해 보세요
프로젝트에 플러그인을 설치하면 Unity 에디터에서 게임을 여세요
프로젝트에 StoreKit을 적용하면 모든 Apple 플랫폼에서 전 세계 플레이어에게 다가가고 앱 내 구입을 제공하며 App Store의 안전하고 신뢰할 수 있는 결제 플랫폼을 이용할 수 있습니다
StoreKit API의 C# 버전은 일반적인 흐름에 대한 접근을 제공합니다 Product API로 앱 내 구입 상품을 가져오고 표시하는 등 Product API를 활용할 수 있습니다 게임 내 상품에 대한 구입을 시작할 수도 있습니다 Purchase API를 사용해 시스템 결제 시트를 표시하세요 구입 후 PurchaseResult를 사용해 구입 성공 여부를 확인하고 트랜잭션의 IsVerified도 확인하세요 그런 다음 구입한 콘텐츠를 플레이어에게 전달하고 Finish()를 호출해 트랜잭션을 완료하세요
게임 라이프사이클 전반에 걸쳐 Transaction.Updates 시퀀스로 새 트랜잭션을 수신하세요 이 시퀀스를 통해 트랜잭션이 전송됩니다 시스템이 트랜잭션을 생성하거나 업데이트할 때마다 앱 외부나 다른 기기에서 발생하는 경우도 포함됩니다 여기에 OnUpdate 핸들러가 있습니다 앱 시작 시 트랜잭션 업데이트 리스너 내부에서 호출됩니다 소모성 아이템의 경우 먼저 트랜잭션이 취소되지 않았는지 확인하고 고객에게 접근 권한을 부여합니다 비소모성 아이템과 구독의 경우 currentEntitlements가 기준이 됩니다 고객이 받을 자격이 있는 항목의 기준입니다 이미 환불, 취소, 만료 상태를 필터링하며 비소모성 아이템과 구독에 적용됩니다 트랜잭션이 확인되면 고객에게 접근 권한을 부여할 수 있습니다 마지막으로 verifiedTransaction에서 Finish()를 호출하세요
플레이어가 콘텐츠를 구입하면 Background Assets 플러그인을 사용해 에셋 팩을 로컬에서 사용할 수 있는지 확인하고 플레이어에게 콘텐츠를 제공하기 시작하세요 다운로드가 필요한 경우 다운로드 진행 상황을 모니터링하고 게임 UI를 업데이트할 수 있습니다 상태 업데이트를 반복하면서 DownloadStatusUpdatesAsync 메서드가 yield하는 업데이트를 활용하세요
새 플러그인으로 게임을 구성한 후 Xcode로 프로젝트를 내보내고 강력한 테스팅 기능을 활용하세요 Xcode의 StoreKit Testing과 Background Assets 목 서버도 포함됩니다 Xcode에서 StoreKit Testing을 설정하려면 StoreKit 구성 파일을 만들고 테스트 상품을 추가하세요 그런 다음 타겟의 스킴을 편집하고 Run을 선택해 드롭다운에서 StoreKit 구성 파일을 선택하세요 여기서 폴더도 선택할 수 있습니다 목 서버가 게임에 전송할 패키징된 에셋 팩이 저장된 폴더입니다
이제 빌드하고 실행할 준비가 되었습니다 Xcode 27에서 프로젝트를 실행하면 Background Assets 목 서버가 자동으로 시작되고 디버그 세션에 연결됩니다 게임에서 에셋을 제공합니다 샌드박스 테스팅도 사용 가능해 사용자 경험을 테스트할 수 있습니다 App Store Connect에서 설정한 상품과 함께요 App Store에 게임을 제출할 준비가 되면 상품 페이지 헤더와 검색 결과에 새 시각적 요소를 추가해 게임을 돋보이게 하세요 App Store 검색 결과에 추가하는 이미지와 비디오는 Apple Games 앱에도 표시됩니다 게임을 시각적으로 더욱 돋보이게 할 수 있습니다 WWDC26의 "Enhance your presence on the App Store"를 확인하세요 이러한 에셋 구성 방법을 자세히 알아볼 수 있습니다
마지막으로, 게임이 출시되고 플레이어가 새 콘텐츠를 구입하면 iOS 27의 새롭게 디자인된 시스템 결제 시트를 사용합니다 가로 모드에서도 잘 작동합니다 콘텐츠를 잠금 해제하고 계속 게임을 즐길 수 있습니다 마무리하기 전에 개발 워크플로우를 개선하기 위한 다음 단계를 살펴보겠습니다 플레이어를 위한 더욱 훌륭한 게임 경험을 만드세요
앱 크기를 더욱 줄이고 플레이어에게 콘텐츠를 효율적으로 전달하려면 App Store Connect에서 지역화된 에셋 팩 버전을 업로드하세요 네이티브 Managed Background Assets와 StoreKit API를 Unity 게임에 적용하려면 새로운 Apple Unity 플러그인을 설치하세요 게임 업데이트가 완료되면 기능을 홍보하는 방법을 계획하세요 App Store와 Apple Games 앱에서 새로운 이미지와 비디오 에셋을 활용하세요 처음 시작하든 오랜 작업을 기반으로 개발하든 이 새 기능들로 전 세계 수백만 플레이어에게 다가갈 수 있습니다 Apple 플랫폼에서요 함께해 주셔서 감사합니다 게임을 다음 단계로 발전시켜 보세요
-
-
3:06 - Asset pack manifest for a localized asset pack
// Asset pack manifest { "assetPackID": "voice-english", "downloadPolicy": { /* … */ }, "language": "en-US", "sourceRoot": ".", "fileSelectors": [ /* … */ ], "platforms": [ /* … */ ] //… } -
3:27 - Convert a Steam depot to an asset pack manifest
# Convert a Steam depot to an asset pack manifest xcrun ba-package convert --asset-pack-id voice-english -l en-US --on-demand voice-english.vdf -o voice-english.json -
3:28 - Convert an asset pack manifest to an asset pack archive
# Convert an asset pack manifest to an asset pack archive xcrun ba-package voice-english.json -o voice-english.aar -
5:52 - Fetch and purchase products with the StoreKit plug-in
// Fetch and purchase products with the StoreKit plug-in using UnityEngine; using Apple.StoreKit; async void Start() { var products = await Product.FetchProducts(new[] { "com.thecoast.capecod" }); } -
6:01 - Fetch and purchase products with the StoreKit plug-in
// Fetch and purchase products with the StoreKit plug-in using UnityEngine; using Apple.StoreKit; async void Purchase(Product product) { var result = await product.Purchase(); if (result.Result == PurchaseResult.ResultEnum.Success && result.TransactionVerification.IsVerified) { // Unlock access to purchased content result.TransactionVerification.SafePayload.Finish(); } } -
6:23 - Listen for Transaction updates with the StoreKit plug-in
// Listen for Transaction updates with the StoreKit plug-in using UnityEngine; using Apple.StoreKit; public static class TransactionListener { public static void Initialize() => Transaction.Updates += OnUpdate; async void OnUpdate(VerificationResult<Transaction> result) { if (!result.IsVerified) return; var verifiedTransaction = result.SafePayload; // Consumables are not in CurrentEntitlements, so handle them inline if (verifiedTransaction.ProductType == ProductType.ProductTypeEnum.Consumable) { if (verifiedTransaction.RevocationDate != null) { // Revoke the consumable identified by verifiedTransaction.ProductId } else { // Grant access to the consumable } }else { // Non-consumables and subscriptions: re-read CurrentEntitlements as source of truth await foreach (var verificationResult in Transaction.GetCurrentEntitlements()) { if (!verificationResult.IsVerified) continue; // Grant access to the product } } verifiedTransaction.Finish(); } } -
7:13 - Download asset packs with the Background Assets plug-in
// Download asset packs with the Background Assets plug-in using Apple.BackgroundAssets; using UnityEngine; async void LoadTutorial(string language) { try { string assetPackId = $"tutorial-{language}"; AssetPackManifest manifest = await AssetPackManager.GetManifestAsync(); AssetPack assetPack = manifest.GetAssetPack(assetPackId); CancellationTokenSource tokenSource = new CancellationTokenSource(); _ = Task.Run(async () => { await foreach (AssetPackManager.DownloadStatusUpdate statusUpdate in AssetPackManager.DownloadStatusUpdatesAsync(assetPackId)) { // Update download progress in UI } }, tokenSource.Token); await AssetPackManager.EnsureLocalAvailabilityOfAssetPackAsync(assetPack); tokenSource.Cancel(); // Start tutorial with the locally available assets } catch (Exception exception) { // Handle the exception } }
-
-
- 0:01 - Introduction
New tools for building games on Apple platforms: updates to Background Assets, new Unity plug-ins for In-App Purchase, and ways to enhance your presence on the App Store and Apple Games app.
- 0:33 - Background Assets
Apple-Hosted Managed Background Assets save players time and storage by downloading asset packs only when needed. Now with Apple-hosting, up to 200 GB per app is included in the Developer Program.
- 1:35 - Localized asset packs
Localized asset packs greatly reduce the size of assets that players need to download by allowing the system to identify the player’s preferred language selected in Settings and only deliver assets for your game in that language.
- 3:14 - Convert Steam depots to asset packs
Learn how to bring your Steam depots into asset pack manifests and asset pack archives to ship along with your game on Apple platforms.
- 4:15 - Unity plug-ins
Two new Apple Unity plug-ins: Background Assets and StoreKit expose C# APIs that bridge to the native frameworks. Build and test with Xcode 27, Python 3, and Unity 2022 LTS or later.
- 5:52 - StoreKit and Background Assets sample code
Examples of how to use the C# version of the native StoreKit and Background Assets APIs in your game.
- 8:25 - Game presence
Make your game stand out with new visuals for your product page header and search results.
- 9:10 - Next steps
Ways to go further — upload localized asset packs in App Store Connect to reduce app size, adopt new Unity plug-ins, and highlight features with new image and video assets in the App Store and Apple Games app.