【UE4】自作モジュールの使い方

この記事では、Unreal Engine 4 で自作したモジュールを使う方法について説明しています。

執筆時に扱った Unreal Engine のソースコードのバージョンは 4.25.4
プラットフォームは Windows 10 (64ビット版) を対象としています。
ビルドに使用したアプリ(IDE)は Microsoft Visual Studio 2017 です。

以降、Unreal Engine 4 を UE4 と略記します。 

モジュールを作成する方法

モジュールの作成方法と、プロジェクトへの追加方法は以下の記事が参考になります。
ググると同様の記事が他にもいくつかヒットしますが、記事通りに試してみて、こちらが一番楽でした。

作り方は書いてあるのに使い方が書いてない

多分、「わざわざ書くまでもないよな?」という判断なのだと邪推します。

プロジェクトに追加したモジュールは、他のクラスと同じように扱うことができます。
以下に、自作したモジュールを UObject と関連付けて、UE4 のガーベジコレクタに乗るようにした上で、インスタンスを生成するところまでのサンプルソースコードを記載します。

自作したモジュールのヘッダファイル

TestModule.h

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved. 
#pragma once 
#include "CoreMinimal.h" 
#include "Modules/ModuleInterface.h" 
#include "Modules/ModuleManager.h" 

//	追加
#include "TestModule.generated.h"
//	ここまで

/** 
 * The public interface to this module 
 */ 
class ITestModule : public IModuleInterface 
{ 
public: 
	/** 
	 * Singleton-like access to this module's interface.  This is just for convenience 
	 * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already. 
	 * 
	 * @return Returns singleton instance, loading the module on demand if needed 
	 */ 
	static inline ITestModule& Get() 
	{ 
		return FModuleManager::LoadModuleChecked< ITestModule >( "TestModule" ); 
	} 
	/** 
	 * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true. 
	 * 
	 * @return True if the module is loaded and ready to use 
	 */ 
	static inline bool IsAvailable() 
	{ 
		return FModuleManager::Get().IsModuleLoaded( "TestModule" ); 
	} 
}; 

//	追加
UCLASS()
class TESTMODULE_API UMyTestModule : public UObject, public ITestModule
{
	GENERATED_BODY()

};
//	ここまで
自作したモジュールのソースファイル

TestModule.cpp

変更なし

自作したモジュールに追加するコードは以上です。

次は、自作したモジュールを呼び出すコードを追加します。
ソースファイルを新規作成するのは面倒なので、既存のソースファイルに追記します。

Blank(椅子とテーブルだけ置かれているテンプレートプロジェクト)でプロジェクトを作成しました。
プロジェクト名はデフォルトの MyProject です。
なので、自作モジュール以外の既存のソースコードは、MyProject か MyProjectGameModeBase しかありません。

GameMode ならプレイ時に勝手に実行してくれるので、MyProjectGameModeBase に、自作モジュールを呼び出すコードを追加することにしました。

自作したモジュールを呼び出すクラスのヘッダファイル

MyProjectGameModeBase.h

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyProjectGameModeBase.generated.h"

/**
 * 
 */
UCLASS()
class MYPROJECT_API AMyProjectGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
	
};

//	追加
UCLASS()
class AMyGameMode : public AMyProjectGameModeBase
{
	GENERATED_BODY()

public:

	AMyGameMode();

};
//	ここまで
自作したモジュールを呼び出すクラスのソースファイル

MyProjectGameModeBase.cpp

// Copyright Epic Games, Inc. All Rights Reserved.

#include "MyProjectGameModeBase.h"

//	追加
#include "UObject/UObjectGlobals.h"
#include "TestModule.h"

AMyGameMode::AMyGameMode()
{
	UMyTestModule* Module = CreateDefaultSubobject<UMyTestModule>(FName("UMyTestModule"), true);
	UE_LOG(LogTemp, Log, TEXT("AMyGameMode::AMyGameMode() : Module=%p"), Module);
}
//	ここまで
ゲームモードを変更

「ワールドセッティング」→「Game Mode」→「ゲームモードオーバーライド」で、AMyGameMode に変更します。


赤枠で囲った部分を変更。

プレイ

プレイすると、アウトプットログに以下のログが出力されます。

自作モジュールの使い方は、他のクラスと全く変わらないことが確認できました。
どおりで、どこにも説明がないはずです。

モジュール名_API の意味

有名なヒストリアさんの記事に書いてありました。

クラスや関数を外部公開しないなら、クラスの宣言部でクラス名の前に
モジュール名_API
を付ける必要はないようですが、そもそも外部公開の外部って具体的にどの範囲?というのが疑問です。

外部と呼べそうな範囲はいくつかあります。

  1. 自作モジュールのクラス以外
  2. 自作モジュールのソースファイル以外
  3. 自作モジュールのフォルダ以外
  4. 別の Unreal Project

上記のうち、3. と 4. が、この場合の「外部」になります。

今回作った TestModule のフォルダ以外は全て外部です。
今回のサンプルでは、TestModule の外部にある MyProjectGameModeBase で TestModule を使っているので、モジュール名_API(TESTMODULE_API) が必要になりました。
そのため、TestModule のクラス宣言が
class TESTMODULE_API UMyTestModule
となっています。
TestModule のフォルダ内でしか使わないなら、TESTMODULE_API は不要です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です