LoginSignup
10
9

More than 3 years have passed since last update.

[UE4]Material Instance の Static Switch Parameter を 変更する関数・ノードを作る方法について

Last updated at Posted at 2020-07-31

はじめに

EditorScripting機能を使って、外部からMaterial Instanceのパラメータを確認・変更する方法について の記事にて、「Material Instanceのパラメータを確認・設定する方法」について紹介しました。

image.png

  • Get

    • UMaterialEditingLibrary::GetMaterialInstanceScalarParameterValue
    • UMaterialEditingLibrary::GetMaterialInstanceTextureParameterValue
    • UMaterialEditingLibrary::GetMaterialInstanceVectorParameterValue
    • UMaterialEditingLibrary::GetMaterialInstanceStaticSwitchParameterValue
  • Set

    • UMaterialEditingLibrary::SetMaterialInstanceScalarParameterValue
    • UMaterialEditingLibrary::SetMaterialInstanceTextureParameterValue
    • UMaterialEditingLibrary::SetMaterialInstanceVectorParameterValue

しかし、よくよく見ると… StaticSwitchParameter を変更するために必要な SetMaterialInstanceStaticSwitchParameterValue がありません!こりゃ困った!

ということで作ってみました。残念ながらC++が必要になります。

検証環境:UE4.25.3

SetMaterialInstanceStaticSwitchParameterValue の作り方

早速ですがC++コードです。今回は説明のために極力シンプルにしてますが、実運用するときは EditorOnly にするなどの対応が必要かと思います。

MyBlueprintFunctionLibrary.h
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class ●●●●●_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    UFUNCTION(BlueprintCallable)
    static void SetMaterialInstanceStaticSwitchParameterValue(UMaterialInstance* Instance, FName ParameterName, bool Value);
}
MyBlueprintFunctionLibrary.cpp
#include "MyBlueprintFunctionLibrary.h"
#include "Materials/MaterialInstance.h"

void UMyBlueprintFunctionLibrary::SetMaterialInstanceStaticSwitchParameterValue(UMaterialInstance* Instance, FName ParameterName, bool Value)
{
    FStaticParameterSet StaticParameters = Instance->GetStaticParameters();
    for (auto& SwitchParameter : StaticParameters.StaticSwitchParameters)
    {
        if (SwitchParameter.ParameterInfo.Name == ParameterName)
        {
            SwitchParameter.Value = Value;
            break;;
        }
    }
    Instance->UpdateStaticPermutation(StaticParameters);
}

実装するにあたって参考にした箇所
Engine\Source\Editor\UnrealEd\Private\PreviewMaterial.cppCopyToSourceInstance 関数 と SetSourceInstance 関数

出来上がり!
image.png

そして、EditorScripting機能を使って、外部からMaterial Instanceのパラメータを確認・変更する方法について で紹介した Update Material Instance, Rebuild Material Instance Editors を併用することで…

余談( override について )

ちなみに、今回作成したノードは Overrideが有効になっているStatic Switch Parameter しかパラメータ変更できません。 なぜなら、Instance->GetStaticParameters(); には Override が有効になっているパラメータしか含まれていないためです。

コレに関しては…さまざまな資料で念入りに注意されている通り、Static Switch Parameter の override の運用は十分に注意する必要がある ので下手に対応しない方が良いと思ってそのままにしています。

大規模タイトルにおけるエフェクトマテリアル運用
マテリアルの注意すべきこと!~テクスチャロードとSwitch~
マテリアルとマテリアルインスタンスの仕組みと問題点の共有

もし force override 的なフラグをノードに追加したい場合は…UpdateStaticPermutationを実行しているコード部分を参考に実装していくことになると思います。

おしまい

10
9
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
10
9