はじめに
EditorScripting機能を使って、外部からMaterial Instanceのパラメータを確認・変更する方法について の記事にて、「Material Instanceのパラメータを確認・設定する方法」について紹介しました。
-
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 にするなどの対応が必要かと思います。
#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);
}
#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.cpp
の CopyToSourceInstance
関数 と SetSourceInstance
関数
そして、EditorScripting機能を使って、外部からMaterial Instanceのパラメータを確認・変更する方法について で紹介した Update Material Instance
, Rebuild Material Instance Editors
を併用することで…
マテリアルインスタンス の Static Switch Parameter を Set する関数・ノードがなかったので追加してみた。良い感じにできたのでQiitaに書きまする #UE4 #UE4Study pic.twitter.com/muQ3vIg0ca
— おかず (@pafuhana1213) July 30, 2020
余談( override について )
ちなみに、今回作成したノードは Overrideが有効になっているStatic Switch Parameter しかパラメータ変更できません。 なぜなら、Instance->GetStaticParameters();
には Override が有効になっているパラメータしか含まれていないためです。
コレに関しては…さまざまな資料で念入りに注意されている通り、Static Switch Parameter の override の運用は十分に注意する必要がある ので下手に対応しない方が良いと思ってそのままにしています。
大規模タイトルにおけるエフェクトマテリアル運用
マテリアルの注意すべきこと!~テクスチャロードとSwitch~
マテリアルとマテリアルインスタンスの仕組みと問題点の共有
もし force override 的なフラグをノードに追加したい場合は…UpdateStaticPermutationを実行しているコード部分を参考に実装していくことになると思います。
おしまい