[언리얼 엔진] 애셋 레지스트리

    애셋 레지스트리

    애셋 레지스트리(Asset Registry)는 에디터가 로드되면서 로드되지 않은 애셋 정보를 비동기적으로 모으는 에디터 기능이다. 콘텐츠 브라우저에서 사용하지만 에디터 코드의 어디에서나 사용 가능하다.

    애셋 목록 구하기

    애셋 레지스트리 모듈을 로드한다음 Module.Get().GetAssetsByClass()를 부르면 된다.
    FAssetData 의 목록을 반환 한다.

    FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    TArray<FAssetData> AssetData;
    const UClass* Class = UStaticMesh::StaticClass();
    AssetRegistryModule.Get().GetAssetsByClass(Class, AssetData);

    FAssetData를 UObject* 로 변환

    FAssetData 오브젝트는 FAssetData가 가르키는 UObject* 를 GetAsset() 함수로 얻을수 있다. 필요한 애셋을 로드한 후 반환한다.

    필터 만들기

    GetAssets()를 부를 때 FARFilter를 제공하여 필터링되는 애셋 목록을 만들수 있다.

    • PackageName
    • PackagePath
    • Collection
    • Class
    • Tag/Value 짝

    Class와 PackagePath 필터 사용 예

    FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    TArray<FAssetData> AssetData;
    FARFilter Filter;
    Filter.Classes.Add(UStaticMesh::StaticClass());
    Filter.PackagePaths.Add("/Game/Meshes");
    AssetRegistryModule.Get().GetAssets(Filter, AssetData);

    태그와 값

    FASsetData 오브젝트에는 TagsAndValue라는 이름과 값 매핑이 있다. 애셋의 프로퍼티 값과 연관되 값의 목록이다. 이 정보는 UAsset 파일의 헤더에서 수집된다. 애셋 레지스트리는 AssetRegistrySearchable UPROPERTY() 설정된 프로퍼티만 적용된다.

    /** 이 텍스처를 샘플링할 때 사용할 텍스처 필터링 모드입니다. */
    UPROPERTY(Category=Texture, AssetRegistrySearchable)
    TEnumAsByte<enum TextureFilter> Filter;

    애셋 레지스트리에서 UPROPERTY가 아닌 정보를 검색하려면, 애셋 클래스에서 가상함수 GetAssetRegistryTags()를 직접 구현하면 된다. GetAssetRegistryTags는 UObject를 상속 받는다.

    비동기 데이터 수집

    애셋 레지스트리는 UAsset 파일을 비동기식으로 읽기에, 추가, 제거, 변경, 로드완료, 업데이트에 대한 델리게이트 콜백을 제공한다. 애셋 레지스트리 모듈을 로드하고 IAssetRegistry에 제공된 함수를 사용하여 델리게이트에 등록한다.

    /** 레지스트리에 애셋이 추가될 때에 대한 콜백을 등록/해제합니다.  */
    virtual FAssetAddedEvent& OnAssetAdded() = 0;
    
    /** 레지스트리에서 애셋이 제거될 때에 대한 콜백을 등록/해제합니다. */
    virtual FAssetRemovedEvent& OnAssetRemoved() = 0;
    
    /** 레지스트리에 애셋 이름이 변경될 때에 대한 콜백을 등록/해제합니다. */
    virtual FAssetRenamedEvent& OnAssetRenamed() = 0;
    
    /** 애셋 레지스트리가 파일 로드를 완료했을 때에 대한 콜백을 등록/해제합니다. */
    virtual FFilesLoadedEvent& OnFilesLoaded() = 0;
    
    /** 백그라운드 파일 로드 진행상황 업데이트를 위한 콜백을 등록/해제합니다. */
    virtual FFileLoadProgressUpdatedEvent& OnFileLoadProgressUpdated() = 0;
    
    /** 현재 애셋 레지스트리가 파일을 로드중이라 모든 애셋에 대해 알지 못하면 참을 반환합니다. */
    virtual bool IsLoadingAssets() = 0;

    예시

    void FMyClass::FMyClass()
    {
        // 업데이트 감지를 위해 애셋 레지스트리 모듈을 로드합니다.
        FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
        AssetRegistryModule.Get().OnAssetAdded().AddRaw( this, &FMyClass::OnAssetAdded );
    }
    
    FMyClass::~FMyClass()
    {
        // 델리게이트 등록해제를 위해 애셋 레지스트리 모듈을 로드합니다.
        FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
        AssetRegistryModule.Get().OnAssetAdded().RemoveAll( this );
    }
    
    void FMyClass::OnAssetAdded(const FAssetData& AssetData)
    {
        // 애셋 레지스트리가 애셋을 발견했습니다.
        // 즉 방금 생성되었거나 방금 디스크에서 찾았다는 뜻입니다.
        // 이 함수의 코드가 빠른지 확인, 아니면 수집 프로세스가 늦춰집니다.
    }
    반응형

    댓글

    Designed by JB FACTORY