※この記事で使用しているUnrealのVersionは04.26.0です。

※この記事のサンプルプロジェクトは以下URLにアップされています。

サンプルプロジェクト

【UE4】新しくなったMaterialのCustomノードの使い方 【★★★】

で説明しましたが、Engine内や自作のush,usfファイルを正式にIncludeできるようになりました。

しかしここでちょっとした問題が起こったりもします。

「どのマテリアルでどのシェーダーファイルが使われているかわからない」

ということです。

IncludeはMaterialExpressionCustomNodeで行いますが、それはマテリアル、あるいはマテリアルファンクションを開かないと確認しにいけません。

これは若干面倒です。

BlueprintEditorのようにすべてのマテリアルに対して検索できるような機能はデフォルトではついてないようですし…。

ので、EditorUtilityWidgetで簡易的なものを作ってみました。

※MaterialだけならばBlueprintOnlyでもできたのですが、MaterialFunctionも内包しているMaterialの場合はMaterialFunction内のCustomNodeをBlueprintで取れなかったためC++を使ってます。
(本来はC++Onlyの方が超絶作りやすいです)

※メモなので超絶雑説明です(キャプだけ)
詳しく知りたい場合はプロジェクトファイルダウンロードしてみてください。

↓テストのマテリアル

↓テストのマテリアルファンクション

Custom01のIncludePaths

/Engine/Private/SceneTexturesCommon.ush

Custom02のIncludePaths

/Engine/Private/EyeAdaptationCommon.ush

Custom03のIncludePaths

/Engine/Private/Random.ush

Custom_InFunctionのIncludePaths

/Engine/Private/SobolRandom.ush

EditorUtilityWidgetの中

GetAllCustomExpressionIncludePathsの中

GetCustomExpressionIncludePathsの中

GetAllCustomExpressionsの中

GetAllMaterialExpressionsの中

GetAllMaterialExpressionsInFunctionの中

GetMaterialFunctionByFunctionExpressionの中

追加したC++クラス:UMyBlueprintFunctionLibraryの中身

MyBlueprintFunctionLibrary.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

/**
 * 
 */
UCLASS()
class KA_CUSTOMINCLUDE_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:

	UFUNCTION(BlueprintCallable)
		static TArray<class UMaterialExpression*> GetMaterialExpressions(UMaterial* InMaterial);

	UFUNCTION(BlueprintCallable)
		static TArray<class UMaterialExpression*> GetMaterialExpressionsInFunction(UMaterialFunction* InMaterialFunction);
	
};

MyBlueprintFunctionLibrary.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyBlueprintFunctionLibrary.h"

TArray<class UMaterialExpression*> UMyBlueprintFunctionLibrary::GetMaterialExpressions(UMaterial* InMaterial)
{
	TArray<class UMaterialExpression*> ReturnValue;
	if (!InMaterial)
	{
		return ReturnValue;
	}

	ReturnValue = InMaterial->Expressions;

	return ReturnValue;
}

TArray<class UMaterialExpression*> UMyBlueprintFunctionLibrary::GetMaterialExpressionsInFunction(UMaterialFunction* InMaterialFunction)
{
	TArray<class UMaterialExpression*> ReturnValue;
	if (!InMaterialFunction)
	{
		return ReturnValue;
	}

	ReturnValue = InMaterialFunction->FunctionExpressions;

	return ReturnValue;
}

これを実行します。

ちゃんとIncludePathを取得できているのがわかります。

※注意:
作成したMaterialExpressionを取得するC++関数は、
Material内でピンがつながっていない場合も取得してしまいます。

つながっているノードだけ取得もできそうでしたが、本記事では説明しません(ほぼ自分用メモとなります)

以上

※この記事のサンプルプロジェクトは以下URLにアップされています。

サンプルプロジェクト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です