데이터 에셋 인스턴스에 데이터를 저장해서 사용한다.
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에 할당된 함수들을 전부 호출해준다.