C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4/C++: UMaterialInstanceDynamic を生成したり UPrimitive 的な何かにセットしたりするコードスニペット的なメモ

// ぱたーん1: マテリアルインスタンスダイナミックを複数の何かのマテリアルとして使いまわしたい場合

// 1.1. AActor 系のどこかなどで、とりあえずマテリアルインスタンスダイナミックをマテリアルアセットから作る:
auto m = UMaterialInstanceDynamic::Create( Cast< UMaterial >( StaticLoadObject( UMaterial::StaticClass(), nullptr, TEXT( "/Game/MyDir/MyMaterial" ) ) ), this );
// 1.2. UPrimitiveComponent 系の何か(UStaticMeshComponent など)にマテリアルをセットする:
constexpr auto element_index = 0;
mesh->SetMaterial( element_index , m );
// ぱたーん2: 使い回さず1つの UPrimitiveComponent 系の何かで使う程度の場合

// 2.1. いきなり作れてセットもできる
auto m = mesh->CreateAndSetMaterialInstanceDynamicFromMaterial( 0, Cast< UMaterial >( StaticLoadObject( UMaterial::StaticClass(), nullptr, TEXT( "/Game/MyDir/MyMaterial" ) ) ) );
// 2.optional. この方法でも使い回せる
mesh->SetMaterial( 1, m );
// appendix: UPrimitiveComponent は GetMaterial メンバー関数も持っているので、マテリアルを保持しなくて良い程度の用途はこれでも実装できる
mesh->SetMaterial( 1, mesh->GetMaterial( 0 ) );

参考