Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

猫でも分かるUE4.22から入ったSubsystem

3,766 views

Published on

講演動画はこちら
https://www.youtube.com/watch?v=Wbq3KO3ZJaI

※補足
Q,使用するSubSystemを取捨選択したい場合はどうするの?
A.現状はPlugin内に自作Subsystemを置いて、プラグインをONOFFすることになるはずです。

発表者:岡田 和也(Epic Games Japan)
本スライドは2020年2月6日に行われた勉強会「 第4回 UE4何でも勉強会 in 東京」の講演資料です。
https://ue4allstudy.connpass.com/event/161710/

Published in: Engineering
  • Be the first to comment

猫でも分かるUE4.22から入ったSubsystem

  1. 1. 猫でも分かる UE4.22から入ったSubsystem - Online Subsystemの話じゃないよ - 第4回 UE4何でも勉強会 in 東京 Epic Games Japan 岡田 和也
  2. 2. #UE4 | @UNREALENGINE 自己紹介 Epic Games Japan サポートエンジニア 岡田和也 ( Twitter: おかず @pafuhana1213 ) 勉強会 登壇・主催者募集中! 今年はUE4勉強会の頻度増やしたい……
  3. 3. #UE4 | @UNREALENGINE ご注意 本講演の内容は UE4.24.2 で検証したものです Subsystem は正式リリース済みですが 今後の更新で一部内容が変わる可能性があります UE4.24 よりも 新しい・古い バージョンを使う際は その点についてご注意ください
  4. 4. #UE4 | @UNREALENGINE 当日のライブ配信のアーカイブ・他講演資料はこちら https://www.youtube.com/watch?v=Wbq3KO3ZJaI https://ue4allstudy.connpass.com/event/161710/presentation/
  5. 5. #UE4 | @UNREALENGINE UE4.22 リリースノートより 新機能:サブシステム サブシステムは管理されたライフタイムを持つ 自動的にインスタンス化されたクラスです。 このクラスはブループリントと Python を 同時にそのまま使用せず、 複雑なエンジン クラスの変更または上書きをすることなく、 拡張ポイントを簡単に使用できます。
  6. 6. #UE4 | @UNREALENGINE UE4.22 リリースノートより
  7. 7. #UE4 | @UNREALENGINE UE4.22 リリースノートより 現在サポートされているサブシステムの有効期間 エンジン class UMyEngineSubsystem :public UEngineSubsystem { ...}; エンジン サブシステムのモジュールがロードされると、サブシステムはモジュ ールの Startup() 関数が戻った後に Initialize() を実行します。 サブシステムは、 モジュールの Shutdown() 関数が戻った後に Deinitialize() を実行します。 これらのサブシステムは、次の GEngine を通してアクセスされます。 UMyEngineSubsystem MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>();
  8. 8. #UE4 | @UNREALENGINE
  9. 9. #UE4 | @UNREALENGINE 「なんや便利そうやけどよう分からん…」 「C++必須なん? ワイ、BPしか分からんで?」 「どういうときに使えばええの?」 猫でも分かるように説明して!
  10. 10. #UE4 | @UNREALENGINE Subsystemが追加されたことで どんなことができるようになったの?
  11. 11. #UE4 | @UNREALENGINE できるようになったこと ① 使い勝手の良い ○○○ Manager, Systemを簡単に作れるように!
  12. 12. #UE4 | @UNREALENGINE
  13. 13. #UE4 | @UNREALENGINE できるようになったこと ② Editor Scripting機能が更に捗るように! より柔軟な作業・チェックフローを構築可能に!
  14. 14. #UE4 | @UNREALENGINE
  15. 15. #UE4 | @UNREALENGINE
  16. 16. #UE4 | @UNREALENGINE ええ感じやん!
  17. 17. #UE4 | @UNREALENGINE 本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 3. 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem
  18. 18. #UE4 | @UNREALENGINE Subsystem とは?
  19. 19. #UE4 | @UNREALENGINE Subsystem とは? Engine, Editor, Game Instance, World, Local Player が 管理(生成・保持・破棄)する インスタンス( UObject ) 各Subsystemを継承したC++クラスを元に管理する
  20. 20. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 事前準備 -
  21. 21. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 事前準備 -
  22. 22. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 事前準備 - UCLASS() class ○○○_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() UFUNCTION(BlueprintCallable) int32 GetScore(){return Score;} private: int32 Score; };
  23. 23. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 生成 -
  24. 24. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 生成 - My Game Instance Subsystem Game Instance の SubsystemCollection に格納 ( FSubsystemCollection<UGameInstanceSubsystem> )
  25. 25. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 保持 - My Game Instance Subsystem
  26. 26. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 取得 - GameInstance->GetSubsystem <UMyGameInstanceSubsystem>();
  27. 27. #UE4 | @UNREALENGINE Game Instance Subsystemの場合 - 破棄 - My Game Instance Subsystem
  28. 28. #UE4 | @UNREALENGINE Subsystem とは? 事前に用意したC++クラスを元に Engine の一部機能が自動生成するインスタンス Subsystem の 生成(初期化)・破棄処理は 自身を管理しているものと同じタイミングで実行 Subsystem への アクセスは 自動生成されたBPノード か C++関数から可能
  29. 29. #UE4 | @UNREALENGINE 本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 3. 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem
  30. 30. #UE4 | @UNREALENGINE できるようになったこと ①(振り返り) 使い勝手の良い ○○○ Manager, Systemを簡単に作れるように!
  31. 31. #UE4 | @UNREALENGINE Score Managerを作る場合… ゲーム実行中だけ機能してほしい ● ゲーム開始したら生成・初期化 ゲーム終了したら破棄 or リセット 様々なBP, C++からアクセスしたい
  32. 32. #UE4 | @UNREALENGINE Subsystemがないとき… 既存のGame Instance や Game Mode などに処理を追加…? 処理・管理の複雑化、汎用性の欠如 専用のManager Actorをレベルに配置…? 配置忘れなどのヒューマンエラー、Actorへのアクセスが面倒 Game Singleton Class や 新規C++クラスを作って対応…? 実装コストの問題、エンジン改造が必要になる可能性 機能が不足 or 過剰すぎる可能性
  33. 33. #UE4 | @UNREALENGINE Score Managerを作る場合… ゲーム実行中だけ機能してほしい ● ゲーム開始したら生成・初期化 ゲーム終了したら破棄 or リセット 様々なBP, C++からアクセスしたい これを1から作るのは めんどくさいなぁ…
  34. 34. #UE4 | @UNREALENGINE ざっくりまとめると…(振り返り) Subsystem の 生成(初期化)・破棄処理は 自身を管理しているものと同じタイミングで実行 Subsystem への アクセスは 自動生成されたノード または 専用のC++関数から可能 Subsystem の 寿命は その Subsystem を管理してるものと同じ
  35. 35. #UE4 | @UNREALENGINE Engine Game Instance World Local PlayerEditor
  36. 36. #UE4 | @UNREALENGINE Score Subsystem Engine Game Instance World Local Player Game Instance は 実行時に生成され、終了時に破棄される Score Subsystem は 実行中だけ機能する 初期化・破棄も呼ばれる Editor
  37. 37. #UE4 | @UNREALENGINE Subsystem の活用例
  38. 38. #UE4 | @UNREALENGINE Performance Check Subsystem Asset Check Subsystem Score Subsystem Gimmick Subsystem Bullet Pooling Subsystem Player Attack Subsystem Player Life Subsystem Player State Subsystem Weather Subsystem Engine Editor Game Instance World Local Player
  39. 39. #UE4 | @UNREALENGINE ○○○Manager/SystemをSubsystemで作るメリット 実装コストを削減 初期化・破棄・寿命管理などが既に揃っている! 高いユーザビリティ BP, C++からのSubsystemへのアクセスは非常にかんたん! Engine 機能 の Component・Moduleとして扱うことが可能 既存コード・アセットに手を入れる必要もない!Plugin化も可能! 一つのクラスに実装が集中する問題も回避
  40. 40. #UE4 | @UNREALENGINE 逆にデメリットは? Subsystem側の処理は 全て C++ で実装する必要がある カプセル化・ブラックボックス化しやすいと考える! 神クラス・マネージャになる危険性 機能毎にSubsystemを分けること(モジュール化)を意識する! アセットへの参照過多によるロード・メモリ増加問題 直接参照ではなく間接参照にすることを意識しましょう https://docs.unrealengine.com/ja/Programming/Assets/ReferencingAssets/index.html
  41. 41. #UE4 | @UNREALENGINE 本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 3. 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem
  42. 42. #UE4 | @UNREALENGINE できるようになったこと ② (振り返り) Editor Scripting機能が更に捗るように! より柔軟な作業・チェックフローを構築可能に!
  43. 43. #UE4 | @UNREALENGINE UE4.24 時点では 8 個のエディタ作業用Subsystemが エンジン標準に組み込まれています 更に、エンジンのコア機能の一部は それらのSubsystemを経由して 処理が走るように変更されています
  44. 44. #UE4 | @UNREALENGINE Asset Editor Subsystem Editor Utility Subsystem Editor Validator Subsystem Import Subsystem Stylus Input Subsystem Layers Subsystem VPSouting Subsystem Asset Tags Subsystem UE4標準の エディタ作業用 Subsystem Editor Subsystem 継承 Engine Subsystem 継承
  45. 45. #UE4 | @UNREALENGINE Skeletal Meshアセットを開いた際の処理 Asset Editor Subsystem Open Editor For Asset Find Editor For Asset On Asset Editor Opened
  46. 46. #UE4 | @UNREALENGINE Skeletal Meshアセットを開いた際の処理 Asset Editor Subsystem Open Editor For Asset Find Editor For Asset On Asset Editor Opened
  47. 47. #UE4 | @UNREALENGINE エディタ作業用 Subsystem のメリット 既存のEditor Scripting機能よりも 更にコア寄りな機能を BP, C++から呼び出せる!エンジン改造なしで! ( BPの場合、Editor Utility Blueprint / Widgetからのみ利用可能 ) 特定のエディタ操作に 処理を紐付ける(Bindする)ことも!
  48. 48. #UE4 | @UNREALENGINE エディタ作業用 Subsystem の課題 標準で用意されている関数を Override する場合は エンジン改造が必要になる AssetEditorSubsystemの派生クラスで処理を改造…ができない 呼ばれるのはこちら
  49. 49. #UE4 | @UNREALENGINE エディタ作業用 Subsystem の課題 FSubsystemCollectionBase::GetSubsystemInternal か FSubsystemCollectionBase::AddAndInitializeSubsystem を 「いい感じに」すれば「いい感じに」になるはず… 既存のコードだと派生クラスが使われない… EditorEngine の EditorSubsystemCollection から エンジン標準のエディタ作業用Subsystem を除外する必要がある 実装担当者に相談中…
  50. 50. #UE4 | @UNREALENGINE USubsystem* FSubsystemCollectionBase::GetSubsystemInternal(TSubclassOf<USubsystem> SubsystemClass) const { USubsystem* SystemPtr = SubsystemMap.FindRef(SubsystemClass); if (SystemPtr) { return SystemPtr; } else { const TArray<USubsystem*>& SystemPtrs = GetSubsystemArrayInternal(SubsystemClass); if (SystemPtrs.Num() > 0) { return SystemPtrs[0]; } } return nullptr; }
  51. 51. #UE4 | @UNREALENGINE 抽象化クラスの場合 は override 可能 UCLASS(Abstract) class UMySubsystemBase : public UGameInstanceSubsystem {} class UMySubsystem : public UMySubsystemBase {} GameInstance->GetSubsystem< UMySubsystemBase >(); GameInstance->GetSubsystem< UMySubsystem >(); 返すインスタンスは どちらも UMySubsystem
  52. 52. #UE4 | @UNREALENGINE 本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 3. 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem
  53. 53. #UE4 | @UNREALENGINE Subsystemの種類 Runtime で使える Subsystem EngineSubsystem, WorldSubsystem, GameInstanceSubsystem, LocalPlayerSubsystem, AssetTagsSubsystem Editor Only な Subsystem EditorSubsystem, AssetEditorSubsystem, EditorUtilitySubsystem, EditorValidatorSubsystem, ImportSubsystem, LayerSubsystem, StylusInputSubsystem, VPScoutingSubsystem その他 Subsystem, DynamicSubsystem
  54. 54. #UE4 | @UNREALENGINE 時間の都合により 使う可能性の高い Subsystem のみをご紹介
  55. 55. #UE4 | @UNREALENGINE VPScoutingSubsystem https://docs.unrealengine.com/ja/Engine/Editor/VR/VirtualScouting/index.html StylusInputSubsystem http://historia.co.jp/archives/12917/
  56. 56. #UE4 | @UNREALENGINE Runtime で使える Subsystem
  57. 57. #UE4 | @UNREALENGINE Engine Subsystem UEngineが管理 最も早く生成され、最も最後に破棄される ● 初期化 :UEngine::Init() ● 破棄 : アクセス方法の例( C++ ) GEngine->GetEngineSubsystem<UMyEngineSubsystem>();
  58. 58. #UE4 | @UNREALENGINE GameInstance Subsystem UGameInstanceが管理 ゲーム実行時(PIEなど)に生成され、終了時に破棄される ● 初期化 :UGameInstance::Init() ● 破棄 :UGameInstance::Shutdown() アクセス方法の例( C++ ) UGameInstance* GameInstance = GetWorld()->GetGameInstance(); GameInstance->GetSubsystem<UMyGameInstanceSubsystem>();
  59. 59. #UE4 | @UNREALENGINE World Subsystem UWorldが管理 ゲーム実行・Open Level時に生成・破棄される。サブレベルは無関係 ● 初期化 :UWorld::InitWorld() ● 破棄 :Uworld::CleanupWorld() アクセス方法の例( C++ ) UWorld* World = GetWorld(); World->GetSubsystem<UMyWorldSubsystem>();
  60. 60. #UE4 | @UNREALENGINE Local Player Subsystem ULocalPlayerが管理 ローカルプレイヤーの数だけ存在するSubsystem ● 初期化 :ULocalPlayer::PlayerAdded ● 破棄 :ULocalPlayer::PlayerRemoved() アクセス方法の例( C++ ) ULocalPlayer* LocalPlayer = PlayerController->GetLocalPlayer() LocalPlayer->GetSubsystem<UMyLocalPlayerSubsystem>();
  61. 61. #UE4 | @UNREALENGINE 生成・破棄タイミングの把握は重要! 各Subsystem の特性を理解した上で どれを使って 仕組みを実装するか検討するべき 天候に関するシステムを作る場合は? Object Poolを作る場合は?
  62. 62. #UE4 | @UNREALENGINE 判断基準の例 レベルに紐づく 要素を管理 World Subsystem ゲーム全般に 関わる要素を管理 Game Instance Subsystem プレイヤー毎の 要素を管理 Local Player Subsystem 監視系などの ツール寄りの機能 Engine Subsystem
  63. 63. #UE4 | @UNREALENGINE Performance Check Subsystem Asset Check Subsystem Score Subsystem Gimmick Subsystem Bullet Pooling Subsystem Player Attack Subsystem Player Life Subsystem Player State Subsystem Weather Subsystem Engine Editor Game Instance World Local Player
  64. 64. #UE4 | @UNREALENGINE Performance Check Subsystem Asset Check Subsystem Score Subsystem Gimmick Subsystem Bullet Pooling Subsystem Player Attack Subsystem Player Life Subsystem Player State Subsystem Weather Subsystem Engine Editor Game Instance World Local Player メモリに余裕がない場合は World の方が 破棄の管理が楽かも
  65. 65. #UE4 | @UNREALENGINE おすすめドキュメント ゲームフローの概要 https://docs.unrealengine.com/ja/Gameplay/Framework/GameFlow/index.html
  66. 66. #UE4 | @UNREALENGINE AssetTags Subsystem Content Browser の Collection 機能に関する機能を提供 エディタ作業用寄りですが、一部の機能はRuntimeでも利用可能
  67. 67. #UE4 | @UNREALENGINE 余談ですが、UE4.24 から Collection の UI変わりました
  68. 68. #UE4 | @UNREALENGINE Editor でのみ使える Subsystem Asset Editor Subsystem Editor Utility Subsystem Editor Validator Subsystem Import Subsystem Stylus Input Subsystem Layers Subsystem VPSouting Subsystem Editor Subsystem 継承
  69. 69. #UE4 | @UNREALENGINE Editor Only な Subsystem なので、BPノードは Editor Utility Blueprint または Editor Utility Widget でしか使うことができません! http://kinnaji.com/ Editor Utility Widget タグ付きの記事一覧 Editor Utility Blueprint タグ付きの記事一覧 おすすめ解説ブログの紹介
  70. 70. #UE4 | @UNREALENGINE Asset Editor Subsystem 指定アセットに紐づく 編集エディタの開閉処理に関するSubsystem 編集エディタの 開閉タイミングを取得可能 ( C++限定 )
  71. 71. #UE4 | @UNREALENGINE Editor Utility Subsystem Editor Utility系BPの実行や ウィンドウ展開に関するSubsystem Tips: Editor Utility系 BP の Run関数を このSubsystem の Try Runノードで 呼び出せます
  72. 72. #UE4 | @UNREALENGINE Layer Subsystem World Outliner の Layer の制御に関するSubsystem
  73. 73. #UE4 | @UNREALENGINE
  74. 74. #UE4 | @UNREALENGINE Import Subsystem Asset の Import 処理に加えて Import に関する 通知を行うためのSubsystem ● Pre Import ● Post Import ● Re Import ● Post LOD Import
  75. 75. #UE4 | @UNREALENGINE Editor Validator Subsystem アセットのチェック処理( Validate ) に関するSubsystem アセット保存時 か 右図の項目を実行した際に チェック処理を実行
  76. 76. #UE4 | @UNREALENGINE このチェック処理を BPで簡単に拡張することが 可能です!
  77. 77. #UE4 | @UNREALENGINE 頂点数が一定値以上 かつ LODがない 場合に エラーを出す Editor Validator Base クラスをベースにした Editor Utility Blueprint で実装
  78. 78. #UE4 | @UNREALENGINE
  79. 79. #UE4 | @UNREALENGINE http://pafuhana1213.hatenablog.com/entry/2019/12/31/233628
  80. 80. #UE4 | @UNREALENGINE C++, Pythonからのアクセス方法 C++ GEditor->GetEditorSubsystem<UAssetEditorSubsystem>(); Python my_engine_subsystem = unreal.get_engine_subsystem(unreal.MyEngineSubsystem) my_editor_subsystem = unreal.get_editor_subsystem(unreal.MyEditorSubsystem)
  81. 81. #UE4 | @UNREALENGINE まとめ UE4.22 から入った Subsystemには Runtime で使えるものと エディタ作業用の2種類がある Subsystemを活用することで 使い勝手が良い○○○ Manager / System を 作りやすくなった ただし、事前に各Subsystem の特性を把握しておくことは大事 エディタ作業用Subsystemを活用することで エンジンのよりコア機能を プロジェクト側から触れるようになった
  82. 82. #UE4 | @UNREALENGINE 難しそうに感じた方へ… まずは GameInstance Subsystem を使って 簡単な ○○○ Manager を作ってみると良いかと思います! また、エディタ作業用Subsystem で用意されている BPノードを使って オレオレエディタ拡張 するのもオススメです! その後に本資料を見返すと より理解が進む…進んだら良いなぁ… と思いましたまる
  83. 83. #UE4 | @UNREALENGINE UNREAL FEST WEST 2020 参加登録受付中! 今年は初の2日間開催! 4/18:エンタープライズデー 4/19:ゲームデー http://unrealengine.jp/unrealfest/
  84. 84. #UE4 | @UNREALENGINE おまけ SubsystemをTickで動かすには FTickableGameObject または FTickableEditorObject を継承させる 例: class STYLUSINPUT_API UStylusInputSubsystem : public UEditorSubsystem, public FTickableEditorObject
  85. 85. #UE4 | @UNREALENGINE おまけ Subsystemを使ったScore Managerの作り方 Programming Subsystems | Live from HQ | Inside Unreal https://www.youtube.com/watch?v=v5b1FvKBYzc サンプルプロジェクト https://forums.unrealengine.com/unreal-engine/events/1673854- programming-subsystems-october-17-live-from-hq UE4.24でも動作することを確認済み

×