ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UE4・UE5】〈Tips〉ブループリントグラフを生成するエディタユーティリティを作る

目次

 

はじめに

ブループリントにはグラフを複数作成することができますが、皆さんは使ったことがあるでしょうか?

EventGraphにすべてを記述するとどんどん肥大化して、ノードを探すのにも一苦労といったことになりがちです。

そこで、機能やネットワークポリシーなどでグラフを分割して管理すると、可読性の向上やチーム開発においてはマージのしやすさなどの恩恵があります。

そんなグラフですがテンプレートのような形で毎回手動で作るのはめんどくさいですよね!
そんな悩みを解決するエディタユーティリティを作るため、グラフを自動生成するノードを作ってみました。

 

▽できること

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

C++でのプロジェクトビルド環境必須です。

UE5.4.3で解説します。

 

解説

①エディタモジュールの配置

エディタ専用のノードなのでエディタモジュールに実装します。

モジュールについては以下の記事が分かりやすいので、こちらを参考にエディタ用のモジュールを作りましょう。

historia.co.jp

strv.dev

 

②モジュールの追加

エディタモジュールのDependencyModuleNamesに以下の要素を追加しておきます。

PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"UnrealEd", // 追加
"BlueprintGraph" // 追加
});

 

③コードの追加

エディタモジュールのPublicフォルダに以下を作ります。

 

▽CustomEditorUtilityNode.h

#pragma once

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

UCLASS()
class YOUR_API UCustomEditorUtilityNode : public UBlueprintFunctionLibrary
{
GENERATED_BODY()

public:

#if WITH_EDITOR
/** Adds an event graph to the specified Blueprint.
*
* @param Blueprint Target Blueprint
* @param GraphName Create a new graph with this name
* @return bool True if the graph was added successfully
*/
UFUNCTION(BlueprintCallable, Category = "CustomEditorUtility", meta=(OnlyIncludeInEditor))
static bool AddGraphToBlueprint(UBlueprint* Blueprint, const FString& GraphName);
#endif
};
 

 

▽CustomEditorUtilityNode.cpp


#include "CustomEditorUtilityNode.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include "Kismet2/KismetEditorUtilities.h"

bool UCustomEditorUtilityNode::AddEGraphToBlueprint(UBlueprint* Blueprint, const FString& GraphName)
{
if (!Blueprint)
{
UE_LOG(LogTemp, Error, TEXT("Blueprint is null!"));
return false;
}

// すでに同じ名前のイベントグラフが存在しないか確認
for (const UEdGraph* Graph : Blueprint->UbergraphPages)
{
if (Graph->GetName() == GraphName)
{
UE_LOG(LogTemp, Warning, TEXT("Graph '%s' already exists!"), *GraphName);
return false;
}
}

// 新しいイベントグラフを作成
UEdGraph* NewGraph = FBlueprintEditorUtils::CreateNewGraph(
Blueprint,
FName(*GraphName),
UEdGraph::StaticClass(),
UEdGraphSchema_K2::StaticClass()
);

if (!NewGraph)
{
UE_LOG(LogTemp, Error, TEXT("Failed to create new graph!"));
return false;
}

// Blueprintに追加
FBlueprintEditorUtils::AddUbergraphPage(Blueprint, NewGraph);

// Blueprintを更新
FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint);
FKismetEditorUtilities::CompileBlueprint(Blueprint);

UE_LOG(LogTemp, Log, TEXT("New event graph '%s' added successfully!"), *GraphName);
return true;
}

 

これでビルドに成功するとノードが利用できるようになります!

※エディタ用のBPなのでランタイム想定のBPでは配置できないはずです。

 

④ツールの追加

エディタに戻り、コンテンツを右クリック->エディタユーティリティ->エディタユーティリティブループリントを選択します。

 

アセットアクションユーティリティを選択します。

 

名前はEUB_AddCustomGraphとしました。

 

アセットを開き、クラスのデフォルトからブループリント用のアクションであるにチェックを付けます。

 

⑤ツールの編集

"ほげ"と"ふが"を追加する関数GenerateGraph"HOGE"_"FUGA"を作りました。

 

エディタで呼び出す が有効になっていることを確認しましょう。

 

選択されているブループリントアセットに対してHOGEとFUGAを追加するようにします。※エラー表示などはbool値でよしなにしてください。

⑥ツールの使い方

グラフを追加したいBPをコンテンツブラウザ上で右クリック

->スクリプト化された~から作成した関数を押します。

 

やった!!!

 

 

最後に

需要があれば、イベントノードの生成とかも書くかもしれません。

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる