🔧

[UE5] SubSystemを使いつつ、Blueprint側でロジックを実装する

2024/11/09に公開

概要

UnrealEngineのSubSystemを使いつつ、細かいロジック等はBlueprint側で実装するための(多分)最短の方法を書いたものです。

環境

環境 バージョン 備考
UnrealEngine 5.4.4
OS Windows 11
開発ツール Rider 2024.1.4 コンパイラはVisualStudio 2022だと思う

C++コード側

C++のコード側は極力シンプルにしたつもりです。
名前はあまりイケてないので適当なものに変更してください。
BLANK_CPP_APIとclassの横についているのはプロジェクトの名前です。これも適当に変更してください。
(なくても動くとは思います)

SubSystemTest.h
#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "SubSystemTest.generated.h"

// BP側のヘルパークラス
UCLASS(Blueprintable, meta = (ShowWorldContextPin))
class BLANK_CPP_API UCallBlueprintTest : public UObject
{
	GENERATED_BODY()

public:
	// BP側で実装する関数
	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
	void PrintOnlyTest();
};

// 追加するSubSystem
UCLASS()
class BLANK_CPP_API USubSystemTest : public UGameInstanceSubsystem
{
	GENERATED_BODY()
public:
	UPROPERTY(BlueprintReadWrite, Transient, Category = "SubSystemTest")
	UCallBlueprintTest* SubSystemTestHelper;
};

.cpp側は実装の中身が無くて良いので下記で十分です

SubSystemTest.cpp
#include "SubSystemTest.h"

Blueprint側

ロジック側をBlueprint側で管理するので、こっちがちょっと手間が多いです。

SubSystemで使用する関数の実装

UCallBlueprintTestを継承したBlueprintクラスを作成し、PrintOnlyTest関数をOverrideします。

下図のようなBlueprintになります。

SubSystem内のヘルパーのプロパティを作成

GameModeやレベルブループリント等のゲームのシステム寄りなところでヘルパークラスを作成してSubSystemに渡してあげます。
今回はBP_CustomGameModeというBlueprintを作成し、その中でヘルパークラスを作成してSubSystemに渡しました。
下図のようなBlueprintになります。

ゲーム内で実装した関数を呼び出す

作成したヘルパークラスを通じてPrintOnlyTest関数を呼び出してあげます。
とりあえずActorのTickでTick毎に呼び出してみました。

下図のようなBlueprintになります。

実行結果

実行するとTick毎にPrintStringが呼ばれるので下図のようになります。

まとめ

システム的な呼び出し口はC++, 実際の実行するロジックはBlueprint側に分けるといったことが可能だというのが今回の記事で出来るのがわかると思います。
今回はC++側でGameInstanceSubsystemを使用しましたが、使いたいライフサイクルによって使い分けるのが良いでしょう。

参考資料

GitHubで編集を提案

Discussion