2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UE5】SubsystemをC++で作成してBP拡張する方法メモ

Last updated at Posted at 2025-04-11

自分用メモくらいの記事なのでわからない点があれば質問をコメントなり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作成

image.png

作成したBPで関数をオーバーライドします
image.png

image.png

関数呼び出しのための準備

GamemodeやレベルブループリントやGameInstanceで以下を実行
image.png

ALL COMPLETE!

オーバーライドした関数がどこからでも使えるようになります。
image.png


おまけ

もし関数の引数や戻り値にEnumを使いたい際は合わせてどうぞ

参考

恒吉星光さんの投稿 (https://x.com/seiko_dev/status/1530475319572180993)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?