어드레서블 에셋 정리
에셋을 정리하는 가장 좋은 방법은 각 프로젝트의 특정 요구 사항에 따라 다릅니다. 프로젝트에서 에셋을 관리하는 방법을 계획할 때 고려할 사항은 다음과 같습니다.
- 논리적 구성: 에셋을 논리적 카테고리로 정리하면 더 손쉽게 구성을 이해하고 제자리를 벗어난 항목을 찾을 수 있습니다.
- 런타임 성능: 에셋 번들의 크기가 커지거나 에셋 번들이 많아지면 성능 면에서 병목 현상이 발생할 수 있습니다.
- 런타임 메모리 관리: 함께 사용하는 에셋을 한곳에 보관하여 최대 메모리 요구량을 낮출 수 있습니다.
- 규모: 에셋을 정리하는 일부 방법은 작은 게임에서는 잘 작동하지만 큰 게임에서는 작동하지 않을 수 있으며, 그 반대의 경우도 마찬가지입니다.
- 플랫폼 특성: 플랫폼의 특성과 요구 사항은 에셋을 정리하는 방법에 있어 중요한 고려 사항이 될 수 있습니다. 몇 가지 예를 들어 보겠습니다.
- 풍부한 가상 메모리를 제공하는 플랫폼은 가상 메모리가 제한된 플랫폼보다 큰 번들 크기를 더 효과적으로 처리할 수 있습니다.
- 일부 플랫폼은 콘텐츠 다운로드를 지원하지 않으므로 에셋의 원격 배포를 완전히 제외합니다.
- 일부 플랫폼은 에셋 번들 캐싱을 지원하지 않으므로 가능하면 에셋을 로컬 번들에 넣는 것이 더 효율적입니다.
- 배포: 콘텐츠를 원격으로 배포할지 여부는 원격 콘텐츠와 로컬 콘텐츠를 분리해야 한다는 것을 의미합니다.
- 에셋 업데이트 빈도: 자주 업데이트할 것으로 예상되는 에셋과 업데이트할 계획이 거의 없는 에셋을 분리해 두십시오.
- 버전 관리: 동일한 에셋 및 에셋 그룹에서 작업하는 사람이 많을수록 프로젝트에서 버전 관리 충돌이 발생할 가능성이 더 커집니다.
일반 전략
에셋을 정리하는 일반적인 전략은 다음과 같습니다.
- 동시 사용: 특정 레벨의 모든 에셋과 같이 동시에 로드하는 에셋을 함께 그룹화합니다. 이 전략은 장기적으로 가장 효율적이며, 프로젝트의 최대 메모리 사용량을 줄이는 데 도움이 될 수 있습니다.
- 논리적 엔티티: 동일한 논리적 엔티티에 속한 에셋을 함께 그룹화합니다. 예를 들어 UI 레이아웃 에셋, 텍스처, 음향 효과 등을 함께 그룹화할 수 있습니다. 또는 캐릭터 모델과 애니메이션도 가능합니다.
- 유형: 같은 유형의 에셋을 함께 그룹화합니다. 음악 파일, 텍스처 등을 예로 들 수 있습니다.
프로젝트의 요구 사항에 따라 특정 전략이 다른 전략보다 더 적합할 수 있습니다. 예를 들어 레벨이 많은 게임에서는 동시 사용량에 따라 정리하는 것이 프로젝트 관리와 런타임 메모리 성능 측면에서 가장 효율적일 수 있습니다.
동시에 에셋 유형에 따라 서로 다른 전략을 사용할 수도 있습니다. 예를 들어 레벨 기반 게임에서는 메뉴 화면의 UI 에셋을 모두 함께 그룹화할 수 있지만, 그렇지 않은 경우 레벨 데이터를 별도로 그룹화할 수 있습니다. 레벨에 대한 에셋이 포함된 그룹을 특정 에셋 유형이 포함된 번들로 패킹할 수도 있습니다.
자세한 내용은 에셋 번들을 위한 에셋 준비를 참조하십시오.
로드된 에셋을 안전하게 편집
다음과 같은 상황에서는 로드된 에셋을 안전하게 편집할 수 있습니다.
- 에셋이 에셋 번들에서 로드된 경우
- 애플리케이션이 에디터가 아닌 플레이어에서 실행 중인 경우
- Play Mode Script에서 Use Existing Build (requires built groups) 옵션을 활성화한 경우
이 경우 에셋은 활성 메모리에 사본으로 존재합니다. 이렇게 복사된 에셋에 대한 변경 사항은 디스크에 저장된 에셋 번들에 영향을 미치지 않으며, 어떤 변경 사항도 세션 간에 유지되지 않습니다.
플레이 모드 설정에서 Use Asset Database (fastest) 프로퍼티를 활성화한 경우 등 다른 상황에서는 Unity가 프로젝트 파일에서 에셋을 직접 로드합니다. 따라서 Unity는 런타임 중에 에셋에 대해 발생한 모든 수정 사항을 Project Asset 파일에 저장하며, 이러한 변경 사항은 여러 세션 간에 유지됩니다.
에셋을 런타임에 변경하려면, 변경하려는 경우 게임 오브젝트의 새 인스턴스를 생성하고 그 사본을 런타임 변경에 사용합니다. 이렇게 하면 실수로 원본 에셋 파일을 변경할 위험을 없앨 수 있습니다. 다음 코드 예제는 로드된 에셋의 새 사본을 생성하는 방법을 보여 줍니다.
var op = Addressables.LoadAssetAsync<GameObject>("myKey");
yield return op;
if (op.Result != null)
{
GameObject inst = UnityEngine.Object.Instantiate(op.Result);
// can now use and safely make edits to inst, without the source Project Asset being changed.
}
이 예제 메서드를 사용하여 에셋의 사본을 만드는 경우 다음에 주의하십시오.
- 에셋을 릴리스할 때는 에셋의 현재 인스턴스가 아닌 원본 에셋 또는
AsyncOperationHandle
을 사용해야 합니다. - 다른 에셋에 대한 레퍼런스가 있는 에셋을 이러한 방식으로 인스턴스화할 경우 Unity는 참조된 에셋의 새 인스턴스를 생성하지 않습니다. 새로 인스턴스화된 사본에 대한 레퍼런스는 원본 프로젝트 에셋을 대상으로 합니다.
- Unity는 새 인스턴스에서
Start()
,OnEnable()
,OnDisable()
과 같은MonoBehaviour
메서드를 호출합니다.