2
1

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】WorldSubsystemをC++で作成してTickをBPでオーバーライドしたい

Last updated at Posted at 2025-04-15

以下の記事で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を作成します
image.png

Tick, 関数のオーバーライド

用意した関数とTickがオーバーライドできるようになりました。

image.png

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

拡張用BPの作成と、Subsystemの設定を行います。
GamemodeやレベルブループリントやGameInstanceで以下を実行してください。
image.png

ALL COMPLETE!

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


おまけ

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

参考

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

2
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?