自分用メモくらいの記事なのでわからない点があれば質問をコメントなりXでお願いしますmm
SubsystemをC++で作成して拡張用のBPを持たせる方法をおかずさんが過去に紹介してくださっていました。
その他記事やツヨツヨな方に助けていただいて、WorldContextがないと使えなかったノード(Delay, SpawnActorFromClassなど)も使えるようにしました。
クラス作成
まずは、RiderなりUE EditorなりでGameInstanceSubsystemを継承してクラス作成する。
(どういったライフサイクルのSubsystemを使いたいかで親クラスは選択する。)
C++
.cppは今回いじる必要なし。
作成したヘッダーファイル(.h)を編集します
.hのコード
MyGameInstanceSubsystem.h
/*
* MyGameInstanceSubsystem
* → 作成したクラス名に置換する
*
* YOURPROJECT_API
* → (プロジェクト名)_APIに置換する
*/
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"
UCLASS(Abstract, Blueprintable, MinimalAPI)
class UMyGameInstanceSubsystemHelperBase : 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);
// 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;
}
};
UCLASS()
class YOURPROJECT_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
// 拡張用BPのプロパティ
UPROPERTY(Transient, BlueprintReadWrite)
UMyGameInstanceSubsystemHelperBase* SubsystemHelper;
};
Tips: 関数の引数と戻り値
型の後ろに&をつけると戻り値になる。
void FunctionThird(int32 Param1, float Param2, FName& Val1, FString& Val2);
//引数がint32型のParam1とfloat型のParam2、
//戻り値がFName型のVal1とFString型のVal2
//の例
UnrealEngine側での設定
作成したMyGameInstanceSubsystemHelperBase的なものを継承したBP作成
関数呼び出しのための準備
GamemodeやレベルブループリントやGameInstanceで以下を実行
ALL COMPLETE!
おまけ
もし関数の引数や戻り値にEnumを使いたい際は合わせてどうぞ
参考
恒吉星光さんの投稿 (https://x.com/seiko_dev/status/1530475319572180993)