TIL - 19 (데이터 에셋)

jh Seo·2024년 8월 30일

데이터 에셋

데이터 에셋 인스턴스에 데이터를 저장해서 사용한다.

c++ 클래스 만들기를 통해 만들 수 있다.


DECLARE_MULTICAST_DELEGATE(FOnUMaterialAndMeshDataAssetChanged)

/**
 * 
 */
UCLASS()
class KDT3D_API UMaterialAndMesh : public UDataAsset
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, Category = "myDataAsset")
	UStaticMesh* Mesh = nullptr;
	
	UPROPERTY(EditAnywhere, Category = "myDataAsset")
	UMaterial* Material = nullptr;


public:
#if WITH_EDITOR

	virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;

	FOnUMaterialAndMeshDataAssetChanged OnUMaterialAndMeshDataAssetChanged;
#endif
};

생성되면 이런식으로 UDataAsset을 상속받는다.

	UStaticMeshComponent* Body;

	Body->SetStaticMesh(MaterialAndMeshData->Mesh);
	Body->SetMaterial(0, MaterialAndMeshData->Material);

후에 다른 클래스에서 위와 같은 식으로 데이터 에셋의 값을 바로 넣어줄 수 있다.

뭔가 유니티의 스크립터블 오브젝트처럼 데이터 컨테이너의 역할을 하는 느낌이다.

또한

 void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;

위 함수는 에디터에서 값이 변경되었을 때 호출되는 함수로
언리얼의 delegate 매크로인

DECLARE_MULTICAST_DELEGATE(FOnUMaterialAndMeshDataAssetChanged)

을 사용해서 delegate 처리를 해준다.

MaterialAndMesh.cpp 내부에

#if WITH_EDITOR
void UMaterialAndMesh::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	Super::PostEditChangeProperty(PropertyChangedEvent);
	OnUMaterialAndMeshDataAssetChanged.Broadcast();
}
#endif

이런 식으로 구현을 한다면 값이 변경된다면
OnUMaterialAndMeshDataAssetChanged에 할당된 함수들을 전부 호출해준다.

profile
코딩 창고!

0개의 댓글