以下の記事でSubsystemを継承したクラスをC++で作成してBP拡張する方法をメモしました。
この記事ではWorldSubsystem内でTickを使いたい場合のヘッダーファイルの最小構成をメモしておきます。
クラス作成
まずは、RiderなりUE EditorなりでTickableWorldSubsystemを継承してクラス作成する。
C++
.cppは今回もいじる必要なし。
作成したヘッダーファイル(.h)を編集します
//MyTickableWorldSubsystem→クラス名に置き換え
//YOURPROJECT→プロジェクト名に置き換え
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include "MyTickableWorldSubsystem.generated.h"
/**
*
*/
UCLASS(Abstract, Blueprintable, MinimalAPI)
class UMyTickableWorldSubsystemHelperBase : public UObject
{
GENERATED_BODY()
//どこからでも呼び出せる関数を用意したい場合は以下に連ねる。
public:
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) //処理の中身はBPで書くと宣言
void FunctionFirst();
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
//引数がint型のValueの場合
void FunctionSecond(int32 Value);
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
//引数がint型のIntParam、Float型のFloatParamで、戻り値がName型のNameVal、String型のStringValの場合
void FunctionThird(int IntParam, float FloatParam, FName& NameVal, FString& StringVal);
public:
// GetWorld()の実装をオーバーライド。WorldContextの必要なノードを使えるようになる。
virtual class UWorld* GetWorld() const override
{
do
{
if (HasAnyFlags(RF_ClassDefaultObject)) break; // CDOでは無効
if (!GetOuter()) break; // Outerがなければ無効
if (GetOuter()->HasAnyFlags(RF_BeginDestroyed)) break; // 死に掛けてたら無効
if (GetOuter()->IsUnreachable()) break; // 参照したらあかん事になってたら無効
return GetOuter()->GetWorld();
} while (0);
return nullptr;
}
// ブループリントでオーバーライド可能なTickメソッド
UFUNCTION(BlueprintNativeEvent, Category = "Subsystem")
void TickHelper(float DeltaTime);
virtual void TickHelper_Implementation(float DeltaTime) {}
};
UCLASS()
class YOURPROJECT_API UMyTickableWorldSubsystem : public UTickableWorldSubsystem
{
GENERATED_BODY()
public:
// 拡張用BPのプロパティ
UPROPERTY(Transient, BlueprintReadWrite)
UMyTickableWorldSubsystemHelperBase* SubsystemHelper;
// Tick関数
virtual void Tick(float DeltaTime) override
{
// ヘルパークラスのTickを呼び出す
if (SubsystemHelper)
{
SubsystemHelper->TickHelper(DeltaTime);
}
}
// Tick優先度の取得
virtual TStatId GetStatId() const override
{
RETURN_QUICK_DECLARE_CYCLE_STAT(UMyTickableWorldSubsystem, STATGROUP_Tickables);
}
};
UnrealEngine側での設定
BP作成
MyTickableWorldSubsystemHelperBaseを継承したBPを作成します
Tick, 関数のオーバーライド
用意した関数とTickがオーバーライドできるようになりました。
関数呼び出しのための準備
拡張用BPの作成と、Subsystemの設定を行います。
GamemodeやレベルブループリントやGameInstanceで以下を実行してください。
ALL COMPLETE!
おまけ
もし関数の引数や戻り値にEnumを使いたい際は合わせてどうぞ
参考
恒吉星光さんの投稿 (https://x.com/seiko_dev/status/1530475319572180993)