UE4 AssetUserData를 사용해보십시오
14705 단어 위 4UnrealEngine4UnrealC++
개요
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.cppvoid 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 만들기
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 만들기
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 라고 하는 것이 있는 것 같습니다, 이름이 매우 혼란스럽다.
Reference
이 문제에 관하여(UE4 AssetUserData를 사용해보십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/unknown_ds/items/1c46c700bc1938c508c1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(UE4 AssetUserData를 사용해보십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/unknown_ds/items/1c46c700bc1938c508c1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)