GameInstanceSubsystemで共通機能を集める
ProjectDTのUIフローを一元化した方法
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
複数の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の範囲であることを確認して使用する必要があります。