Game Features と Modular Gameplay

アクティブ/非アクティブをすばやく切り替えられるスタンドアローン機能を構築します。

Choose your operating system:

Windows

macOS

Linux

実装方法を選んでください。

Blueprints

C++

Game FeaturesModular Gameplay のプラグインをプロジェクトで利用すると、デベロッパーはスタンドアローン機能を作成できます。これらのプラグインを使用した機能を作成すると、プロジェクトのコードベースを明確で読み取りやすい状態に維持し、さらに無関係の機能同士の予期しないインタラクションや依存関係を回避するなど、複数のメリットがあります。これは、時間の経過とともに機能セットが変化するライブ製品を開発する場合に特に重要です。

初期設定

次の手順を実行すると、プロジェクトに 1 つまたは複数のスタンドアローンのプラグインベースの機能を追加できるようになります。

  1. このプロジェクトに初めて機能を追加する場合は、まず Game Features プラグインと Modular Gameplay プラグインを有効にする必要があります。これらのプラグインを有効にするには、Unreal Engine 5 (UE5) エディタのメイン ウィンドウにある [Edit (編集)] ドロップダウン メニューから、 [Plugins (プラグイン)] を選択します。[Plugins (プラグイン)] ウィンドウが開いたら、Game Features プラグインと Modular Gameplay プラグインを見つけて、有効化します。これらのプラグインはどちらも、左側のパネルの Gameplay カテゴリにあります。

  2. これらのプラグインを有効にすると、エディタの再起動が必要というメッセージが表示されます。再起動する前に [Add] ボタンをクリックします。

  3. [Add] ボタンをクリックすると [New Plugin (新しいプラグイン)] ウィンドウが起動します。ビルドする機能を含めるプラグインを作成する必要があります。プラグインのタイプは特に指定する必要はありません。この例では、タイプとして [Content Only] を選択して、プラグインの名前は にしました。

  4. プラグインがプロジェクトの「/Plugins/GameFeatures/」ディレクトリに保存されることを確認します。

  5. エディタを再起動します。再起動するには、 [Plugins (プラグイン)] ウィンドウの [Restart Now (今すぐ再起動)] ボタンをクリックするか、エディタを閉じてから、もう一度開きます。

  6. 再起動すると、 [Message Log (メッセージ ログ)][Load Errors] カテゴリに次のようなメッセージが表示されます。

    「Asset Manager settings do not include an entry for assets of type GameFeatureData, which is required for game feature plugins to function. (アセット マネージャー設定に、ゲーム機能のプラグインが機能するために必要なタイプのアセットのエントリ GameFeatureData が含まれていません。Add entry to PrimaryAssetTypesToScan? (PrimaryAssetTypesToScan にエントリを追加しますか?)」

    このメッセージが表示されたら [Add entry to PrimaryAssetTypesToScan?] をクリックして問題を修正します。エディタが DefaultEngine.ini に適切な変更を行うため、今後このメッセージが再度表示されることはありません。または、 [Edit (編集)] メニューのドロップダウン メニューから [Project Settings (プロジェクト設定)] を選択して、 [Game] セクションの [Asset Manager] カテゴリに移動して、 [Primary Asset Type] を手動で設定することができます。[Primary Asset Types to Scan] で、 GameFeatureData 基本クラスを使用する GameFeatureData という名称のプライマリ アセット タイプを 1 つ追加し、 [Directories] 配列に「/Game/Unused」ディレクトリを追加します。最後に、 [Rules] を展開して、 [Cook Rule][Always Cook] に設定します。

  7. コンテンツ ブラウザ を使用して、このプラグインの最上位のコンテンツ フォルダに移動します。この例では、フォルダは「MyStandaloneFeature Content」という名前です。[Asset Panel] を右クリックして表示されるコンテキスト メニューの [Miscellaneous] を開き、 [Data Asset] を選択して、新しい データ アセット を作成します。クラスのリストから GameFeatureData を選択し、プラグインに付けた名前と同じ名前を付けます。この例では、アセットの名前は MyStandaloneFeature です。

以上の手順が完了したら、エンジン (またはエディタ) の起動時にスタンドアローン機能がロードされるように設定されます。

次に、機能自体の開発と、その機能を実装する アクション の追加に着手します。アクションには、次の 4 つのタイプがあります。

  • Add Cheats アクションは、 Cheat Manager を拡張することで、新しい「チート コード」を作成したり、既存のチート コードを拡張したりします。チート コードはデバッグの際に役立ちますが、シッピング ビルドからは自動的に削除されます。~ (チルダ) キーを押すとコンソールが開き、プロジェクトの実行中にこれらのチート コードを入力することができます。

  • Add Components アクションは、アクタのサブクラスのリストを受け取り、オプトイン ベースでコンポーネントのセットを追加します。コンポーネントは様々なビヘイビアをカプセル化するのに適しているため、これは Game Features プラグインおよび Modular Gameplay プラグインを使用する最も一般的な方法です。

Add Data Registry アクションで、1 つまたは複数の データ レジストリ をプロジェクトに追加します。データ レジストリでは、グローバルに登録されたデータを効率的にストアおよび取得できます。

  • Add Data Registry Source アクションで、既存のデータ レジストリに 1 つまたは複数の データ テーブル を追加します。

アクションを追加するには、先程作成したデータ アセットを開きます。[ACTIONS] カテゴリを展開すると、 [Actions] という配列が表示されます。その配列に要素を追加して、その要素を該当するアクション タイプに設定します。各アクション タイプの詳細については、以降のセクションで説明します。

各アクション タイプに 1 つ。アクションは、どのプラグインにも必要に応じていくつでも設定できます。

アクションを追加した後で Game Feature が想定通りに機能しない場合は、エディタを再起動してください。GameFeatureData アセットはエディタの起動時にロードされるため、新しい GameFeatureData アセットを作成した後で再起動に失敗すると、そのアセットは機能しません。エディタの再起動を行う必要があるのは、アセットを最初に作成した後だけです。その後のセッションでアセットを更新しても、エディタを再起動する必要はありません。

チートを追加する

Add Cheats アクションでは、 Cheat Manager Extension をゲームに登録します。これを利用すると、デベロッパーがスタンドアローン機能の一部として独自のデバッグ コマンド (または「チート コード」) を作成し、その機能が有効なときはいつでもそのコマンドを使用できるようになります。Cheat Manager および Cheat Manager Extensions はデバッグ ツールであるため、シッピング ビルドではインスタンス化されません。

コンポーネントを追加する

Add Components アクションは、提供したアクタとコンポーネント クラスのペアのリストを確認して、各コンポーネントのインスタンスをそれぞれ一致するアクタへの追加を試行します。コンポーネントをクライアント、サーバー、またはその両方に追加するかどうかを指定することができます。デフォルトでは、コンポーネントはクライアントとサーバーの両方に追加されます。

機能をプラグイン内で完全にカプセル化された状態を維持するために、追加するコンポーネントはプラグイン自体から派生します。その一方で、Actor クラスは Pawn などのビルトインのエンジン クラス、または典型的な MyPawn などのエンジン クラスのプロジェクト固有の子になります。理想的なのは、機能に関連するすべてのプログラム ロジックとデータ ストレージをコンポーネントで処理することです。

プロジェクトの Actor サブクラスとの必要なインタラクションをできる限り少なくすることで、その機能を別のプロジェクトで簡単に実装できるようになります。

Add Components アクションに基本の Actor クラスを使用しないでください。これはサポートされていないため、アクションのその部分は無視されます。代わりに、コンポーネントを必要とする Actor サブクラスの最も狭いサブセットを特定し、そのクラスを指定する必要があります。コンポーネントを受け取る必要のあるクラスが複数あり、それらが Actor 以下の共通の親を持たない場合は、適切な基本クラスをすべてカバーするために複数の Add Components アクションを設定することができます。

Add Components Action からコンポーネントを受け取るには、アクタは通常 Begin Play イベントで Game Framework Component Manager を使ってそれ自体を登録する必要があります。これを行うには、グローバルの Game Framework Component Manager を取得し、 Add Receiver 関数を呼び出して、アクタを Receiver パラメータに渡します。アクティブな Game Features の数に関係なく、アクタに必要な Add Receiver コールは 1 つです。Game Features に関連付けられたすべてのコンポーネントは、Game Framework Component Manager の Remove Receiver 関数を使用してアクタから取り除きます。

AddReceiver.png

アクタの Begin Play でコンポーネントを受け取るための登録。

Add Components Actions からコンポーネントを受け取るには、アクタは自分自身を UGameFrameworkComponentManager シングルトン インスタンスに登録し、自分自身を AddReceiver 関数を渡す必要があります。これは通常 BeginPlay で行われます。コードは次のようになります。

if (UGameFrameworkComponentManager* ComponentManager = GetGameInstance()->GetSubsystem<UGameFrameworkComponentManager>())
{
    ComponentManager->AddReceiver(this);
}

データ レジストリを追加する

Add Data Registry アクションは、データ レジストリ全体をプロジェクトに追加できます。追加する Data Registry アセットのパスを指定してアクションを構成します。データ レジスリの詳細については データ レジストリ ページを参照してください。

データ レジストリ ソースを追加する

データ レジストリにストリーミングするデータ ソースを追加するには、Add Data Registry Source アクションを使用します。各データ ソースへのパス、それらをロードするデータ レジストリの名前、関連する優先度と使用フラグを設定する必要があります。起動時に Game Feature がロードされると、該当する識別子がドロップダウン リストに表示されます。詳細については、データ レジストリ ページの「データ レジスリ ソース」を参照してください。