UE4 Dynamic Material Instance에 대한 메모

개요



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를 선택하여 적용할 파라미터로 설정합니다. 다른 계산(텍스처 컬러와의 가산 등)은 별도로 실시합니다.





BP로 액세스



동적 머티리얼 인스턴스 생성



메쉬에서 동적 머티리얼 인스턴스를 만들고 변수MID에 보관합니다. 생성자나 BeginPlay 로 합니다.



매개변수 넣기



보유한 변수MID에 대해 매개변수를 설정합니다. 스칼라 파라미터와 벡터 파라미터를 넣고 있습니다.



텍스처 파라미터를 넣는 경우는 다음과 같습니다. Value에 텍스처 자산을 지정합니다.


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();
}


머티리얼 파라미터 얻기





스칼라 파라미터, 벡터 파라미터, 텍스처 파라미터 등 머티리얼이 가지고 있는 파라미터에 대해서 이하 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);

요약



머티리얼의 제어는 여러 가지로 복잡합니다.

좋은 웹페이지 즐겨찾기