LoginSignup
11
10

More than 3 years have passed since last update.

UE4 Dynamic Material Instanceについてのメモ

Last updated at Posted at 2020-02-29

概要

UnrealEngine のダイナミックマテリアルインスタンスとマテリアルパラメータについてのメモ

更新履歴

日付 内容
2020/04/18 マテリアルパラメータの取得、テスクチャパラメータについて追記

環境

Windows10
Visual Studio 2017
UnrealEngine 4.24

参考

以下を参考にさせて頂きました、ありがとうございます。

UE4公式:マテリアル パラメータの作成方法
UE4公式:インスタンス化マテリアル
UE4でダイナミックマテリアルインスタンスをやってみた
UE4 マテリアルを使って点滅ダメージリアクションを実装する
UE4/C++: メッシュのマテリアルやテクスチャーをC++コードで制御する方法
UE4/C++: "UMaterialInstance::GetVectorParameterValue" の仕様変更と"Material Layers"

マテリアルにパラメータを設定する

マテリアルを開いてエディターの [パラメータ]->[ScalarParameter]や[VectorParameter]を選択して適用したいパラメータに設定します。他の計算(テクスチャカラーとの加算など)は別途行います。

Material_AddParam.jpg

SetMaterial_AddParam2.jpg

BPでのアクセス

ダイナミックマテリアルインスタンスを作成

メッシュからダイナミックマテリアルインスタンスを作成し、変数 MIDに保持します。コンストラクタや BeginPlay で行います。

createdynamicmaterialinstance.jpg

パラメータを入れる

保持した変数 MIDに対し、パラメータを設定します。スカラーパラメータとベクターパラメータを入れています。

SetMIDParam_BP.jpg

テクスチャパラメータを入れる場合は以下の様になります。Valueにテクスチャアセットを指定します。
SetTextureParameterValue.jpg

C++でのアクセス

ダイナミックマテリアルインスタンスを作成

対象のメッシュに設定されているマテリアルスロットからダイナミックマテリアルインスタンスを作成します。
以下コード例。

MyAnimInstance.cpp
#include "Materials/MaterialInstanceDynamic.h"

void UMyAnimInstance::NativeBeginPlay()
{
    class UMaterialInstanceDynamic* _MID = nullptr;
    // スロット名からインデックスに
    int32 _SlotIndex = GetSkeletalMeshComponent()->GetMaterialIndex(TEXT("SlotName"));

    // ダイナミックマテリアルインスタンスを作成
    _MID = GetSkeletalMeshComponent()->CreateDynamicMaterialInstance(_SlotIndex);

    // 作成したダイナミックマテリアルインスタンスを保持
    MID = _MID;
}

パラメータを入れる

作成したダイナミックマテリアルインスタンスにパラメータを設定します。
以下コード例

MyAnimInstance.cpp

class UMaterialInstanceDynamic* _MID;   // 設定対象のマテリアルインスタンス
if(_MID){
    // MIDのスカラーパラメータを設定する
    _MID->SetScalarParameterValue(TEXT("Speed"), 2.0f);

    // MIDのベクターパラメータを設定する
    _MID->SetVectorParameterValue(TEXT("Color"), FLinearColor(1.0f, 0.0f, 0.0f));
}

パラメータの消去

外部設定をしたパラメータをクリアします。パラメータ別で消すようなものはないようです。

.cpp
class UMaterialInstanceDynamic* _MID;   // 対象のマテリアルインスタンス

if(_MID){
    // 設定したパラメータを全部クリアする
    _MID->ClearParameterValues();
}

マテリアルパラメータの取得

ParamGroup.jpg

スカラーパラメータ、ベクターパラメータ、テクスチャパラメータなどマテリアルが持っているパラメータについて以下C++コード例。

マテリアルのスカラーパラメータ名を取得する

.cpp

for (const FSkeletalMaterial& _Mt : _SkeletalMesh->Materials) {
    TArray<FMaterialParameterInfo> _ParamInfo;
    TArray<FGuid> _ParamIds;
    _Mt.MaterialInterface->GetAllScalarParameterInfo(_ParamInfo, _ParamIds);

    // スカラーパラメータを全部表示
    for (int _Lp=0;_Lp<_ParamInfo.Num();_Lp++){
        UE_LOG(LogTemp, Log, TEXT("%s"), *_ParamInfo[_Lp].Name.ToString());
    }
}

マテリアルの特定スカラーパラメータ値を取得する

.cpp
// スケルタルメッシュのマテリアルパラメータ "TestParam" を取得する
for (const FSkeletalMaterial& _Mt : _SkeletalMesh->Materials) {
    float _Buff = 0.0f;
    bool _Ret = _Mt.MaterialInterface->GetScalarParameterValue(FName("TestParam"), _Buff);

    if(_Ret){
        // マテリアル名とパラメータ値を表示
        UE_LOG(LogTemp, Log, TEXT("%s, %f"), *_Mt.MaterialSlotName.ToString(), _Buff);
    }
}

テクスチャパラメータを設定する

設定するテクスチャは別途ロードしないとなりません。

.cpp
class UMaterialInstanceDynamic* _MID;   // 対象のマテリアルインスタンス
UTexture* _Tex = nullptr;

_Tex = GetTexture();    // ロード済テクスチャを設定する
_MID->SetTextureParameterValue(TEXT("TexParam"), _Tex);

まとめ

マテリアルの制御はいろいろあり複雑です。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10