← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-05

GameInstanceSubsystemで共通機能を集める

ProjectDTのUIフローを一元化した方法

INTERACTIVE READING MODE →

本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。

複数のWidgetとActorが同じUI操作を繰り返すと、お互いを直接見つけるコードが増えます。 ProjectDTでは、共通のUIフローUGameInstanceSubsystemに集めた。

なぜSubsystemを使用するのですか?

UGameInstanceSubsystemはGameInstanceと同じ寿命を持ち、エンジンが自動的に生成します。 別のシングルトンポインタを直接作成しなくても、どこでもGameInstanceを介してインポートできます。

UDTUISubsystem* UISubsystem =
    GetGameInstance()->GetSubsystem<UDTUISubsystem>();

if (UISubsystem)
{
    UISubsystem->ProcessSolvedProblem(
        ProblemData,
        FVector2D::ZeroVector,
        0.0f,
        100.0f
    );
}

問題正解処理に続く会話、ホワイトボードノード生成などの付随効果をウィジェットごとにコピーせずに1つの関数にまとめることができる。

すべてを入れてはいけない

Subsystemもグローバルアクセスが容易なので責任を続けてみると、もう一つの巨大な管理者クラスになる。

  • UI切り替えとUIイベントはUI Subsystem
  • ストレージスロットと現在のSaveGameはSave Subsystem
  • 現在のワールドの勝敗ルールはGameMode
  • プレーヤー入力はPlayerController

寿命が長いという理由だけで、戦闘中の一時Actorポインタを強く握っておけば、ワールド移動後に古いオブジェクトが残ることができる。 ProjectDTのMainUIとWhiteBoardリファレンスはTWeakObjectPtrとして保管した。

サブシステムは、互いに離れたオブジェクトを接続するための良いハブです。 しかし、データの寿命と責任が本当にGameInstanceの範囲であることを確認して使用する必要があります。