티스토리 뷰
1. 어드레서블의 개요
learn.unity.com/tutorial/addressables-introduction-to-concepts#
Addressables를 사용하면 콘텐츠가 카탈로그 화되고 그룹으로 패키징되고 플레이어와 별도로 저장됩니다.
그런 다음 콘텐츠를 프로젝트와 함께 배포하거나 CDN (Content Delivery Network)이라고도하는 서버에 저장할 수 있습니다.
사용자가 앱스토어나 게임 서비스에서 업데이트를 다운로드 할 필요없이 자동으로 업데이트를 적용 할 수 있습니다.
개발자는 AssetReference를 사용하여 직접 주소지정가능자산의 주소를 지정하거나 특정기준을 충족하는 모든 주소지정가능항목 (the addresses of)을 요청하여 주소 지정 가능 자산을 요청할 수 있습니다.
기준을 지정하는 기능은 예를 들어 지역, 품질 설정 또는 현재 게임레벨 또는 씬에 따라 다른 콘텐츠를 로드하는 데 매우 유용합니다.
씬뒤에서의 request는 콘텐츠 제공 업체로 이동 한 다음 콘텐츠 카탈로그를 참조하여 요청된 모든 콘텐츠의 주소, 저장 위치, 종속성 등을 확인합니다. 그런 다음 제공 업체는 콘텐츠를 로드하거나 다운로드합니다. (원격으로 저장된 콘텐츠의 경우) 요청 된 자산 및 해당 종속성이 인스턴스화되거나 요청자에게 전달됩니다.
Addressable의 인스턴스가 더 이상 필요하지 않은 경우, Destroy() 또는 DestroyImmediate()를 통해 게임 오브젝트를 파괴하는 대신 Addressables.ReleaseInstance()를 통해 해제하거나이를 포함하는 Scene이 닫힐 때 자동으로 정리되도록 허용해야합니다. 자산 자체가 더 이상 필요하지 않으면 언로드됩니다.
어드레서 블 자산이 어드레서블을 통해 로드되거나 인스턴스화 될 때마다 참조(ref)계수와 이를 포함하는 번들의 참조 계수가 증가합니다. 균형을 유지하려면 모든 로드 또는 인스턴스화에 쌍을 이루는 릴리스가 있어야합니다.
모든 콘텐츠, 심지어 카탈로그까지도 원격으로 저장할 수 있고 콘텐츠 크기, 연결속도 및 저장매체와 같은 여러 요소가 콘텐츠를 로드하는 데 필요한 시간에 영향을 미칠 수 있으므로 Addressables 시스템은 필요에 따라 비동기식입니다. 개발자는 Addressables에 대한 호출이 언제 완료되었는지 알 수있는 세 가지 옵션이 있습니다. 콜백 (특히 호출의 특성과 관련된 유형의 AsyncOperationHandle을 반환하는 Completed, 유형없는 AsyncOperationHandle을 반환하는 CompletedTypeless), 코루틴 또는 AsyncAwait입니다.
어드레서블 자산은 해당 종속성이 로드되거나 다운로드 되면 캐시됩니다. Static으로 표시된 AssetBundles는 한 번만 다운로드됩니다. 어드레서블 자산을 로드하면 메모리에 배치되지만 자동으로 인스턴스화되지는 않습니다. 필요한 경우 지정된 주소 또는 레이블에 대한 모든 종속성도 미리로드 할 수 있습니다.
전통적으로 각 자산의 번들 할당은 메타 데이터에 저장되는 반면 Addressables와 관련된 데이터는 AddressableAssetsData 폴더에 저장됩니다. Addressables 창에서이 폴더를 생성하거나, Inspector의 체크 박스를 선택하거나 Asset 그룹으로 드래그하여 처음으로 Asset을 어드레서블하게 만들 때 자동으로 생성됩니다.
2. 씬로딩
learn.unity.com/tutorial/addressables-scene-loading?language=en
Loading a Scene
1. Addressables를 사용하여 로드하면, 현재 Scene을 저장하는 것 외에도 Scene을 생성하거나 import합니다.
2. "Loader"라는 이름의 빈 게임 오브젝트를 만듭니다.
3. “SceneLoader”라는 새 C# 스크립트를 연결하고 스크립트 편집기에서 엽니다.
4. Addressables를 사용하는 스크립트에 다음 네임 스페이스를 포함해야합니다.
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;
5. 클래스 정의 내에 다음 데이터 멤버를 추가합니다.
public AssetReference scene;
프로젝트의 필요에 따라 대신 JSON 또는 일반 텍스트 파일로 로드 할 장면의 이름을 저장할 수 있습니다. 이 경우 다음 데이터 멤버를 대신 사용하십시오.
public string scene;
6. Start() 안에 다음을 입력합니다.
Addressables.LoadSceneAsync(scene,UnityEngine.SceneManagement.LoadSceneMode.Additive).Completed += SceneLoadComplete;
이 명령은 AssetReference 또는 문자열에 대해 작동합니다. AssetReferences 만 사용하는 경우 대신 다음을 사용할 수 있습니다.
scene.LoadSceneAsync().Completed += SceneLoadComplete;
LoadSceneAsync()는 지정된 LoadSceneMode를 사용할 수도 있습니다. Single은 새 Scene을 로드 할 때 현재로드된 모든 Scene을 닫고 Additive는 새Scene을 현재 로드된 Scene에 병합합니다.
Addressables.LoadSceneAsync(scene, LoadSceneMode.Additive).Completed += SceneLoadComplete;
//or
scene.LoadSceneAsync(LoadSceneMode.Single).Completed += SceneLoadComplete;
AssetReference는 어드레서블어셋을 가리킬 수 있으므로 Scene만 지정되도록하는 것은 개발자의 몫입니다. 주소를 직접 사용하는 경우 유효하지 않은 Scene 주소가 제공되지 않는다고 가정합니다. 오류 처리는 개발자에게 맡겨집니다.
7. Start() 아래에 SceneLoadComplete()를 생성합니다.
private void SceneLoadComplete(AsyncOperationHandle<UnityEngine.ResourceManagement.ResourceProviders.SceneInstance> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
// Set our reference to the AsyncOperationHandle (see next section)
Debug.Log(obj.Result.Scene.name + " successfully loaded.");
// (optional) do more stuff
}
}
Unloading a Scene
Scene이로드 될 때 생성 된 AsyncOperationHandle에 대한 참조를 유지하여 나중에 언로드 할 수 있도록하는 것이 중요합니다.
1. 스크립트에 다음 네임 스페이스를 추가합니다.
using UnityEngine.ResourceManagement.ResourceProviders;
2. Scene을 로드할때 생성 된 핸들에 대한 참조를 보유할 데이터 멤버를 추가합니다.
private AsyncOperationHandle<SceneInstance> handle;
3. 새로운 씬이 로드될 때 이 참조를 보유하고있는 게임 오브젝트가 파괴되지 않는 것도 중요합니다. 그렇지 않으면 참조가 손실됩니다. 한 가지 방법은 Script의 Awake 함수에서 선언하는 것입니다.
DontDestroyOnLoad(gameObject);
언로드처리
Addressables.UnloadSceneAsync(handle).Complete += SceneUnloadComplete;
샘플코드
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
public class SceneLoader : MonoBehaviour
{
public AssetReference scene;
private AsyncOperationHandle<SceneInstance> handle;
private bool unloaded;
private void Awake()
{
DontDestroyOnLoad(gameObject);
}
// Start is called before the first frame update
void Start()
{
Addressables.LoadSceneAsync(scene,UnityEngine.SceneManagement.LoadSceneMode.Additive).Completed += SceneLoadCompleted;
}
private void SceneLoadCompleted(AsyncOperationHandle<SceneInstance> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("Successfully loaded scene.");
handle = obj;
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.X) && !unloaded)
{
unloaded = true;
UnloadScene();
}
}
void UnloadScene()
{
Addressables.UnloadSceneAsync(handle, true).Completed += op =>
{
if (op.Status == AsyncOperationStatus.Succeeded)
Debug.Log("Successfully unloaded scene.");
};
}
}
3. AssetReference에 대해
learn.unity.com/tutorial/addressables-basic-assetreference?language=en#5fb964d1edbc2a001fc4508c
AssetReference는 단일 Prefab 참조를 사용하는것과 거의 동일한 방식으로 로드 및 인스턴스화하기 위해 어드레서블어셋에 대한 참조를 보유하며, 심지어 인스턴스화시 선택적으로 상위 변환을 할당합니다. 이 접근 방식의 주요 이점은 프로젝트 또는 CDN (Content Delivery Network)을 통해 배포되는 콘텐츠에 대해 동일하고 원활하게 작동한다는 것입니다. 마지막으로 GameObject를 직접 파괴하는 대신 Addressables를 사용하여 인스턴스를 해제합니다.
AssetReference를 사용하여 객체 생성
1. Addressables와 함께 사용하려는 게임오브젝트를 생성하거나 가져옵니다.
2. 대상이 아직 Prefabs가 아니라면 Prefab으로 만드세요.
3. GameObject 드롭다운에서 Create Empty를 선택하여 Scene에 빈 GameObject를 만듭니다. 이름을 "Loader"로 지정합니다.
4. "AssetReferenceUtility"라는 새 C# 스크립트를 GameObject에 연결하고 스크립트 편집기에서 엽니다.
5. 사용하지 않을 Update () 메서드를 삭제합니다.
6. 주소 지정 가능 및 비동기 작업에 필요한 두 개의 네임 스페이스가 있습니다. 다른 네임 스페이스 선언 뒤에 다음을 추가합니다.
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
7. AssetReferenceUtility 외에도 인스턴스에 대한 참조를 저장해야합니다. 클래스 정의 내에 다음 데이터 멤버를 추가합니다.
public AssetReference objectToLoad;
public AssetReference accessoryObjectToLoad;
private GameObject instantiatedObject;
private GameObject instantiatedAccessoryObject;
8. 한 개체에는 람다 식을, 다른 개체에는 대리자를 사용하여 Start ()에서 개체를로드하고 인스턴스화합니다. Lambda 표현식은 짧은 코드 블록을 실행하는 효율적인 방법으로, 대리자는 길거나 복잡한 작업에 유용합니다. 메인 오브젝트를 로드하기 위해 델리게이트를 사용합니다.
Start() 안에 다음을 입력합니다.
Addressables.LoadAssetAsync <GameObject>(objectToLoad).Completed += ObjectLoadDone;
9. 이제 ObjectLoadDone 함수를 만들 준비가되었습니다. Start 메서드 뒤에 빈 함수를 만듭니다.
10. 이 함수를 사용하여 개체가 로드 된 후 개체를 인스턴스화하고 액세서리 개체(지정된 경우)를 인스턴스화합니다. 이 메서드의 코드는 프로덕션 시나리오에서 사용할 수있는 코드의 예가 아니라 로드 및 인스턴스화 기능을 설명하기위한 것입니다. LoadAssetAsync는 어드레서블어셋을 메모리에 로드하지만 인스턴스화하지는 않습니다. InstantiateAsync()는 어드레서블어셋을 한번에 로드하고 인스턴스화합니다.
private void ObjectLoadDone(AsyncOperationHandle<GameObject> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
loadedObject = obj.Result;
Debug.Log("Successfully loaded object.");
instantiatedObject = Instantiate(loadedObject);
Debug.Log("Successfully instantiated object.");
if (accessoryObjectToLoad != null)
{
accessoryObjectToLoad.InstantiateAsync(instantiatedObject.transform).Completed += op =>
{
if (op.Status == AsyncOperationStatus.Succeeded)
{
instantiatedAccessoryObject = op.Result;
Debug.Log("Successfully loaded and instantiated accessory object.");
}
};
}
}
}
11. 각 Prefab에 대해 Project 뷰에서 클릭하여 선택하고 Inspector 상단 근처에 Addressable이라고 표시된 상자를 선택합니다. 이 주소를 지정할 수 있는 것 외에도 기본 로컬 주소 지정 가능 그룹에 개체를 배치합니다.
12. Hierarchy 뷰에서 Loader를 클릭하여 선택하고 "로드 할 객체"및 "로드 할 액세서리 객체"라는 드롭 다운을 사용하여 Prefab을 AssetReference에 할당합니다.
13. 재생 모드로 들어갑니다. 계층 구조에서 AccessoryObjectToLoad (Clone)의 Transform이 기본 아래에 배치 된 상태로 개체가로드되고 인스턴스화되었습니다.
4. 컨텐츠 업데이트
learn.unity.com/tutorial/addressables-content-updates?language=en
컨텐츠 업데이트는 새 프로젝트로 생성 된 addressable_content_state.bin 파일을 사용하므로 이미 빌드 된 프로젝트가 필요합니다. 그리고 프로젝트의 초기 빌드 전에 플레이어가 원격 콘텐츠 카탈로그없이 콘텐츠 업데이트에 대해 알 수있는 방법이 없으므로 주소 지정 가능한 자산 설정에서 원격 카탈로그 빌드 를 활성화해야합니다 . 마지막으로 업데이트 된 콘텐츠를 호스팅하려면 활성 서버가 있어야합니다. 프로젝트가 아직 개발중인 경우 Addressables와 함께 제공되는 기본 제공 HTTP 호스팅 서비스 일 수 있습니다.
개요
어드레서블 기반 프로젝트에서 콘텐츠를 업데이트하는데는 준비 및 빌드의 두 단계가 있습니다.
준비 단계에서는 Static Asset Group의 변경 사항을 찾습니다. 정적 자산 그룹은 콘텐츠 업데이트 제한이 "출시 후 변경할 수 없음(Cannot Change Post Release)"으로 설정된 주소 지정 가능 그룹입니다.
빌드 단계에서는 정적 자산 그룹에서 변경된 콘텐츠만 포함하는 새 그룹을 만듭니다. 플레이어와 함께 제공되는 콘텐츠는 플레이어가 한 번만 다운로드하기를 원하는 대형 원격 번들과 마찬가지로 고정으로 표시되어야합니다.
그후 콘텐츠 카탈로그가 업데이트되어 새 콘텐츠를 가리키고 변경된 내용만 로드됩니다. 이것은 서버에 매우 큰 번들이 저장되어있을 때 특히 유용합니다. 이는 사용자가 전체 번들의 새 버전이 아닌 업데이트 만 다운로드하면됨을 의미합니다.
컨텐츠 업데이트
프로젝트의 플레이어 및 플레이어 콘텐츠를 빌드하고 배포했다고 가정해 보겠습니다(그림 01). 그 이후로 플레이어 프리팹을 변경했습니다.
1. Addressables Groups 창에서 Tools > Check for Content Update Restrictions을 클릭합니다 (그림 02).
2. addressables_content_state.bin 파일의 위치로 이동하십시오. 이는 일반적으로 빌드 대상 플랫폼의 이름이 지정된 하위 폴더 의 AddressableAssetsData 폴더 내에 있습니다 (그림 03).
3. 열기를 클릭 합니다. 정적 콘텐츠의 변경 사항을 강조하는 창이 나타납니다 (그림 04).
4. Apply Changes를 클릭 합니다. 그룹의 콘텐츠 업데이트 제한이 출시 후 변경 가능(Can Change Post Release)으로 설정된 경우 해당 그룹에 대한 변경 사항은이 창에 표시되지 않습니다. 그러나 6 단계에서 이전 빌드 업데이트(Update a Previous Build)를 선택하면 적용됩니다 .
5. 변경된 자산은 원격 빌드 및로드 경로를 사용하도록 설정된 새 그룹, 콘텐츠 업데이트로 이동되었습니다 (그림 05).
6. Addressables 창의 Build 드롭 다운에서 Update a Previous Build를 선택 합니다 (그림 06).
7. 다시 한 번 addressables_content_state.bin으로 이동하여 선택하고 엽니다 (그림 03).
8. 다음에 시작하면 플레이어가 업데이트 된 콘텐츠를 로드합니다. 프로젝트가 릴리스되고 더 이상 내장 편집기 호스팅을 사용하지 않는 경우 새로 생성 된 파일을 원격 빌드 경로에서 라이브 서버로 복사 할 준비가 된 것입니다.
5. 로컬호스팅의 사용
learn.unity.com/tutorial/addressables-using-local-hosting?language=en
로컬 호스팅은 프로젝트 (기본 동작)와 함께 저장 및 배포되는 로컬로 패키징 된 어 드레서 블 에셋과 프로젝트가 개발중인 동안 Unity 에디터가 원격 서버를 에뮬레이션 할 수 있도록 로컬 서비스로 실행되는 Unity의 내장 HTTP 서버를 모두 의미합니다. . 로컬 머신에서 실행되는 프로젝트와 Unity 에디터에 대한 네트워크 액세스 권한이있는 모든 프로젝트는 로컬 호스팅을 사용하여 원격 서버에서 주소 지정 가능한 콘텐츠 다운로드를 시뮬레이션 할 수 있습니다.
로컬 호스팅 설정
1. 로컬 호스팅을 구성하려면 다음에서 Asset Management > Adressables > Hosting을 선택합니다. (그림01).
2. 호스팅 창에서 Create > Local Hosting을 클릭 합니다. Addressables시스템은 라이브 원격 서버를 에뮬레이트 하는 HTTP 호스팅 서비스 (그림02) 와 함께 제공 되므로 원격 호스팅된 콘텐츠를 사용할 프로젝트를 더 빠르게 개발할 수 있습니다.
3. 고급 사용자는 IHostingService 인터페이스를 구현하는 자체 사용자지정 호스팅 서비스 스크립트를 추가 할 수도 있습니다 (그림03). 사용자 지정 호스팅을 사용하면 인증 또는 실제 서버의 동작을 에뮬레이트하고 기본 HttpHostingService에서 다루지 않는 기타 작업을 구현할 수 있습니다. 이를 추가하려면 Create > Custom Service를 클릭 합니다.
4. 사용자 지정 호스팅 서비스는 이 자습서의 범위를 벗어나므로 사용자 지정 서비스 창을 닫습니다. 호스팅 서비스를 추가 한 후 활성화를 클릭하여 서버를 시작합니다 (그림04).
5. 호스팅 서비스가 시작되면 포트 번호가 무작위로 할당됩니다. 이 포트 번호는 유지되며 세션간에 사용됩니다. 다른 포트를 지정하려면 번호를 수동으로 변경하거나 재설정을 클릭하여 무작위로 다른 포트 번호를 생성합니다 (그림05).
6. 호스팅 서비스를 사용하려면 자산 그룹을 만들거나 선택하고 빌드 및 load path를 원격으로 설정 한 다음 프로젝트를 시작합니다 (그림06).
6. 프로필 시스템
learn.unity.com/tutorial/addressables-profile-system?language=en#5fadebf6edbc2a001fd99ced
프로필 시스템은 프로젝트 전체에서 사용되는 데이터의 중심 위치입니다. 한 곳에서 모든 주소 지정 가능 콘텐츠의 설정을 쉽게 변경할 수 있습니다. 여기에는 Addressable 콘텐츠에 대한 빌드 대상과 빌드 및 로드 경로가 포함됩니다. 모든 맞춤 변수를 쉽게 추가 할 수 있습니다. 예를 들어 원격 서버를 가리키도록 설정된 모든 그룹을 로컬로 변경하거나 편집기 호스팅 기능을 사용할 수 있습니다. 모든 프로필에는 동일하게 정의된 변수 집합이 포함되어 있지만 해당 변수의 값은 다를 수 있습니다 (또는 공백 일 수도 있음).
프로필을 사용하면 어드레서블 항목과 관련된 정보를 중앙에 저장할 수 있습니다.
변수에 대한 변경은 해당 변수를 참조하는 모든 자산이 아니라 여기 한 곳에서 관리됩니다.
프로필 관리
1. 프로젝트뷰에서 AddressableAssetSettings를 클릭하여 선택하여 Inspector(그림01) 또는 코드에서 현재 프로필을 선택합니다 .
2. 드롭다운을 사용하여 활성프로필을 설정합니다. 프로파일 관리를 클릭하여 새 프로파일 및 변수를 생성 할 수있는 어드레서블 프로파일 창을 엽니 다. ( 그림 02 )
3. 프로필 변수를 편집하려면 스프레드시트에서와 같이 필드를 클릭하여 편집합니다 (그림 03).
4. 목록에서 프로필을 마우스 오른쪽 버튼으로 클릭하여 활성화, 이름 변경 또는 삭제합니다 (그림 04).
프로필 선택
1. 어드레서블 그룹 창에서 어드레서블 프로파일을 선택합니다. 어드레서블 그룹 창에 액세스하려면 Window 드롭 다운을 사용하고 Asset Management > Addressables > Groups을 선택합니다 ( 그림 05 ).
2. 어드레서블 그룹 창에서 프로필을 변경합니다.
7. 스프라이트 로딩
learn.unity.com/tutorial/addressables-sprite-loading?language=en#5fb9665aedbc2a001fc450d0
Sprite 관련 하위 유형인 AssetReference를 통해 Sprite의 주소를 직접 지정하거나 Addressables를 사용하여 Sprite를 로드하는 방법을 살펴 봅니다. 개별 스프라이트(단일 스프라이트 모드), 스프라이트 시트의 일부인 스프라이트(다중 스프라이트 모드), 스프라이트 아틀라스에 저장된 스프라이트를 로드하는 방법을 다룰 것입니다.
그러나 Sprite와 그 유형에 관계없이 기본 프로세스는 동일하며로드 작업 완료시 호출되는 load 명령의 Completed 콜백에 대한 리스너를 등록하는 단일 행으로 구성됩니다.
[Method of loading assigned Sprite or Atlas].Completed += [code to be executed once Sprite is loaded];
[할당 된 Sprite 또는 Atlas를로드하는 방법]은 Sprite 유형 및 할당 방법에 따라 변경됩니다. [Sprite가로드되면 실행되는 코드]는 델리게이트이거나 간단한 경우 람다 표현식 일 수 있습니다.
어드레서블을 사용하여 non-아틀라스 스프라이트 로드
1. 이 연습에서는 Sprite를 가져 오거나 준비합니다. 스프라이트는 자체 텍스처 또는 스프라이트 시트의 일부일 수 있습니다.
2. 프로젝트뷰에서 스프라이트 또는 스프라이트 시트를 클릭하여 선택하고 Addressable이라고 표시된 상자를 표시합니다 (그림 01). 주소는 확인란 옆에 표시되며 직접 사용할 수 있습니다. 다음 연습에서 사용할 것이므로이 주소를 기록해 둡니다.
3. 빈 GameObject를 만들고 이름을 "Loader"로 지정합니다.
4. Sprite Renderer 구성 요소와 새 C#스크립트 AddressableSpriteLoader를 연결 합니다.
5. 다음 네임 스페이스를 스크립트와 주소 지정 가능을 사용해야하는 스크립트에 추가합니다. 그리고 Sprite Atlases를 사용할 예정이므로 다음을 추가합니다.
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
6. 클래스 정의 내에 다음 데이터 멤버를 추가합니다.
public AssetReferenceSprite newSprite;
private SpriteRenderer spriteRenderer;
7. Start() 내부에서 SpriteRenderer를 할당하고 Sprite로드를 호출합니다.
spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
newSprite.LoadAssetAsync().Completed += SpriteLoaded;
8. Start() 후에 SpriteLoaded를 생성합니다. SpriteRenderer에 할당하기 전에 Sprite가 성공적으로로드되었는지 확인합니다.
private void SpriteLoaded(AsyncOperationHandle<Sprite> obj)
{
switch (obj.Status)
{
case AsyncOperationStatus.Succeeded:
spriteRenderer.sprite = obj.Result;
break;
case AsyncOperationStatus.Failed:
Debug.LogError("Sprite load failed.");
break;
default:
// case AsyncOperationStatus.None:
break;
}
}
9. Hierarchy에서 Loader를 클릭하여 선택하십시오.
10. Inspector에서 Sprite Loader 구성 요소의 NewSprite 드롭 다운을 사용하여 주소 지정 가능한 Sprite를 할당합니다 ( 그림 02 ). AssetReferenceSprite를 지정했기 때문에 Sprite 유형의 어드레서블 자산만 목록에 표시됩니다.
11. 스프라이트 텍스처를 할당하면 드롭 다운이 왼쪽의 텍스처와 오른쪽의 스프라이트로 나뉩니다 (그림03). 단일 Sprite의 경우 유일한 옵션은 None 및 Sprite입니다. 스프라이트 시트의 경우 옵션은 None 및 all defined sub-Sprites이므로 동일한 텍스처에서 다른 스프라이트로 쉽게 변경할 수 있습니다.
12. 재생 모드에서 로드가 되는것을 확인합니다.
주소를 사용하여 직접 어드레서블 스프라이트 로드
사용자가 편집 한 콘텐츠 (예 : Super Mario Maker)를 허용하는 프로젝트의 경우처럼 게임 데이터가 JSON 또는 텍스트 파일에 저장되거나 런타임시 변경 될 수있는 경우 다음을 수행 할 수 있습니다. Sprite의 주소를 직접 지정하십시오.
1. 이전 실습에이어서 스크립트 편집기에서 SpriteLoader를 열고 다음 데이터 멤버를 추가합니다.
public string newSpriteAddress;
public bool useAddress;
2. Start()의 내용을 변경합니다.
spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
if (useAddress)
Addressables.LoadAssetAsync<Sprite>(newSpriteAddress).Completed += SpriteLoaded;
else
newSprite.LoadAssetAsync().Completed += SpriteLoaded;
3. Hierarchy에서 Loader를 클릭하여 선택하십시오.
4. Inspector에서 Use Address라고 표시된 상자를 선택합니다.
5. 이전 연습의 2 단계에서 스프라이트 텍스처의 주소를 기록하지 않은 경우 프로젝트 뷰에서 스프라이트 텍스처를 클릭하여 선택하고 주소를 복사합니다 (그림 01 참조). New Sprite Address라고 표시된 슬롯에 주소를 입력하거나 붙여 넣습니다 (그림 04).
6. 재생 모드에서 로드가 되는것을 확인합니다.
아틀라스 스프라이트 로드
1. Sprite Atlas를 준비하거나 가져옵니다.
2. 어드레서블(그림05)로 표시하고 주소를 기록해 둡니다.
3. 스프라이트 아틀라스와 소스 스프라이트 텍스처를 어드레서블로 표시하면 최종 에셋 번들에 중복 된 데이터가 포함됩니다. 이를 탐지하기위한 Addressables Analyze 규칙이 있습니다. 이 시나리오에서는 Sprite Atlas를 어드레서블로만 표시하는 것이 좋습니다. Atlas에서 사용 된 각 원본 스프라이트 텍스처에 대해 프로젝트보기에서 클릭하여 선택하고 Inspector에서 Addressable이라고 표시된 상자를 선택 취소합니다.
4. 스크립트 편집기에서 SpriteLoader.cs를 열고 데이터 멤버를 다음과 같이 변경합니다.
public AssetReferenceAtlasedSprite newAtlasedSprite;
public string spriteAtlasAddress;
public string atlasedSpriteName;
public bool useAtlasedSpriteName;
private SpriteRenderer spriteRenderer;
5. 프로덕션 시나리오에서는이 모든 것이 필요하지 않습니다. 여기에서는 Addressables에서 아틀라스 스프라이트를로드하는 여러 방법을 설명하는 데 사용됩니다.
6. Start()를 다음과 같이 변경합니다.
spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
if (useAtlasedSpriteName)
{
string atlasedSpriteAddress = spriteAtlasAddress + '[' + atlasedSpriteName + ']';
Addressables.LoadAssetAsync<Sprite>(atlasedSpriteAddress).Completed += SpriteLoaded;
}
else
{
newAtlasedSprite.LoadAssetAsync().Completed += SpriteLoaded;
}
7. Hierarchy에서 Loader를 클릭하여 선택하십시오.
8. Inspector (그림 06)에서 다음과 같이 변경합니다.
newSprite 라인이 newAtlasedSprite로 대체되었습니다. 왼쪽 드롭 다운에서 Sprite Atlas를 선택하고 오른쪽 드롭 다운에서 선택한 Sprite를 선택합니다. AssetReferenceSprite가 어드레서블 스프라이트 만 표시하는 것처럼 AssetReferenceAtlasedSprite는 왼쪽 드롭 다운의 주소 지정 가능 범위를 Sprite Atlases로 제한합니다.
9. Sprite Atlas Address에서 2 단계의 주소를 입력하거나 붙여 넣습니다.
10. Atlased Sprite Name에 선택한 Sprite의 이름을 입력합니다. 이것은 New Atlased Sprite라는 라인의 오른쪽 드롭 다운과 일치해야합니다.
11. 필요에 따라 Use Atlased Sprite Name을 선택합니다. 이것은 Sprite Atlas 주소 및 Altased Sprite Name의 주소를 구축하고 직접 사용합니다. Sprite Atlas의 이름이 UISpriteAtlas이고 Sprite의 이름이 UISpriteA 인 경우 Atlased Sprite의 주소는 다음과 같습니다.
UISpriteAtlas[UISpriteA]
12. 플레이시 Atlased Sprite가 로드되어야합니다.
13. Play Mode를 종료하고 Use Atlased Sprite Name이라는 상자를 선택 취소 (또는 아직 선택하지 않은 경우 선택) 한 다음 Play Mode로 다시 들어갑니다. 동작은 동일해야합니다.
Atlased Sprites에는 세번째 옵션이 있습니다. Sprite와 마찬가지로 Atlas를로드하고 도우미 함수를 사용하여 이름으로 Sprite를 찾을 수 있습니다.
14. Start ()의 내용을 다음과 같이 변경합니다.
spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
Addressables.LoadAssetAsync<SpriteAtlas>(spriteAtlasAddress).Completed += SpriteAtlasLoaded;
15. Start() 아래에서 새 함수 SpriteAtlasLoaded()를 만듭니다.
private void SpriteAtlasLoaded(AsyncOperationHandle<SpriteAtlas> obj)
{
switch (obj.Status)
{
case AsyncOperationStatus.Succeeded:
spriteRenderer.sprite = obj.Result.GetSprite(atlasedSpriteName);
break;
case AsyncOperationStatus.Failed:
Debug.LogError("Sprite load failed. Using default Sprite.");
break;
default:
// case AsyncOperationStatus.None:
break;
}
}
16. 플레이시 Atlased Sprite가 로드되어야합니다.
'Unity' 카테고리의 다른 글
ADB 블루스택 연결 (0) | 2021.05.06 |
---|
- Total
- Today
- Yesterday