본문 바로가기
Unity/어드레서블 에셋 시스템

어드레서블 에셋 시스템 - 개념: 어드레서블 에셋, Filtered AssetReference

by PlaneK 2020. 6. 16.

어드레서블 에셋

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using UnityEngine.AddressableAssets;
 
public class BasicReference : MonoBehaviour
{
    public AssetReference assetReference;
 
    public void SpawnThing()
    {
        assetReference.InstantiateAsync();
    }
}
 

어드레서블을 참조하기 위해 AssetReference타입의 필드를 선언한다.

AssetReference 필드에 에셋을 할당하려면 해당 에셋은 Addressable 이어야 한다.

Addressable 에셋 그룹에 에셋 추가하기

에셋 그룹을 생성하고 Default 에셋 그룹을 지정한다.

어드레서블이 된 에셋은 Default 에셋 그룹에 추가된다.

에셋을 어드레서블에 추가하는 방법은 총 3가지가 있다.

ㆍ해당 에셋을 특정 어드레서블 에셋 그룹에 Drag&Drop 하기.

ㆍ해당 에셋의 Inspector 뷰에서 Addressable 체크박스 체크하기.

ㆍ해당 에셋을 AssetRefercne 필드에 Drag&Drop 하기. 자동으로 어드레서블의 Defalut 에셋 그룹에 해당 에셋이 추가된다.

 

Filtered AssetReference

AssetReference는 GameObject(프리팹), Material, Sprite 등 타입에 관계없이 모두 Object로 저장하고 있다.

즉, 타입에 상관없이 어드레서블이라면 Inspector뷰에서 모두 Drag&Drop하여 저장이 가능하다.

한편 사용자의 스크립트 상에서는 이 필드의 타입을 직관적으로 파악할 수 없다.

( "Inspector뷰에서 확인하거나 필드 식별자에 표시해도 되지만..." )

또 Drag&Drop의 실수로 GameObject가 아닌 개체를 InstantiateAsync하여 에러를 발생시킬 수 있다.

필터드 에셋레퍼런스를 만들어서 특정 타입만 Drag&Drop(할당) 할 수 있도록 타입을 필터링 해보자.

Built-in Filtered AssetReference

GameObject 타입은 이미 정의되있다. 위 타입을 필드로 선언하면 GameObject 외 다른 타입의 오브젝트는 할당할 수 없다.

필터드 에셋 레퍼런스를 작성하기 위해 위 AssetReference<T>를 상속한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class FilteredReferences : MonoBehaviour
{
    // [Serializable] 속성으로 Inspector뷰에 노출시킬 수 있다. "직렬화 대상"
    [Serializable]
    public class AssetReferenceMaterial : AssetReferenceT<Material>
    {
        // guid를 받는 생성자를 정의한다.
        public AssetReferenceMaterial(string guid) : base(guid) { }
    }
 
    // GameObject은 이미 정의된 빌트인 AssetRefence를 통해 사용할 수 있다.
    public AssetReferenceGameObject assetReferenceGameObject;
    // 새로 정의한 각 타입 별 AssetReference를 필드로 선언
    public AssetReferenceMaterial assetReferenceMaterial;
}
 

그리고 생성자만 정의해주면 끝이다.

이제 해당 필드는 대상 타입 이외 다른 타입은 Drag&Drop으로 할당할 수 없다.

댓글