UE4 AssetUserData를 사용해보십시오

개요



UnrealEngine4의 AssetUserData에 대해 테스트를 해본 메모 쓰기입니다.

자산 사용자 데이터를 정의하고 설정하고 가져오려고 합니다.

환경



Windows10
Visual Studio 2017
UnrealEngine 4.22

참고



다음을 참고로 해 주셔서 감사합니다.
[UE4] Asset User Data란?
[UE4] 애니메이션계 애셋의 설정 항목 「MetaData」에 대해서

자산 사용자 데이터 정보



IInterface_AssetUserData를 통해 액세스할 수 있는 고유한 정의 데이터인 것 같습니다.
취득을 위한 메소드는 GetAssetUserDataOfClass 와 GetAssetUserDataArray 근처와 같습니다.

IInterface_AssetUserData



IInterface_AssetUserData 를 상속하고 있는 것은 현재, 이하 10 클래스와 같습니다.
- AWorldSettings
- UActorComponent
- UAnimationAsset
- UGeometryCache
- ULevel
- UMaterialInterface
- USkeletalMesh
- USkeleton
- UStaticMesh
- UTexture

구현



StaticMesh.cpp에서의 구현은 다음과 같은 느낌이 들었습니다.

StaticMesh.cpp
void UStaticMesh::AddAssetUserData(UAssetUserData* InUserData)
{
    if(InUserData != NULL)
    {
        UAssetUserData* ExistingData = GetAssetUserDataOfClass(InUserData->GetClass());
        if(ExistingData != NULL)
        {
            AssetUserData.Remove(ExistingData);
        }
        AssetUserData.Add(InUserData);
    }
}

UAssetUserData* UStaticMesh::GetAssetUserDataOfClass(TSubclassOf<UAssetUserData> InUserDataClass)
{
    for(int32 DataIdx=0; DataIdx<AssetUserData.Num(); DataIdx++)
    {
        UAssetUserData* Datum = AssetUserData[DataIdx];
        if(Datum != NULL && Datum->IsA(InUserDataClass))
        {
            return Datum;
        }
    }
    return NULL;
}

void UStaticMesh::RemoveUserDataOfClass(TSubclassOf<UAssetUserData> InUserDataClass)
{
    for(int32 DataIdx=0; DataIdx<AssetUserData.Num(); DataIdx++)
    {
        UAssetUserData* Datum = AssetUserData[DataIdx];
        if(Datum != NULL && Datum->IsA(InUserDataClass))
        {
            AssetUserData.RemoveAt(DataIdx);
            return;
        }
    }
}

const TArray<UAssetUserData*>* UStaticMesh::GetAssetUserDataArray() const 
{
    return &AssetUserData;
}

구현 테스트



UnrealC++에서 자산 사용자 데이터를 정의하고 정적 메시에 넣고 가져옵니다.

AssetUserData 만들기


  • 콘텐츠 브라우저를 마우스 오른쪽 버튼으로 클릭하고 새 C++ 클래스 만들기를 선택합니다.
  • 부모 클래스를 [AssetUserData]로 설정하여 적절한 위치로 클래스를 만듭니다.
  • 필요한 파라미터를 멤버 변수로 추가.
  • 빌드

  • ParamInt 와 ParamFloat 라고 하는 2 개를 갖게 해 constructor 으로 초기치를 설정하고 있습니다.

    MyAssetUserData.h
    #pragma once
    
    #include "CoreMinimal.h"
    #include "Engine/AssetUserData.h"
    #include "MyAssetUserData.generated.h"
    
    UCLASS()
    class TEST_API UMyAssetUserData : public UAssetUserData
    {
        GENERATED_BODY()
    
    public:
        // コンストラクタ
        UMyAssetUserData(const FObjectInitializer& ObjectInitializer);
    
    public:
        // Int型パラメータ
        UPROPERTY(Category = "UMyAssetUserData", EditAnywhere, BlueprintReadWrite)
            int         ParamInt;
        // Float型パラメータ
        UPROPERTY(Category = "UMyAssetUserData", EditAnywhere, BlueprintReadWrite)
            float       ParamFloat;
    };
    
    

    MyAssetUserData.cpp
    #include "MyAssetUserData.h"
    
    
    // コンストラクタ
    UMyAssetUserData::UMyAssetUserData(const FObjectInitializer& ObjectInitializer)
        : Super(ObjectInitializer)
    {
        ParamInt = 100;
        ParamFloat = 50.0f;
    
    }
    
    

    이 클래스(UMyAssetUserData)를 한층 더 상속해 상속처의 생성자로 프리셋을 만들어 둔다고 하는 사용법도 할 수 있습니다. (이 경우 블루프린트에서 상속하는 것이 프리셋 파라미터를 변경하기 쉽습니다.)

    AssetUserData 설정



    데이터를 갖고 싶은 대상의 StaticMesh를 엽니다.
    StaticMesh의 경우, [고급 상세도 표시]에 체크를 넣지 않으면 보이지 않으므로주의.



    [Asset User Data]를 추가하고 자신이 추가한 클래스를 선택합니다.



    매개변수를 편집할 수 있으므로 필요에 따라 수정할 수 있습니다.

    AssetUserData 얻기



    Actor -> StaticMeshComponent -> StaticMesh 와 추적하여 가서 취득한 예.
    for (TActorIterator<ATest>ActItr(GEngine->GameViewport->GetWorld()); ActItr; ++ActItr)
    {
        ATest* Test = *ActItr;
        // コンポーネントを取得
        auto _Component = Cast<UStaticMeshComponent>(Test->GetComponentByClass(UStaticMeshComponent::StaticClass()));
        // スタティックメッシュを取得
        auto _Mesh = _Component ? _Component->GetStaticMesh() : nullptr;
        // アセットユーザーデータインターフェイス取得
        IInterface_AssetUserData* Interface = Cast<IInterface_AssetUserData>(_Mesh);
    
        if (Interface != nullptr) {
            // アセットユーザーデータ
            auto _AssetUserData = Interface->GetAssetUserDataOfClass(UMyAssetUserData::StaticClass());
            UMyAssetUserData* _MyAUD = Cast<UMyAssetUserData>(_AssetUserData);
            if (_MyAUD) {
                // 取得結果
                UE_LOG(LogTemp, Log, TEXT("%d, %f"), _MyAUD->ParamInt, _MyAUD->ParamFloat);
            }
        }
    
    }
    
    

    검색에 성공하면 ParamInt 및 ParamFloat 수치가 출력 로그에 표시됩니다.

    요약



    비교적 범용성이 높기 때문에, 세세한 동작은 없이 어쨌든 확장 데이터를 원할 때는 유용할지도 모릅니다.
    비슷한 기능으로, 애니메이션계에 MetaData 라고 하는 것이 있는 것 같습니다, 이름이 매우 혼란스럽다.

    좋은 웹페이지 즐겨찾기