WorldSubsystemではじめるUnrealC++

1.8K Views

October 21, 25

スライド概要

Unreal Engine Meetup in Osaka Vol.04にて弊社 服部が登壇した際に利用したスライドです。

profile-image

株式会社Indie-us GamesのDocswell公式アカウントです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

WorldSubsystemではじめる UnrealC++ Unreal Engine Meetup in Osaka Vol.04 Indie-us Games 服部 綜太

2.

自己紹介 服部 綜太(はっとり そうた) Twitter(現X): @hatosable___ 2025年にプログラマ/エンジニアとして Indie-us Gamesに入社。 社内インフラの整備やツール・プラグインの開発を担当。 CookieClickerをはじめとした作業ゲーが大好物。

3.

自己紹介 服部 綜太(はっとり そうた) Twitter(現X): @hatosable___ 2025年にプログラマ/エンジニアとして Indie-us Gamesに入社。 社内インフラの整備やツール・プラグインの開発を担当。 CookieClickerをはじめとした作業ゲーが大好物。

4.

この講演の目標 WorldSubsystemについて学んで UnrealC++に触れるきっかけを作る!

5.

おことわり ・本講演は初~中級者向けになっています (目安:BPでゲーム一通り作れるくらい) ・UnrealC++の環境構築については解説しません UEチョットデキル方々におかれましては メリットの再確認くらいに捉えていただければ幸いです…

6.

おしながき Subsystemってなんぞ ・WorldSubsystemの特徴 ・SubsystemとC++ WorldSubsystem活用例① ・単一責任の原則(超要約) ・ScoreManagerSubsystem WorldSubsystem活用例② ・参照と依存関係 ・EventhandlerSubsystem WorldSubsystemのポテンシャル

7.

Subsystemってなんぞ EngineやWorldが自動で生成・管理を行うクラス Engine World GameInstance LocalPlayer Engine Subsystem World Subsystem GameInstance Subsystem LocalPlayer Subsystem

8.

Subsystemってなんぞ GameMode Player Widget 原則どこからでもアクセスすることができる

9.

Subsystemってなんぞ 本スライドではWorldSubsystemに絞って 紹介・解説を行います World World Subsystem

10.

WorldSubsystemの特徴 ・Worldに1つずつ生成される ・エディタでも使用可能 ・OnWorldBeginPlay関数が実装されており ActorのBeginPlayより早いタイミングで 任意の処理を行える Worldに1つしかない要素の 管理やマネージャー的な仕事が 得意!

11.

SubsystemとC++ SubsystemはBPとして作成することができないため C++での実装が必要になる ただしActorのようにコンストラクタが必須ではないので 実装のハードルは低い →初めてC++でクラスを作るのに最適!

12.

SubsystemとC++ FirstPersonCharacterのコンストラクタ

13.

SubsystemとC++ WorldSubsystemのコンストラクタ

14.

WorldSubsystemを作るには 「ツール」->「新規C++クラス」からC++クラスを 追加できます 親クラを聞かれるので表示を「全てのクラス」に切り替えて 「WorldSubsystem」を入力して選択

15.

WorldSubsystemを作るには クラスタイプは「パブリック」を選択 ファイル名を入力後、パスに問題なければ 「クラスを作成」をクリックすると クラスが作成されます

16.

SubsystemとC++ 変数や関数をBPで使えるようにするには 最低限これだけ覚えればOK 後のスライドで詳しく解説します

17.

突然ですが PlayerやGameModeに処理を詰め込んでいませんか? コンフィグ 制限時間 チュートリア ル専用フロー UI管理 World遷移 プレイヤー操 作 BGM/SE再生 スコア管理 デバッグ 進行状況管理 ゲームフロー アセットロー ド 敵スポーン Player/GameMode

18.

WorldSubsystem活用例 1つのクラスに処理が増えすぎると ノードが絡まりすぎてスパゲティのように… こうなると整理も改良もとても大変です https://www.reddit.com/r/unrealengine/comments/4nt0up/need_help_debugging_this _blueprint/

19.

WorldSubsystem活用例 処理範囲を分担してクラスを小分けにすると 整理も改良もしやすくなる! プレイヤー操 作 Player ゲームフロー スコア管理 UI管理 GameMode ScoreManager Subsystem UIManager Subsystem

20.

単一責任の原則(超要約) クラスごとに役割を一つに絞ると、 分かりやすくて仕様変更に強いクラスになる スコア「だけ」を管理するクラスを作ってしまおう!

21.

ScoreManagerSubsystem実装 ScoreManagerSubsystemを実装します 持っているのはスコアとスコア加算関数のみ これでもしスコア計算方法が変更されても AddScore関数を変更するだけで済むようになります

22.

ScoreManagerSubsystem実装 変数定義 ・BlueprintReadOnly ->BPからは読み取りのみ可能(変更不可、Setノードが使えなくなる) ・meta ->メタデータ指定子 ノードでの表示名やツールチップなど、エディタでの動作を制御できる ・Tooltip ->メタデータの1つ ノードにマウスをかざすと指定した文字列を表示できる

23.

ScoreManagerSubsystem実装 関数定義 ・BlueprintCallable ->BPから関数を呼び出せるようにする ・meta ->メタデータ指定子 ノードでの表示名やツールチップなど、エディタでの動作を制御できる ・Tooltip ->メタデータの1つ ノードにマウスをかざすと指定した文字列を表示できる

24.

ScoreManagerSubsystem実装 関数実装

25.

実装前 GameModeにスコアを実装 別クラスから BP_FIrstPersopnGameModeに キャストしてスコアを追加

26.

実装結果 キャストが不要になり、スコアへのアクセス方法が 明快に! クラスの役割を明確にしつつアクセス性を大きく 高められるのがSubsystemの強みの一つ

27.

WorldSubsystem活用例② Player GameMode UI ScoreManager インスタンスを直接使用 (依存している状態)

28.

WorldSubsystem活用例② Player GameMode UI ScoreManager 仕様変更されました インスタンスを直接使用 (依存している状態) UIの仕様にあわせて 変更が発生するかもしれない

29.

WorldSubsystem活用例② 関数だけ渡しておく Player GameMode ScoreManager EventHandler Subsystem UI

30.

WorldSubsystem活用例② 関数だけ渡しておく Player GameMode EventHandler Subsystem ScoreManager UI 仕様変更されました 関数だけを登録・管理するWorldSubsystemを間 に挟むことで依存関係の発生を回避(疎結合)

31.

EventHandlerSubsystem実装 イベントを登録する仕組みとして「デリゲート」を利用します デリゲートは関数の情報を持ったクラス BPではイベントディスパッチャーや ComponentBeginOverlap等一部イベントが該当する デリゲートを活用すると呼び出し方法を変えずに処理だけ 変更するといったことができるようになります

32.

EventHandlerSubsystem実装 DECLARE_DYNAMIC_DELEGATEマクロを利用すると BPでも利用可能なデリゲートを定義できます 引数や戻り値を設定する方法もありますがここでは割愛 ↑引数に入れた文字列がデリゲートの名前になる 頭にFを付けるのが慣習

33.

EventHandlerSubsystem実装 マップに格納される値はデリゲートのArray(配列)なので 複数のイベントを同時に実行することも可能です 関数の持ち主がDestroy等で消えているとクラッシュ するので生存確認は忘れずに!

34.

EventHandlerSubsystem実装 変数定義

35.

EventHandlerSubsystem実装 関数定義

36.

EventHandlerSubsystem実装 RegisterEvent実装

37.

EventHandlerSubsystem実装 CallEvent実装

38.

実装前 GameModeがUIに依存 UI更新のためにGameModeに依存

39.

実装結果 GameModeとUIいずれも参照することなく 的からUI更新が行えるように! イベント識別用の文字列はGameplayTagに 変更するとタイポが減ってさらに分かりやすくできます

40.

WorldSubsystemのポテンシャル ・UIの管理や更新 ・敵のスポーン ・スコア管理 ・SEの再生 これ全部 WorldSubsystemで管理できます etc...

41.

Subsystemの強み ・どこからでもアクセスできる ・キャストやインターフェースが不要 ・自動生成・管理で安心 ・BPでは難しかった役割整理が得意 1つのSubsystemになんでも突っ込むと本末転倒なので注意

42.

応用・Subsystemとプラグイン hoge Subsystem ←Subsystemをプラグイン(モジュール)でラップするだけ 一つの機能を切り出す単位としてちょうどいいため hogePlugin Module hogePlugin プラグイン開発とも相性バツグン

43.

応用・Subsystemとプラグイン EditorUtilityWidgetと併用することで 強力かつ汎用性の高いツールを作ることができる!

44.

まとめ ・Subsystem=「どこからでもアクセスできる機能の入れ物」 ・機能整理や参照問題はSubsystemで解決 ・必要な実装がシンプルなのでC++の練習に最適 ・プラグインに内蔵することで汎用性UP

45.

これだけは覚えて帰ってください Subsystemは、いいぞ。 C++入門、役割整理、プラグイン実装etc… Subsystemは全てを解決する