Module


概要

コードやアセットの機能的なまとまりを分離して構成する仕組み。 これにより、機能間の結合を抑え、プロジェクト全体の保守性と将来的な拡張余地を確保している。 モジュールのビルドプロセスは、「Unreal Build Tool」によって制御される。

モジュールの基本構造

「Source」以下にある、モジュール名で分けられた各フォルダが、1つのモジュールを構成する単位となる。
  • Source
    • ModuleA
      • ModuleA.Build.cs
      • ModuleA.h
      • ModuleA.cpp
    • ModuleB
      • ModuleB.Build.cs
      • ModuleB.h
      • ModuleB.cpp
ビルド対象に含めるには、「Target.cs」で「ExtraModuleNames」に対象としたいモジュールを追加する。 ロード対象に含めるには、「uproject」で「Modules」に対象としたいモジュールを追加する。

モジュールの依存関係

モジュールスコープ

「UnrealBuildTool」プロジェクトの「RulesCompiler.cs」に記載がある。
  1. Engine
      • Engine/SourceのDeveloper、Editor、Runtime、ThirdParty以下に配置されたもの
  1. Engine Plugins
      • Engine/Plugins以下に配置されたもの
  1. Engine Programs
      • Engine/Source/Programs以下に配置されたもの
  1. Marketplace
      • Engine/Plugins/Marketplace以下に配置されたもの
  1. Project
      • Project/SourceやProject/Plugins以下に配置されたもの
      • uproject内でAdditionalPluginDirectoriesによって追加されたプラグイン
  1. Plugin
      • 単一のプラグイン
「Engine」が最上位のモジュールとなり、上位モジュールが下位モジュールに依存することはない。 「Unreal Build Tool」でのビルドは、上位モジュールから順に行われる。

モジュールAPI

クラスや関数の宣言の前に「モジュール名_API」マクロを追加することで、その機能をモジュール外に公開することができる。 その機能が、自身のモジュールのみで参照され、他モジュールから依存されないことが分かっている場合は省略してもよい。

モジュールの依存設定

「Build.cs」の「DependencyModuleNames」にモジュール名を追加することで、該当モジュールの機能を使用することができる。
例えば、以下のような依存関係があるとする。
  • モジュールA
  • モジュールB(Aに依存)
  • モジュールC(Bに依存)
このとき、依存関係が他モジュールにどこまで伝わるかは、「Public」依存か、「Private」依存かによって異なる。
  • PublicDependencyModuleNames
    • 依存関係を他モジュールにも公開する
      • BがAにPublic依存し、CがBに依存している場合に、CからAにもアクセスできる
  • PrivateDependencyModuleNames
    • 依存関係を他モジュールに公開しない
      • BがAにPrivate依存し、CがBに依存している場合に、CからAにはアクセスできない
ゲームモジュールは、他モジュールから依存されることがほぼないため「PrivateDependencyModuleNames」を使うのが基本となる。

インクルードパスの制御

デフォルトインクルードパス設定

「UnrealBuildTool」によって、特定のフォルダがデフォルトインクルードパスとして追加される。
  • Public
    • 他モジュールにも公開する
  • Private
    • 他モジュールに公開されず、自身のモジュールからのみアクセス可能となる
ほかにも、ClassesやInternalがあるが基本的に使わないので省略する。 また、ゲームモジュールなど、将来的にも他モジュールから依存されることがないものは、「public」フォルダや「private」フォルダを使用する必要はない。

追加のインクルードパス設定

「Build.cs」の「PrivateIncludePaths」や「PublicIncludePaths」に追加する。
(例)プロジェクトのソースコードをプロジェクト絶対パスで指定

モジュールの追加例

Sandboxプロジェクトにエディタモジュールを追加する

1. ゲームモジュールフォルダ同階層にエディタモジュールフォルダを作成

  • Source
    • Sandbox
    • SandboxEditor ←ここに作成

2. エディタモジュールフォルダ内に以下のファイルを作成

3. ゲームモジュールのTarget.csでエディタモジュールをビルド対象に設定

4. プロジェクトのuprojectでエディタモジュールをロード対象に設定