1.8K Views
October 21, 25
スライド概要
Unreal Engine Meetup in Osaka Vol.04にて弊社 服部が登壇した際に利用したスライドです。
株式会社Indie-us GamesのDocswell公式アカウントです。
WorldSubsystemではじめる UnrealC++ Unreal Engine Meetup in Osaka Vol.04 Indie-us Games 服部 綜太
自己紹介 服部 綜太(はっとり そうた) Twitter(現X): @hatosable___ 2025年にプログラマ/エンジニアとして Indie-us Gamesに入社。 社内インフラの整備やツール・プラグインの開発を担当。 CookieClickerをはじめとした作業ゲーが大好物。
自己紹介 服部 綜太(はっとり そうた) Twitter(現X): @hatosable___ 2025年にプログラマ/エンジニアとして Indie-us Gamesに入社。 社内インフラの整備やツール・プラグインの開発を担当。 CookieClickerをはじめとした作業ゲーが大好物。
この講演の目標 WorldSubsystemについて学んで UnrealC++に触れるきっかけを作る!
おことわり ・本講演は初~中級者向けになっています (目安:BPでゲーム一通り作れるくらい) ・UnrealC++の環境構築については解説しません UEチョットデキル方々におかれましては メリットの再確認くらいに捉えていただければ幸いです…
おしながき Subsystemってなんぞ ・WorldSubsystemの特徴 ・SubsystemとC++ WorldSubsystem活用例① ・単一責任の原則(超要約) ・ScoreManagerSubsystem WorldSubsystem活用例② ・参照と依存関係 ・EventhandlerSubsystem WorldSubsystemのポテンシャル
Subsystemってなんぞ EngineやWorldが自動で生成・管理を行うクラス Engine World GameInstance LocalPlayer Engine Subsystem World Subsystem GameInstance Subsystem LocalPlayer Subsystem
Subsystemってなんぞ GameMode Player Widget 原則どこからでもアクセスすることができる
Subsystemってなんぞ 本スライドではWorldSubsystemに絞って 紹介・解説を行います World World Subsystem
WorldSubsystemの特徴 ・Worldに1つずつ生成される ・エディタでも使用可能 ・OnWorldBeginPlay関数が実装されており ActorのBeginPlayより早いタイミングで 任意の処理を行える Worldに1つしかない要素の 管理やマネージャー的な仕事が 得意!
SubsystemとC++ SubsystemはBPとして作成することができないため C++での実装が必要になる ただしActorのようにコンストラクタが必須ではないので 実装のハードルは低い →初めてC++でクラスを作るのに最適!
SubsystemとC++ FirstPersonCharacterのコンストラクタ
SubsystemとC++ WorldSubsystemのコンストラクタ
WorldSubsystemを作るには 「ツール」->「新規C++クラス」からC++クラスを 追加できます 親クラを聞かれるので表示を「全てのクラス」に切り替えて 「WorldSubsystem」を入力して選択
WorldSubsystemを作るには クラスタイプは「パブリック」を選択 ファイル名を入力後、パスに問題なければ 「クラスを作成」をクリックすると クラスが作成されます
SubsystemとC++ 変数や関数をBPで使えるようにするには 最低限これだけ覚えればOK 後のスライドで詳しく解説します
突然ですが PlayerやGameModeに処理を詰め込んでいませんか? コンフィグ 制限時間 チュートリア ル専用フロー UI管理 World遷移 プレイヤー操 作 BGM/SE再生 スコア管理 デバッグ 進行状況管理 ゲームフロー アセットロー ド 敵スポーン Player/GameMode
WorldSubsystem活用例 1つのクラスに処理が増えすぎると ノードが絡まりすぎてスパゲティのように… こうなると整理も改良もとても大変です https://www.reddit.com/r/unrealengine/comments/4nt0up/need_help_debugging_this _blueprint/
WorldSubsystem活用例 処理範囲を分担してクラスを小分けにすると 整理も改良もしやすくなる! プレイヤー操 作 Player ゲームフロー スコア管理 UI管理 GameMode ScoreManager Subsystem UIManager Subsystem
単一責任の原則(超要約) クラスごとに役割を一つに絞ると、 分かりやすくて仕様変更に強いクラスになる スコア「だけ」を管理するクラスを作ってしまおう!
ScoreManagerSubsystem実装 ScoreManagerSubsystemを実装します 持っているのはスコアとスコア加算関数のみ これでもしスコア計算方法が変更されても AddScore関数を変更するだけで済むようになります
ScoreManagerSubsystem実装 変数定義 ・BlueprintReadOnly ->BPからは読み取りのみ可能(変更不可、Setノードが使えなくなる) ・meta ->メタデータ指定子 ノードでの表示名やツールチップなど、エディタでの動作を制御できる ・Tooltip ->メタデータの1つ ノードにマウスをかざすと指定した文字列を表示できる
ScoreManagerSubsystem実装 関数定義 ・BlueprintCallable ->BPから関数を呼び出せるようにする ・meta ->メタデータ指定子 ノードでの表示名やツールチップなど、エディタでの動作を制御できる ・Tooltip ->メタデータの1つ ノードにマウスをかざすと指定した文字列を表示できる
ScoreManagerSubsystem実装 関数実装
実装前 GameModeにスコアを実装 別クラスから BP_FIrstPersopnGameModeに キャストしてスコアを追加
実装結果 キャストが不要になり、スコアへのアクセス方法が 明快に! クラスの役割を明確にしつつアクセス性を大きく 高められるのがSubsystemの強みの一つ
WorldSubsystem活用例② Player GameMode UI ScoreManager インスタンスを直接使用 (依存している状態)
WorldSubsystem活用例② Player GameMode UI ScoreManager 仕様変更されました インスタンスを直接使用 (依存している状態) UIの仕様にあわせて 変更が発生するかもしれない
WorldSubsystem活用例② 関数だけ渡しておく Player GameMode ScoreManager EventHandler Subsystem UI
WorldSubsystem活用例② 関数だけ渡しておく Player GameMode EventHandler Subsystem ScoreManager UI 仕様変更されました 関数だけを登録・管理するWorldSubsystemを間 に挟むことで依存関係の発生を回避(疎結合)
EventHandlerSubsystem実装 イベントを登録する仕組みとして「デリゲート」を利用します デリゲートは関数の情報を持ったクラス BPではイベントディスパッチャーや ComponentBeginOverlap等一部イベントが該当する デリゲートを活用すると呼び出し方法を変えずに処理だけ 変更するといったことができるようになります
EventHandlerSubsystem実装 DECLARE_DYNAMIC_DELEGATEマクロを利用すると BPでも利用可能なデリゲートを定義できます 引数や戻り値を設定する方法もありますがここでは割愛 ↑引数に入れた文字列がデリゲートの名前になる 頭にFを付けるのが慣習
EventHandlerSubsystem実装 マップに格納される値はデリゲートのArray(配列)なので 複数のイベントを同時に実行することも可能です 関数の持ち主がDestroy等で消えているとクラッシュ するので生存確認は忘れずに!
EventHandlerSubsystem実装 変数定義
EventHandlerSubsystem実装 関数定義
EventHandlerSubsystem実装 RegisterEvent実装
EventHandlerSubsystem実装 CallEvent実装
実装前 GameModeがUIに依存 UI更新のためにGameModeに依存
実装結果 GameModeとUIいずれも参照することなく 的からUI更新が行えるように! イベント識別用の文字列はGameplayTagに 変更するとタイポが減ってさらに分かりやすくできます
WorldSubsystemのポテンシャル ・UIの管理や更新 ・敵のスポーン ・スコア管理 ・SEの再生 これ全部 WorldSubsystemで管理できます etc...
Subsystemの強み ・どこからでもアクセスできる ・キャストやインターフェースが不要 ・自動生成・管理で安心 ・BPでは難しかった役割整理が得意 1つのSubsystemになんでも突っ込むと本末転倒なので注意
応用・Subsystemとプラグイン hoge Subsystem ←Subsystemをプラグイン(モジュール)でラップするだけ 一つの機能を切り出す単位としてちょうどいいため hogePlugin Module hogePlugin プラグイン開発とも相性バツグン
応用・Subsystemとプラグイン EditorUtilityWidgetと併用することで 強力かつ汎用性の高いツールを作ることができる!
まとめ ・Subsystem=「どこからでもアクセスできる機能の入れ物」 ・機能整理や参照問題はSubsystemで解決 ・必要な実装がシンプルなのでC++の練習に最適 ・プラグインに内蔵することで汎用性UP
これだけは覚えて帰ってください Subsystemは、いいぞ。 C++入門、役割整理、プラグイン実装etc… Subsystemは全てを解決する