새소식

개발/UE4

[UE4/Editor] MaterialInstance의 StaticSwitch 강제 활성화하기

  • -

https://qiita.com/EGJ-Kaz_Okada/items/0bf77ac5f920715e515b

 

[UE4] EditorScripting機能を使って、外部からMaterial Instanceのパラメータを確認・変更する方法につい

はじめに 一定程度の規模のプロジェクトになると、おそらく大量のMaterial Instanceの管理に頭を悩ませることになるかと思います。 参考:大規模タイトルにおけるエフェクトマテリアル運用

qiita.com

MaterialInterface를 상속받는 클래스로 Material과 MaterialInstance가 있다.

이 중 Material에는 StaticSwitchParameter를 수정하는 함수가 내부 구현되어 있지만, MaterialInstance는 이에 대한 권한이 없다고 판단하여 기능이 내제되어 있지 않다.

하지만 개발 중 대규모 마테리얼의 편집이 필요한 시점에서 이런 기능은 필연적으로 필요하다.

이에 찾아 본 내용이 위 일본 언리얼엔진 사이트 내용인데, 해당 내용에서는 override가 활성화 되지 않은 프로퍼티에 대한 경우를 따로 적어주지 않았다.

 

그래서 아래와 같이 구현하여 사용 중 이다.

void UEditorBlueprintFunctionLibrary::SetStaticSwitchParameterValueInEditor(UMaterialInstance* MaterialInstance,
                                                                            const FName ParameterName,
                                                                            const bool bValue)
{
	if (MaterialInstance == nullptr)
	{
		return;
	}
	FStaticParameterSet StaticParameters = MaterialInstance->GetStaticParameters();
	
	bool bHasOverrideValue = false;
	for (auto& SwitchParameter : StaticParameters.StaticSwitchParameters)
	{
		if (SwitchParameter.ParameterInfo.Name.IsEqual(ParameterName))
		{
			SwitchParameter.Value = bValue;
			bHasOverrideValue = true;
			break;
		}
	}
	if (bHasOverrideValue == false)
	{
		FStaticSwitchParameter NewParam;
		NewParam.ParameterInfo.Name = ParameterName;
		NewParam.Value = bValue;
		NewParam.bOverride = true;
		NewParam.ParameterInfo.Index = INDEX_NONE;
		StaticParameters.StaticSwitchParameters.Add(NewParam);
	}
	MaterialInstance->MarkPackageDirty();
	MaterialInstance->PreEditChange(nullptr);
	MaterialInstance->PostEditChange();
	
	MaterialInstance->UpdateStaticPermutation(StaticParameters);
	FEditorDelegates::RefreshEditor.Broadcast();
	FEditorSupportDelegates::RedrawAllViewports.Broadcast();
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.