※この記事で使用している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にアップされています。