Version: 2023.2
언어: 한국어
앱 감량
앱 슬라이싱

온디멘드 리소스(On-demand resources)

ODR(온디맨드 리소스)은 iOS 및 tvOS에서 사용할 수 있는 기능으로, 애플리케이션의 크기를 줄일 수 있게 합니다. 애플리케이션 시작 시 필요한 핵심 에셋과 선택 사항 또는 게임의 후반부에 나타나는 에셋을 분리하여 크기를 줄일 수 있습니다. 이러한 추가 에셋은 에셋 번들로 알려져 있으며, 모든 Unity 빌드 타겟에서 사용할 수 있습니다. 하지만 앱 스토어에서 호스팅하려면 추가 단계를 수행하여 이를 활성화해야 합니다.

에셋 번들은 모델, 머티리얼, 텍스처, 씬과 같은 에셋 파일을 포함할 수 있지만 스크립트는 포함할 수 없습니다. 따라서 스크립팅 로직은 메인 애플리케이션에 저장해야 합니다. 권장되는 베스트 프랙티스에서는 에셋 번들의 크기가 최대 64MB입니다. 이렇게 하면 로드 시간을 줄이고 기기에서 사용되는 스토리지 공간을 최소화할 수 있습니다.

온디맨드 리소스 활성화

ODR을 사용하도록 프로젝트를 설정하려면 다음 단계를 따르십시오.

  1. Edit > Project Settings > Player > iOS > Other Settings로 이동합니다.
  2. Configuration 섹션에서 Use on-demand resources를 활성화합니다.

에셋 번들 생성

에셋 번들을 생성하려면 다음 단계를 따르십시오.

  1. 에셋 번들에 추가하려는 에셋을 그룹화하는 새 폴더를 생성합니다. 이를 위해 프로젝트(Project) 창의 Assets 폴더 내부를 오른쪽 클릭하고 Create > Folder로 이동합니다.
  2. 새 폴더에 이름을 지정합니다.
  3. 에셋 번들에 추가하려는 에셋 파일을 선택하고 새 폴더에 드래그합니다.
  4. 새 폴더에 Bundles, ODR, Editor라는 이름의 폴더 3개를 추가로 생성합니다.

에셋 번들에 태그 지정

에셋 번들을 생성할 때는 에셋 번들 다운로드 요청 시 식별할 수 있는 태그를 할당해야 합니다. 번들의 파일 이름과 일치하는 레이블을 생성하는 것이 좋습니다.

태그를 생성하고 할당하려면 다음 단계를 따르십시오.

  1. 에셋을 그룹화할 폴더를 선택합니다.
  2. 인스펙터(Inspector) 창의 Asset Labels 섹션에서 왼쪽 드롭다운 메뉴를 클릭하고 New를 선택합니다.
  3. 새 레이블의 이름을 소문자로 입력합니다.

에셋 번들에 태그 추가

새 에셋 번들 파일을 생성하려면 에디터 스크립트에서 새 레이블을 참조해야 합니다. 에디터 스크립트를 생성하려면 다음 단계를 따르십시오. 1. Editor 폴더를 오른쪽 클릭하고 Create > C# Script를 선택합니다. 1. 새 스크립트의 이름을 BuildiOSAssetBundles로 지정합니다.

BuildiOSAssetBundles.cs를 열고 다음 코드 예시를 복사합니다. 이 예시에서는 textures 레이블을 사용합니다. 레이블 이름을 전체적으로 소문자로 변경합니다.

참고: 이 예시에서는 압축되지 않은 번들을 사용하지만, 앱 감량을 사용하기 위한 필수 조건은 아닙니다.

using UnityEngine;
using UnityEditor;


public class BuildiOSAssetBundles : MonoBehaviour
{
    [InitializeOnLoadMethod]
    static void SetupResourcesBuild( )
    {
        UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
    }

    static UnityEditor.iOS.Resource[] CollectResources( )
    {
        return new UnityEditor.iOS.Resource[]
        {
            new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" ),
            new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" ),
        };
    }

    [MenuItem( "Bundle/Build iOS AssetBundle" )]
    static void BuildAssetBundles( )
    {
        var options = BuildAssetBundleOptions.None;

        bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;

#if UNITY_TVOS
            shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS;
#endif

        if( shouldCheckODR )
        {
#if ENABLE_IOS_ON_DEMAND_RESOURCES
            if( PlayerSettings.iOS.useOnDemandResources )
                options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif

#if ENABLE_IOS_APP_SLICING
            options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
        }

        BuildPipeline.BuildAssetBundles( "Assets/ODR", options, EditorUserBuildSettings.activeBuildTarget );
    }

}

이전 코드 샘플의 다음 줄은 textures 레이블로 태그된 파일을 가져다가 textures라는 이름의 에셋 번들 파일을 Assets/ODR 폴더에 생성합니다.

new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )

이전 코드 예시에서는 다음과 같은 줄을 의도적으로 추가하였습니다. 이는 다른 프로젝트나 서드 파티 판매자가 이미 빌드한 bundle이라는 이름을 가지는 에셋 번들을 추가하는 역할을 합니다.

new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )

이 전체 코드 샘플은 Unity 에디터 메뉴 바에 새 메뉴를 생성합니다. Bundle > Build iOS AssetBundle로 이동하여 ODR 폴더 내에 에셋 번들을 생성합니다.

에셋 번들 로드

에셋 번들을 생성하고 나면 애플리케이션에 로드해야 합니다.

Assets 폴더에 LoadBundle.cs라는 스크립트를 생성하고 다음 코드 예시에 복사합니다. 이 예시 스크립트는 textures ODR 에셋 번들을 다운로드하고 TextureBundle의 공용 구성원에 할당합니다.

using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;

public class LoadBundle : MonoBehaviour
{
    public AssetBundle     TextureBundle;


    void Start( )
    {
        LoadAssetAsync( "textures", "textures" );
    }

    public async Awaitable LoadAssetAsync( string resourceName, string odrTag )
    {
        // Create the request
        using(OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } ))
        {
            // Wait until request is completed
            await request;

            // Check for errors
            if( request.error != null )
                throw new Exception( "ODR request failed: " + request.error );

            TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
        }
    }
}

Xcode 프로젝트 생성

에셋 번들을 생성 및 로드하고 나면 다음 단계를 완료해야 합니다.

  1. Xcode 프로젝트를 생성합니다.
  2. Xcode에서 Build Settings > Assets로 이동합니다.
  3. Embed Asset Packs In Product BundleNo로, Enable On Demand ResourcesYes로 설정합니다.
  4. iOS 앱 스토어 패키지(IPA)를 빌드합니다.
  5. IPA를 App Store Connect의 TestFlight에 업로드합니다.

추가 리소스

앱 감량
앱 슬라이싱