유니티 Addressables 문서 번역 1장 개요 및 시작
유니티/Addressables/유니티 문서/번역/
Addressables 1.21.12 기준 작성
Addressables 시스템은 응용 프로그램의 콘텐츠를 조직화하고 패키징하기 위한 도구와 스크립트, 그리고 런타임에서 에셋을 로드하고 해제하는 API를 제공합니다.
에셋을 "Addressable"로 지정하면 해당 에셋의 주소를 사용하여 어디에서든 로드할 수 있습니다. 해당 에셋이 로컬 응용 프로그램에 있는지 아니면 콘텐츠 전달 네트워크에 있는지에 상관없이 Addressable 시스템이 해당 에셋을 찾아서 반환합니다.
Addressables 시스템을 도입하여 프로젝트를 다음과 같은 영역에서 개선할 수 있습니다:
Addressables 시스템에 대한 소개는 Simplify your content management with Addressables 문서를 참조하세요.
NOTE : Addressables 시스템은 Unity의 AssetBundles을 기반으로 구축됩니다. 자체적으로 자세한 관리 코드를 작성하지 않고 AssetBundles을 프로젝트에서 사용하려면 Addressables를 사용해야 합니다.
Addressables 패키지를 설치해야 합니다. 이를 위해서는 에셋에 주소를 할당하고 런타임 로딩 코드를 리팩터링해야 합니다. 자세한 내용은 Addressables 시스템으로 업그레이드하기를 참조하세요.
Addressables를 프로젝트 개발 중 어느 시점에서든 통합할 수는 있지만, Unity는 새로운 프로젝트에서는 가능한 한 빠른 시점부터 Addressables를 사용하도록 권장합니다. 이렇게 하면 개발 중에 불필요한 코드 리팩터링과 콘텐츠 계획 변경을 피할 수 있습니다.
이 문서에서는 기존 프로젝트를 수정하여 Addressable 에셋의 장점을 활용하는 방법에 대해 다룹니다.
Addressables 시스템 이외에도 Unity는 몇 가지 "전통적인" 방법으로 에셋을 참조하고 로드할 수 있습니다:
씬 데이터 (Scene Data): 씬에 직접 추가하거나 씬의 컴포넌트에 추가하는 에셋으로, 응용 프로그램이 자동으로 로드합니다. Unity는 직렬화된 씬 데이터와 씬에서 직접 참조하는 에셋을 하나의 아카이브로 패키징하여 빌드된 플레이어 응용 프로그램에 포함합니다. "Addressable"이 아닌 씬에서 Addressable 에셋을 사용하는 방법은 Converting Scenes 및 Using Addressable assets in non-Addressable Scenes를 참조하세요.
프리팹 (Prefab) : GameObject 및 컴포넌트를 사용하여 생성하고 씬 외부에 저장하는 에셋입니다. Prefab 변환에 대해서는 Converting Prefabs를 참조하세요.
Resources 폴더: 프로젝트의 Resources 폴더에 배치하고 Resources API를 사용하여 로드하는 에셋입니다. Unity는 Resources 파일에 있는 에셋을 하나의 아카이브로 패키징하여 빌드된 플레이어 응용 프로그램에 포함합니다. Resources 아카이브는 씬 데이터 아카이브와 별개입니다. Resources 폴더에 대한 변환 방법은 Converting Resources folders를 참조하세요.
AssetBundle: AssetBundle에 패키지화하고 AssetBundle API로 로드하는 에셋입니다. AssetBundle 변환에 대해서는 Converting AssetBundles를 참조하세요.
StreamingAssets: StreamingAssets 폴더에 배치하는 파일입니다. Unity는 StreamingAssets 폴더에 있는 모든 파일을 빌드된 플레이어 응용 프로그램에 그대로 포함합니다. StreamingAssets에 있는 파일에 대해서는 Files in StreamingAssets를 참조하세요.
Addressables를 사용하여 빌드된 콘텐츠는 해당 Addressables 빌드에서 빌드된 다른 에셋을 참조합니다. Addressables 및 Scene 데이터 및 Resource 폴더를 통해 Player 빌드에 포함된 사용되거나 참조되는 콘텐츠는 둘 다 로드될 경우 디스크 및 메모리에서 중복으로 발생합니다. 이 제한으로 인해 권장되는 모범 사례는 모든 Scene 데이터 및 Resource 폴더를 Addressables 빌드 시스템으로 변환하는 것입니다. 중복으로 인한 메모리 오버헤드를 줄이고 Addressables를 사용하여 모든 콘텐츠를 관리할 수 있도록 합니다. 콘텐츠를 로컬 또는 원격으로 사용하고 업데이트 가능하도록 Content Update 빌드를 통해 콘텐츠를 관리할 수 있게 됩니다.
프로젝트에 Addressables를 통합하는 가장 쉬운 방법은 씬을 빌드 설정 목록에서 제거하고 해당 씬을 Addressable로 만드는 것입니다. 응용 프로그램 시작 시 Unity가 로드하는 한 가지 씬이 목록에 있어야 합니다. 이를 위해 아무런 기능이 없이 첫 번째 Addressable 씬을 로드하는 새로운 씬을 만들 수 있습니다.
씬을 변환하는 방법은 다음과 같습니다:
이 시점에서 씬에 있는 모든 에셋을 Addressable 그룹에 포함시키고, Addressables 시스템은 Addressables 콘텐츠를 빌드할 때 해당 에셋을 AssetBundle로 패키징합니다. 모든 씬에 하나의 그룹만 사용하는 경우 런타임 로딩 및 메모리 성능은 프로젝트의 Addressables 적용 이전과 거의 동일할 것입니다.
이 시점에서 씬에 있는 모든 에셋을 Addressable 그룹에 포함시키고 Addressables 시스템은 Addressables 콘텐츠를 빌드할 때 해당 에셋을 AssetBundle로 패키징합니다. 모든 씬에 하나의 그룹만 사용하는 경우 런타임 로딩 및 메모리 성능은 프로젝트의 Addressables 적용 이전과 거의 동일할 것입니다.
이제 하나의 큰 Addressable 씬 그룹을 여러 그룹으로 분할할 수 있습니다. 어떻게 분할하는 것이 가장 좋을지는 프로젝트의 목표에 따라 다를 수 있습니다. 계속 진행하기 전에 각각의 씬을 독립적으로 로드하고 언로드할 수 있도록 해당 씬을 자체 그룹으로 이동할 수 있습니다. 이 과정에서 중복된 에셋을 확인하기 위해 Analyze 도구를 사용할 수 있습니다. 두 개의 다른 번들에서 참조하는 에셋의 중복을 피하기 위해 해당 에셋 자체를 Addressable로 만드는 것이 좋습니다. 공유 에셋을 고유한 그룹으로 이동하여 AssetBundle 간의 상호 의존성을 줄이는 것도 좋은 방법입니다.
Addressable 에셋을 Addressable로 만들지 않고도 Scene 데이터의 일부로 사용하려면 AssetReferences를 통해 가능합니다.
사용자 지정 MonoBehaviour 또는 ScriptableObject 클래스에 AssetReference 필드를 추가하면 Unity 에디터에서 직접 참조로 에셋을 할당하는 방식과 유사하게 해당 필드에 Addressable 에셋을 할당할 수 있습니다. 주요 차이점은 AssetReference 필드에 할당된 에셋을 로드하고 해제하기 위해 클래스에 코드를 추가해야 한다는 것입니다(Unity는 Scene에서 객체를 인스턴스화할 때 직접 참조를 자동으로 로드합니다).
NOTE : 비-Addressable Scene의 UnityEngine 컴포넌트의 필드에는 Addressable 에셋을 사용할 수 없습니다. 예를 들어, 비-Addressable Scene의 MeshFilter 컴포넌트에 Addressable 메시 에셋을 할당하면 Unity는 해당 Scene에 대해 Addressable 버전의 메시 데이터를 사용하지 않습니다. 대신, Unity는 메시 에셋을 복사하고 두 가지 버전의 메시를 응용 프로그램에 포함시킵니다. 하나는 메시를 포함하는 Addressable 그룹을 위해 빌드된 AssetBundle에 있고, 다른 하나는 비-Addressable Scene의 내장 Scene 데이터에 있습니다. (Addressable Scene에서 사용될 때, Unity는 메시 데이터를 복사하지 않고 항상 AssetBundle에서 로드합니다.)
사용자 정의 클래스에서 직접 참조를 AssetReference로 대체하려면 다음 단계를 따르세요:
Addressable 에셋을 로드하는 방법에 대한 자세한 내용은 "Loading Addressable assets"를 참조하세요.
프리팹을 Addressable 에셋으로 변환하려면 해당 프리팹의 Inspector 창에서 Addressables 옵션을 확인하거나 Addressables 그룹 창에서 해당 그룹으로 끌어옵니다.
Addressable Scene에서 사용할 때는 항상 프리팹을 Addressable로 만들 필요는 없습니다. Addressables는 Scene 계층 구조에 추가하는 프리팹을 Scene의 AssetBundle에 포함되는 데이터의 일부로 자동으로 포함합니다. 그러나 한 개 이상의 Scene에서 프리팹을 사용하는 경우, 각 Scene마다 프리팹 데이터가 중복되지 않도록 프리팹을 Addressable 에셋으로 만들어야 합니다. 또한 런타임에서 프리팹을 동적으로 로드하고 인스턴스화하려면 프리팹을 Addressable로 만들어야 합니다.
NOTE : 만약 프리팹을 Addressable하지 않은 Scene에서 사용한다면, Unity는 프리팹 데이터를 내장된 Scene 데이터에 복사합니다. 프리팹이 Addressable인지 여부에 상관없이 이러한 처리가 이루어집니다. 분석 도구의 "Check Scene to Addressable Duplicate Dependencies" 규칙을 사용하여 Addressable 에셋 그룹과 비-Addressable Scene 데이터 간에 중복된 에셋을 식별할 수 있습니다.
만약 프로젝트에서 Resources 폴더에 있는 에셋을 로드한다면, 해당 에셋을 Addressables 시스템으로 마이그레이션할 수 있습니다.
씬과 마찬가지로, 이전 Resources 에셋을 모두 한 그룹에 유지한다면 로딩 및 메모리 성능은 동일할 것입니다. 프로젝트에 따라 에셋을 별도의 그룹으로 나누어 성능과 유연성을 향상시킬 수 있습니다. 분석 도구를 사용하여 AssetBundle 간의 중복을 확인하세요.
Resources 폴더에 있는 에셋을 Addressable로 표시하면, 시스템은 자동으로 해당 에셋을 프로젝트의 새로운 폴더인 Resources_moved로 이동시킵니다. 이동된 에셋의 기본 주소는 이전 경로로 설정되며, 폴더 이름은 제외됩니다. 예를 들어, 로딩 코드는 다음과 같이 변경될 수 있습니다.
이것을
Resources.LoadAsync\<GameObject\>("desert/tank.prefab");
이렇게
Addressables.LoadAssetAsync\<GameObject\>("desert/tank.prefab");.
Addressables 시스템을 사용하도록 프로젝트를 수정한 후에는 Resources 클래스의 일부 기능을 다르게 구현해야 할 수도 있습니다.
예를 들어, Resources.LoadAll 함수를 살펴보겠습니다. 이전에는 Resources/MyPrefabs/ 폴더에 에셋이 있고
Resources.LoadAll<SampleType>("MyPrefabs");
을 실행하면, SampleType과 일치하는 모든 에셋을 Resources/MyPrefabs/에서 로드했습니다. Addressables 시스템은 정확히 같은 기능을 지원하지 않지만, Addressable 레이블을 사용하여 유사한 결과를 얻을 수 있습니다.
Addressables Groups 창을 처음 열 때, Unity는 모든 AssetBundle을 Addressables 그룹으로 변환하도록 제안합니다. 이는 AssetBundle 설정을 Addressables 시스템으로 마이그레이션하는 가장 간단한 방법입니다. 그러나 여전히 런타임 코드를 업데이트하여 Addressables API를 사용하여 에셋을 로드하고 해제해야 합니다.
수동으로 AssetBundle 설정을 변환하려면 "무시" 버튼을 클릭하세요. AssetBundle를 Addressables로 수동으로 마이그레이션하는 과정은 Scene과 Resources 폴더에 대한 설명과 유사합니다:
NOTE : 에셋의 주소의 기본 경로는 해당 파일 경로입니다. 에셋의 주소로 경로를 사용하는 경우, 번들에서 로드하는 것과 동일한 방식으로 에셋을 로드할 수 있습니다. Addressable Asset 시스템은 번들과 해당 종속성의 로딩을 처리합니다.
자동 변환 옵션을 선택하거나 수동으로 에셋을 동등한 Addressables 그룹에 추가한 경우, 그룹 설정에 따라 동일한 에셋을 포함하는 동일한 번들 세트가 생성됩니다. (번들 파일 자체는 동일하지 않을 수 있습니다.) 분석 도구를 사용하여 중복 및 기타 잠재적인 문제를 확인할 수 있습니다. Event viewer 창을 사용하여 에셋의 로딩 및 해제 동작이 예상대로 작동하는지 확인할 수 있습니다.
Addressables 시스템을 사용할 때 StreamingAssets 폴더에서 파일을 계속해서 로드할 수 있습니다. 그러나 이 폴더에 있는 파일은 Addressable로 지정할 수 없으며 다른 에셋을 참조할 수도 없습니다.
Addressables 시스템은 빌드 중에 실행 구성 파일과 로컬 AssetBundle을 StreamingAssets 폴더에 배치합니다. (Addressables는 빌드 프로세스가 완료되면 이러한 파일을 제거하므로 에디터에서는 볼 수 없습니다.)
Unity 프로젝트에 Addressables 패키지를 설치한 후에는 시작할 수 있습니다.
Addressables를 사용하는 기본적인 단계는 다음과 같습니다:
Addressable 에셋을 사용하기 위해 프로젝트를 설정한 예제로 Addressables-Sample 저장소의 Space Shooter 프로젝트를 참조할 수 있습니다.
NOTE : 이 "시작하기" 주제는 Addressable 콘텐츠를 구성하는 다양한 방법에 대해서는 다루지 않습니다. 해당 주제에 대한 정보는 "Addressable 에셋 구성"을 참조하십시오.
프로젝트에 Addressables 패키지를 설치하려면 Unity 패키지 매니저를 사용하세요:
패키지 매니저를 엽니다 (메뉴: Window > Package Manager).
패키지 목록을 Unity 레지스트리의 패키지를 표시하도록 설정합니다.
리스트에서 Addressables 패키지를 선택하세요.
패키지 매니저 창 오른쪽 아래에 있는 Install을 클릭하세요.
설치 후 프로젝트에 Addressables 시스템을 설정하려면 Addressables 그룹 창을 열고 Create Addressables Settings를 클릭하세요.
Create Addressables Settings 명령을 실행하면, Addressables 시스템은 AddressableAssetsData라는 폴더를 생성합니다. 이 폴더에는 Addressables 설정 파일 및 기타 에셋이 저장되어 Addressables 설정을 유지하는 데 사용됩니다. 이 폴더의 파일을 소스 컨트롤 시스템에 추가해야 합니다. Addressables는 Addressables 구성을 변경할 때 추가적인 파일을 생성할 수 있습니다. 설정 자체에 대한 자세한 정보는 Addressables 설정을 참조하십시오.
NOTE : 특정 버전의 어드레서블을 설치하는 방법이나 프로젝트의 패키지 관리에 대한 일반적인 정보는 패키지를 참조하세요.
다음과 같은 방법으로 에셋을 어드레서블로 표시할 수 있습니다:
에셋을 어드레서블로 만들면 어드레서블 시스템은 에셋을 기본 그룹(default group)에 추가합니다(특정 그룹에 배치하지 않는 한). 어드레서블은 콘텐츠 빌드를 만들 때 그룹 설정에 따라 그룹의 에셋을 에셋 번들에 패킹합니다. 이러한 에셋은 어드레서블 API를 사용하여 로드할 수 있습니다.
NOTE : 리소스 폴더에 있는 에셋을 어드레서블로 설정하면 Unity는 해당 에셋을 리소스 폴더 밖으로 이동합니다. 에셋을 프로젝트의 다른 폴더로 이동할 수는 있지만 어드레서블 에셋을 리소스 폴더에 저장할 수는 없습니다.
어드레서블 에셋을 로드하려면 다음과 같이 하면 됩니다:
어드레서블 에셋 로딩에 대한 자세한 내용은 에셋 로딩하기를 참조하세요.
어드레서블 에셋 로드는 비동기 연산을 사용합니다. Unity 스크립트에서 비동기 프로그래밍을 처리하는 다양한 방법에 대한 자세한 내용은 오퍼레이션을 참조하십시오.
TIP : 어드레서블 에셋을 사용하는 방법에 대한 자세한 예시는 어드레서블-샘플 리포지토리에서 확인할 수 있습니다.
에셋 참조를 사용하려면 MonoBehaviour 또는 스크립터블 오브젝트에 에셋 참조 필드를 추가합니다. 해당 유형의 객체를 생성한 후 객체의 인스펙터 창에서 필드에 에셋을 할당할 수 있습니다.
NOTE : 어드레서블 에셋이 아닌 에셋을 에셋 레퍼런스 필드에 할당하면 Unity는 해당 에셋을 자동으로 어드레서블로 설정하고 기본 어드레서블 그룹에 추가합니다. 또한 에셋 레퍼런스를 사용하면 씬에서 어드레서블 에셋이 아닌 에셋도 어드레서블 에셋으로 사용할 수 있습니다.
유니티는 참조된 에셋을 자동으로 로드하거나 해제하지 않으며, 사용자가 직접 어드레서블 API를 사용하여 에셋을 로드하고 해제해야 합니다:
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class LoadWithReference : MonoBehaviour
{
// Assign in Editor
public AssetReference reference;
// Start the load operation on start
void Start()
{
AsyncOperationHandle handle = reference.LoadAssetAsync<GameObject>();
handle.Completed += Handle_Completed;
}
// Instantiate the loaded prefab on complete
private void Handle_Completed(AsyncOperationHandle obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
Instantiate(reference.Asset, transform);
}
else
{
Debug.LogError($"AssetReference {reference.RuntimeKey} failed to load.");
}
}
// Release asset when parent object is destroyed
private void OnDestroy()
{
reference.ReleaseAsset();
}
}
에셋 참조 로딩에 대한 자세한 내용은 에셋 참조 로딩을 참조하세요.
주소 문자열을 사용하여 에셋을 로드할 수 있습니다:
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class LoadWithAddress : MonoBehaviour
{
// Assign in Editor or in code
public string address;
// Retain handle to release asset and operation
private AsyncOperationHandle<GameObject> handle;
// Start the load operation on start
void Start()
{
handle = Addressables.LoadAssetAsync<GameObject>(address);
handle.Completed += Handle_Completed;
}
// Instantiate the loaded prefab on complete
private void Handle_Completed(AsyncOperationHandle<GameObject> operation)
{
if (operation.Status == AsyncOperationStatus.Succeeded)
{
Instantiate(operation.Result, transform);
}
else
{
Debug.LogError($"Asset for {address} failed to load.");
}
}
// Release asset when parent object is destroyed
private void OnDestroy()
{
Addressables.Release(handle);
}
}
에셋을 로드할 때마다 해제해야 한다는 점을 기억하세요.
자세한 내용은 단일 에셋 로드를 참조하세요.
한 번의 작업으로 동일한 레이블을 가진 에셋 세트를 로드할 수 있습니다:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class LoadWithLabels : MonoBehaviour
{
// Label strings to load
public List<string> keys = new List<string>() {"characters", "animals"};
// Operation handle used to load and release assets
AsyncOperationHandle<IList<GameObject>> loadHandle;
// Load Addressables by Label
void Start()
{
float x = 0, z = 0;
loadHandle = Addressables.LoadAssetsAsync<GameObject>(
keys, // Either a single key or a List of keys
addressable =>
{
//Gets called for every loaded asset
if (addressable != null)
{
Instantiate<GameObject>(addressable,
new Vector3(x++ * 2.0f, 0, z * 2.0f),
Quaternion.identity,
transform);
if (x > 9)
{
x = 0;
z++;
}
}
}, Addressables.MergeMode.Union, // How to combine multiple labels
false); // Whether to fail if any asset fails to load
loadHandle.Completed += LoadHandle_Completed;
}
private void LoadHandle_Completed(AsyncOperationHandle<IList<GameObject>> operation)
{
if (operation.Status != AsyncOperationStatus.Succeeded)
Debug.LogWarning("Some assets did not load.");
}
private void OnDestroy()
{
// Release all the loaded assets associated with loadHandle
Addressables.Release(loadHandle);
}
}
자세한 내용은 여러 에셋 로딩을 참조하세요.
어드레서블 에셋을 관리하려면 어드레서블 그룹 창을 사용합니다. 이 창을 사용하여 어드레서블 그룹을 만들고, 그룹 간에 에셋을 이동하고, 에셋에 주소와 레이블을 할당할 수 있습니다.
어드레서블 패키지를 처음 설치하고 설정하면 어드레서블 에셋에 대한 기본 그룹이 생성됩니다. 어드레서블 시스템은 사용자가 어드레서블로 표시한 모든 에셋을 기본적으로 이 그룹에 할당합니다. 프로젝트 초기 단계에서는 이 단일 그룹에 에셋을 유지해도 괜찮을 수 있지만, 콘텐츠를 더 추가할수록 애플리케이션이 특정 시점에 로드하고 메모리에 유지하는 리소스를 더 잘 제어할 수 있도록 추가 그룹을 생성하는 것이 좋습니다.
주요 그룹 설정은 다음과 같습니다:
NOTE : 프로필 변수를 사용하여 이러한 경로를 설정할 수 있으며, 일반적으로 프로필 변수를 사용해야 합니다. 자세한 내용은 프로필을 참조하세요.
에셋을 구성하는 방법을 결정할 때 고려해야 할 전략에 대한 자세한 내용은 어드레서블 에셋 구성을 참조하세요.
어드레서블 그룹 창 사용에 대한 자세한 내용은 그룹을 참조하십시오.
어드레서블 콘텐츠 빌드 단계에서는 에디터에서 설정한 그룹 설정과 현재 플랫폼에 따라 어드레서블 그룹의 에셋을 에셋 번들로 변환합니다.
Unity 2021.2 이상에서는 모든 플레이어 빌드의 일부로 어드레서블 콘텐츠를 빌드하도록 어드레서블 시스템을 구성하거나 플레이어 빌드를 만들기 전에 콘텐츠를 별도로 빌드할 수 있습니다. 이러한 옵션 구성에 대한 자세한 내용은 플레이어 빌드로 어드레서블 콘텐츠 빌드하기를 참조하세요.
콘텐츠를 플레이어 빌드의 일부로 빌드하도록 Unity를 구성한 경우 에디터 빌드 설정 창에서 일반 빌드(Build) 또는 빌드 및 실행(Build and Run) 버튼을 사용하여 빌드를 시작합니다. Unity는 플레이어를 빌드하기 전에 사전 빌드 단계로 어드레서블 콘텐츠를 빌드합니다.
이전 버전의 Unity에서 또는 콘텐츠를 별도로 빌드하도록 Unity를 구성한 경우, "빌드 만들기"에 설명된 대로 어드레서블 그룹 창의 빌드 메뉴를 사용하여 어드레서블 빌드를 만들어야 합니다. 다음에 프로젝트의 플레이어를 빌드할 때 현재 플랫폼에 대해 마지막으로 실행한 어드레서블 콘텐츠 빌드에서 생성된 아티팩트를 사용합니다. 어드레서블 빌드 프로세스 자동화에 대한 자세한 내용은 "빌드 스크립팅"을 참조하십시오.
어드레서블 그룹 창에서 콘텐츠 빌드를 시작하려면 다음과 같이 하세요:
기본적으로 빌드는 프로필 설정에서 LocalBuildPath 및 RemoteBuildPath 변수에 정의된 위치에 파일을 생성합니다. 유니티가 플레이어 빌드에 사용하는 파일에는 에셋 번들(.bundle), 카탈로그 JSON 및 해시 파일, 설정 파일이 포함됩니다.
WARNING : 대부분의 경우 로컬 빌드 또는 로드 경로를 기본값에서 변경해서는 안 됩니다. 변경하는 경우, 플레이어 빌드를 만들기 전에 로컬 빌드 아티팩트를 커스텀 빌드 위치에서 프로젝트의 StreamingAssets 폴더로 복사해야 합니다. 이러한 경로를 변경하면 플레이어 빌드의 일부로 어드레서블을 빌드할 수 없습니다.
RemoteBuildPath로 빌드하는 그룹이 있는 경우 해당 에셋 번들, 카탈로그, 해시 파일을 호스팅 서버에 업로드하는 것은 사용자의 책임입니다. (프로젝트에서 원격 콘텐츠를 사용하지 않는 경우 모든 그룹이 로컬 빌드 및 로드 경로를 사용하도록 설정하세요.)
콘텐츠 빌드는 어드레서블이 플레이어 빌드에서 직접 사용하지 않는 다음 파일도 생성합니다:
콘텐츠 빌드를 설정하고 수행하는 방법에 대한 자세한 내용은 어드레서블 콘텐츠 빌드하기를 참조하세요.
전체 콘텐츠 빌드를 만들려면 다음과 같이 하세요:
빌드 프로세스가 시작됩니다.
빌드가 완료되면 플레이어 빌드를 수행하고 RemoteBuildPath에서 호스팅 서버로 원격 파일을 업로드할 수 있습니다.
IMPORTANT : 애플리케이션을 다시 빌드하지 않고 원격 콘텐츠 업데이트를 게시하려는 경우 게시된 각 빌드에 대해 addressables_content_state.bin 파일을 보존해야 합니다. 이 파일이 없으면 업데이트가 아닌 전체 콘텐츠 빌드 및 플레이어 빌드만 생성할 수 있습니다. 자세한 내용은 콘텐츠 업데이트 빌드를 참조하세요.
어드레서블을 사용하여 콘텐츠 전송 네트워크(CDN) 또는 기타 호스팅 서비스를 통한 콘텐츠의 원격 배포를 지원할 수 있습니다. 유니티는 이를 위해 Unity 클라우드 콘텐츠 전송(CCD) 서비스를 제공하지만, 원하는 CDN이나 호스트를 사용할 수 있습니다.
원격 배포용 콘텐츠를 빌드하기 전에 다음을 수행해야 합니다:
콘텐츠 빌드(어드레서블 Groups 창 사용)와 플레이어 빌드(Build Settings 창 사용)를 수행한 후에는 프로필의 RemoteBuildPath로 지정된 폴더에 생성된 파일을 호스팅 서비스에 업로드해야 합니다. 업로드할 파일은 다음과 같습니다:
자세한 내용은 원격 콘텐츠 배포하기를 참조하세요.
콘텐츠를 원격으로 배포할 때 증분 콘텐츠 업데이트 빌드를 게시하면 사용자가 업데이트를 위해 다운로드해야 하는 데이터의 양을 줄일 수 있습니다. 증분 업데이트 빌드를 사용하면 모든 것을 다시 게시하지 않고 마지막으로 업데이트를 게시한 이후 변경된 에셋만 포함된 원격 번들을 게시할 수 있습니다. 이러한 소규모 업데이트 번들의 에셋은 기존 에셋을 재정의합니다.
IMPORTANT : 증분 업데이트를 게시하는 옵션을 사용하려면 플레이어 빌드를 게시하기 전에 원격 카탈로그 빌드 옵션을 켜야 합니다. 원격 카탈로그가 없으면 설치된 애플리케이션이 업데이트를 확인하지 않습니다.
예시를 포함하여 콘텐츠 업데이트에 대한 자세한 내용은 콘텐츠 업데이트 빌드를 참조하세요.
전체 빌드가 아닌 콘텐츠 업데이트를 만들려면 다음과 같이 하세요:
빌드가 완료되면 원격 빌드 경로에서 호스팅 서버로 파일을 업로드할 수 있습니다.
IMPORTANT : 어드레서블은 addressables_content_state.bin 파일을 사용하여 변경한 에셋을 식별합니다. 게시된 각 빌드에 대해 이 파일의 사본을 보존해야 합니다. 이 파일이 없으면 업데이트가 아닌 전체 콘텐츠 빌드만 생성할 수 있습니다.
어드레서블은 프로젝트와 함께 성장할 수 있는 시스템을 제공합니다. 간단한 설정으로 시작한 다음 프로젝트가 복잡해지고 팀 규모가 커짐에 따라 재구성할 수 있으며, 최소한의 코드 변경만으로 이 모든 작업을 수행할 수 있습니다.
예를 들어, Unity가 세트로 로드하는 단일 어드레서블 에셋 그룹으로 시작할 수 있습니다. 그런 다음 콘텐츠를 추가하면서 에셋을 여러 그룹으로 분할하여 특정 시점에 필요한 에셋만 로드할 수 있습니다. 팀 규모가 커지면 다양한 유형의 에셋을 개발하기 위해 별도의 Unity 프로젝트를 만들 수 있습니다. 이러한 보조 프로젝트는 메인 프로젝트에서 로드하는 자체 어드레서블 콘텐츠 빌드를 생성할 수 있습니다(최소한의 코드 변경으로).
이 개요에서는 어드레서블 시스템으로 에셋을 관리하고 사용하는 방법을 이해하는 데 도움이 되는 다음 개념에 대해 설명합니다:
기본적으로 어드레서블은 에셋 번들을 사용하여 에셋을 패키징합니다. 에셋에 액세스하는 다른 방법을 지원하기 위해 자체 IResourceProvider 클래스를 구현할 수도 있습니다.
어드레서블 시스템의 핵심 기능은 에셋에 주소를 할당하고 해당 주소를 사용하여 런타임에 에셋을 로드하는 것입니다. 어드레서블 리소스 관리자는 콘텐츠 카탈로그에서 주소를 조회하여 에셋이 저장된 위치를 찾습니다. (에셋은 애플리케이션에 내장되거나 로컬에 캐시되거나 원격으로 호스팅될 수 있습니다.) 리소스 관리자는 에셋과 모든 종속성을 로드하고 필요한 경우 콘텐츠를 먼저 다운로드합니다.
주소가 에셋의 실제 위치에 연결되지 않으므로 Unity 에디터와 런타임 모두에서 에셋을 관리하고 최적화할 때 훨씬 더 유연하게 작업할 수 있습니다. 카탈로그는 주소를 실제 위치에 매핑합니다.
일반적으로 에셋에 고유한 주소를 할당해야 하지만, 에셋 주소가 반드시 고유할 필요는 없습니다. 유용한 경우 둘 이상의 에셋에 동일한 주소 문자열을 할당할 수 있습니다. 예를 들어, 에셋의 이형 상품이 있는 경우 모든 이형 상품에 동일한 주소를 할당하고 레이블을 사용하여 이형 상품을 구분할 수 있습니다:
LoadAssetAsync와 같이 단일 에셋만 로드하는 어드레서블 API 함수는 여러 에셋에 할당된 주소로 호출하면 가장 먼저 찾은 인스턴스를 로드합니다. LoadAssetsAsync와 같은 다른 함수는 한 번의 작업으로 여러 에셋을 로드하고 지정된 주소를 가진 모든 에셋을 로드합니다.
TIP : LoadAssetsAsync의 MergeMode 파라미터를 사용하여 두 키의 교집합을 로드할 수 있습니다. 위의 예시에서는 주소 "plate_armor_rusty"와 레이블 "hd"를 키로 지정하고 교집합을 병합 모드로 지정하여 "Asset 1"을 로드할 수 있습니다. 레이블 값을 "sd"로 변경하여 "Asset 2"를 로드할 수 있습니다.
에셋에 주소를 할당하는 방법은 에셋을 주소 지정 가능으로 만들기를 참조하세요.
주소를 포함한 키별로 에셋을 로드하는 방법은 에셋 로드하기를 참조하세요.
에셋 레퍼런스는 모든 종류의 어드레서블 에셋에 설정할 수 있는 유형입니다. Unity는 레퍼런스에 할당된 에셋을 자동으로 로드하지 않으므로 로드 및 언로드 시기를 사용자가 직접 제어할 수 있습니다.
MonoBehaviours 및 ScriptableObjects에서 AssetReference 유형의 필드를 사용하면 주소를 지정하는 문자열을 사용하는 대신 해당 필드에 사용할 어드레서블 에셋을 지정할 수 있습니다. 에셋 레퍼런스는 드래그 앤 드롭 및 오브젝트 선택기 할당을 지원하므로 에디터 인스펙터에서 더욱 편리하게 사용할 수 있습니다.
어드레서블은 기본 AssetReference 유형 외에도 AssetReferenceGameObject 및 AssetReferenceTexture와 같은 몇 가지 특수한 유형을 더 제공합니다. 이러한 특수 서브클래스를 사용하면 AssetReference 필드에 잘못된 유형의 에셋을 할당할 가능성을 없앨 수 있습니다. 또한 AssetReferenceUILabelRestriction 어트리뷰트를 사용하여 특정 레이블이 있는 에셋에 대한 할당을 제한할 수 있습니다.
자세한 내용은 에셋 레퍼런스 사용을 참조하세요.
어드레서블 에셋을 로드하려면 해당 주소 또는 레이블이나 에셋 참조와 같은 기타 키를 사용할 수 있습니다. 자세한 내용은 어드레서블 에셋 로딩하기를 참조하세요. 주 에셋만 로드하면 되고, 어드레서블은 종속 에셋을 자동으로 로드합니다.
런타임에 애플리케이션에서 더 이상 어드레서블 에셋에 액세스할 필요가 없는 경우, 어드레서블이 관련 메모리를 확보할 수 있도록 해당 에셋을 해제해야 합니다. 어드레서블 시스템은 로드된 에셋의 참조 카운트를 유지합니다. 참조 카운트가 0으로 돌아올 때까지 에셋을 언로드하지 않습니다. 따라서 에셋이나 해당 종속 요소가 여전히 사용 중인지 추적할 필요가 없으며, 에셋을 명시적으로 로드할 때마다 애플리케이션에 해당 인스턴스가 더 이상 필요하지 않을 때 해제하기만 하면 됩니다. 자세한 내용은 어드레서블 에셋 릴리스하기를 참조하세요.
Unity의 한 에셋은 다른 에셋에 종속될 수 있습니다. 씬은 하나 이상의 프리팹을 참조할 수 있고, 프리팹은 하나 이상의 머티리얼을 사용할 수 있습니다. 동일한 머티리얼을 둘 이상의 프리팹에서 사용할 수 있으며, 이러한 프리팹은 서로 다른 에셋 번들에 존재할 수 있습니다. 어드레서블 에셋을 로드하면 시스템이 참조하는 종속 에셋을 자동으로 찾아서 로드합니다. 시스템이 에셋을 언로드하면 다른 에셋에서 계속 사용 중인 경우를 제외하고 종속성도 언로드됩니다.
에셋을 로드하고 해제할 때 어드레서블 시스템은 각 항목에 대한 참조 수를 유지합니다. 에셋이 더 이상 참조되지 않으면 어드레서블은 해당 에셋을 언로드합니다. 에셋이 더 이상 사용 중인 에셋이 포함되지 않은 번들에 포함된 경우 Addressables도 해당 번들을 언로드합니다.
자세한 내용은 메모리 관리를 참조하세요.
어드레서블 그룹을 사용하여 콘텐츠를 구성할 수 있습니다. 모든 어드레서블 에셋은 그룹에 속합니다. 에셋을 그룹에 명시적으로 할당하지 않으면 어드레서블은 해당 에셋을 기본 그룹에 추가합니다.
그룹 설정을 설정하여 어드레서블 빌드 시스템이 그룹에 있는 에셋을 번들로 패키징하는 방법을 지정할 수 있습니다. 예를 들어, 그룹의 모든 에셋을 단일 AssetBundle 파일에 함께 패키징할지 여부를 선택할 수 있습니다.
레이블을 사용하여 어떤 방식으로든 함께 처리할 콘텐츠에 태그를 지정할 수 있습니다. 예를 들어 "빨간색", "모자", "깃털"에 대한 레이블을 정의한 경우 깃털이 있는 빨간색 모자는 동일한 에셋 번들의 일부인지 여부에 관계없이 한 번의 작업으로 모두 로드할 수 있습니다. 또한 레이블을 사용하여 그룹 내 에셋이 번들에 패킹되는 방식을 결정할 수 있습니다.
어드레서블 그룹 창을 사용하여 그룹에 에셋을 추가하고 그룹 간에 에셋을 이동할 수 있습니다. 그룹 창에서 에셋에 레이블을 할당할 수도 있습니다.
그룹에 할당된 스키마는 그룹에서 에셋을 빌드하는 데 사용되는 설정을 정의합니다. 서로 다른 스키마는 서로 다른 설정 그룹을 정의할 수 있습니다. 예를 들어, 하나의 표준 스키마는 에셋을 다른 옵션 중에서 에셋 번들로 패킹 및 압축하는 방법에 대한 설정을 정의합니다. 또 다른 표준 스키마는 그룹의 에셋이 "출시 후 변경 가능(Can Change Post Release)" 및 "출시 후 변경 불가(Cannot Change Post Releas)" 범주 중 어느 범주에 속할지를 정의합니다.
사용자 지정 빌드 스크립트와 함께 사용할 스키마를 직접 정의할 수 있습니다.
그룹 스키마에 대한 자세한 내용은 스키마를 참조하세요.
어드레서블 시스템은 에셋의 주소를 실제 위치에 매핑하는 콘텐츠 카탈로그 파일을 생성합니다. 또한 카탈로그의 해시(Hash)(수학적 지문)가 포함된 해시 파일을 생성할 수도 있습니다. 어드레서블 에셋을 원격으로 호스팅하는 경우 시스템에서 이 해시 파일을 사용하여 콘텐츠 카탈로그가 변경되어 다운로드해야 하는지 여부를 결정합니다. 자세한 내용은 콘텐츠 카탈로그를 참조하세요.
콘텐츠 빌드를 수행할 때 선택한 프로필에 따라 콘텐츠 카탈로그의 주소가 리소스 로딩 경로에 매핑되는 방식이 결정됩니다. 자세한 내용은 프로필을 참조하세요.
원격으로 콘텐츠를 호스팅하는 방법에 대한 자세한 내용은 원격으로 콘텐츠 배포하기를 참조하세요.
어드레서블 시스템은 어드레서블 콘텐츠 빌드와 플레이어 빌드를 분리합니다. 콘텐츠 빌드는 콘텐츠 카탈로그, 카탈로그 해시, 에셋이 포함된 에셋 번들을 생성합니다.
에셋 형식은 플랫폼별로 다르므로 플레이어를 빌드하기 전에 각 플랫폼에 맞는 콘텐츠 빌드를 만들어야 합니다.
자세한 내용은 어드레서블 콘텐츠 빌드를 참조하세요.
에디터 플레이 모드에서 게임이나 애플리케이션을 실행할 때 플레이 버튼을 누르기 전에 항상 콘텐츠 빌드를 수행하면 불편하고 속도가 느려질 수 있습니다. 동시에 가능한 한 빌드된 플레이어에 가까운 상태에서 게임을 실행할 수 있기를 원할 것입니다. 유연성을 위해 어드레서블은 어드레서블 시스템이 플레이 모드에서 에셋을 찾고 로드하는 방법을 결정하는 세 가지 옵션을 제공합니다:
어드레서블은 빌드 경로에 대상 플랫폼 이름을 포함시키고 플레이어 빌드 시 올바른 플랫폼 파일을 스트리밍 에셋 폴더에 복사하도록 하여 여러 플랫폼용으로 설계된 프로젝트를 지원합니다.
어드레서블 시스템은 어드레서블 에셋을 관리하는 데 도움이 되는 몇 가지 툴과 창을 제공합니다:
다음 항목에서는 프로젝트에서 어드레서블 시스템을 설정하는 구성 옵션에 대한 개요와 자세한 정보에 대한 링크를 제공합니다:
어드레서블 시스템은 스크립터블 오브젝트 에셋 세트를 사용하여 구성 설정을 저장합니다. 시스템은 이러한 설정 에셋을 Unity 프로젝트의 Assets/AddressableAssetsData 폴더에 저장합니다. 그룹 창에서 어드레서블을 초기화할 때 이 폴더와 기본 설정 오브젝트가 생성됩니다. 어드레서블 패키지를 설치한 후 그룹 창(메뉴: Window > Asset Management > Addressables > Groups)을 엽니다.
Groups 창을 처음 열 때 어드레서블 설정 생성(Create Addressables Settings)을 클릭하여 초기화 명령을 실행하여 설정 폴더와 에셋을 생성합니다:
AddressableAssetsData 폴더와 그 콘텐츠를 소스 제어 시스템에 추가합니다.
AddressableAssetsSettings 오브젝트에는 프로젝트의 글로벌 시스템 설정이 포함되어 있습니다. 메뉴에서 이 설정에 액세스할 수 있습니다: Window > Asset Management > Addressables > Settings 또는 Groups 창의 Tools 메뉴에서 액세스할 수 있습니다.
어드레서블 시스템은 사용자가 정의한 그룹을 사용하여 어드레서블 에셋을 로컬 및 원격 에셋 번들에 패키징하는 방법을 결정합니다. 각 그룹에는 해당 그룹의 옵션을 제어하는 데 사용할 수 있는 자체 설정 오브젝트가 있습니다. 어드레서블은 그룹을 생성할 때마다 새 설정 오브젝트를 생성합니다.
프로필을 사용하면 빌드 목적에 따라 빌드 변수 집합을 적절하게 구성할 수 있습니다. 예를 들어 프로젝트의 개발 빌드에 사용할 프로필을 구성하고, 테스트 빌드에 사용할 프로필을 구성하고, 릴리스 빌드를 게시할 프로필을 구성할 수 있습니다. 필요한 만큼 프로필을 만들 수 있습니다.
어드레서블 시스템은 Unity 에디터 내에서 실행되는 에셋 호스팅 서비스를 제공합니다. 이 서비스를 사용하여 HTTP 연결을 통해 원격 콘텐츠를 테스트할 수 있습니다.
어드레서블 패키지는 Unity 에디터 환경설정 창에 자체 섹션을 추가합니다. 어드레서블 환경설정에는 다음이 포함됩니다:
활성화하면 빌드 시스템에서 빌드 레이아웃 보고서(Build layout report)를 생성합니다. 이 옵션은 빌드를 생성하는 데 필요한 시간을 늘리기 때문에 기본적으로 비활성화되어 있습니다. 빌드 보고서에는 빌드에서 생성된 각 에셋 번들에 대한 자세한 설명이 포함됩니다.
Unity에서 플레이어 빌드의 일부로 어드레서블 콘텐츠를 빌드할지 여부를 결정합니다.
플레이어와 함께 어드레서블 콘텐츠를 빌드하면 편리할 수 있지만, 에셋을 수정하지 않은 경우에도 어드레서블 콘텐츠가 리빌드되므로 특히 대규모 프로젝트의 경우 빌드 시간이 늘어날 수 있습니다. 대부분의 빌드 간에 어드레서블 콘텐츠를 변경하지 않는다면 이 옵션을 비활성화하는 것이 좋습니다.
옵션은 다음과 같습니다:
처음 두 옵션은 현재 프로젝트의 글로벌 환경설정을 재정의하며 프로젝트를 빌드하는 모든 기여자에게 영향을 줍니다. 그렇지 않으면 글로벌 환경설정이 모든 Unity 프로젝트에 적용됩니다.