猫でも分かるUE4.22から入ったSubsystem【第4回 UE4何でも勉強会 in 東京 2020】

140.5K Views

February 06, 20

スライド概要

講演動画はこちら
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/

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

猫でも分かる UE4.22から入ったSubsystem - Online Subsystemの話じゃないよ - 第4回 UE4何でも勉強会 in 東京 Epic Games Japan 岡田 和也

2.

自己紹介 Epic Games Japan サポートエンジニア 岡田和也 ( Twitter: おかず @pafuhana1213 ) 勉強会 登壇・主催者募集中! 今年はUE4勉強会の頻度増やしたい…… #UE4 | @UNREALENGINE

3.

ご注意 本講演の内容は UE4.24.2 で検証したものです Subsystem は正式リリース済みですが 今後の更新で一部内容が変わる可能性があります UE4.24 よりも 新しい・古い バージョンを使う際は その点についてご注意ください #UE4 | @UNREALENGINE

4.

当日のライブ配信のアーカイブ・他講演資料はこちら https://www.youtube.com/watch?v=Wbq3KO3ZJaI https://ue4allstudy.connpass.com/event/161710/presentation/ #UE4 | @UNREALENGINE

5.

UE4.22 リリースノートより 新機能:サブシステム サブシステムは管理されたライフタイムを持つ 自動的にインスタンス化されたクラスです。 このクラスはブループリントと Python を 同時にそのまま使用せず、 複雑なエンジン クラスの変更または上書きをすることなく、 拡張ポイントを簡単に使用できます。 #UE4 | @UNREALENGINE

6.

UE4.22 リリースノートより #UE4 | @UNREALENGINE

7.
[beta]
UE4.22 リリースノートより
現在サポートされているサブシステムの有効期間
エンジン
class UMyEngineSubsystem :public UEngineSubsystem { ...};

エンジン サブシステムのモジュールがロードされると、サブシステムはモジュ
ールの Startup() 関数が戻った後に Initialize() を実行します。 サブシステムは、
モジュールの Shutdown() 関数が戻った後に Deinitialize() を実行します。
これらのサブシステムは、次の GEngine を通してアクセスされます。
UMyEngineSubsystem MySubsystem =
GEngine->GetEngineSubsystem<UMyEngineSubsystem>();

#UE4 | @UNREALENGINE

8.

#UE4 | @UNREALENGINE

9.

「なんや便利そうやけどよう分からん…」 「C++必須なん? ワイ、BPしか分からんで?」 「どういうときに使えばええの?」 猫でも分かるように説明して! #UE4 | @UNREALENGINE

10.

Subsystemが追加されたことで どんなことができるようになったの? #UE4 | @UNREALENGINE

11.

できるようになったこと ① 使い勝手の良い ○○○ Manager, Systemを簡単に作れるように! #UE4 | @UNREALENGINE

12.

#UE4 | @UNREALENGINE

13.

できるようになったこと ② Editor Scripting機能が更に捗るように! より柔軟な作業・チェックフローを構築可能に! #UE4 | @UNREALENGINE

14.

#UE4 | @UNREALENGINE

15.

#UE4 | @UNREALENGINE

16.

ええ感じやん! #UE4 | @UNREALENGINE

17.

本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 3. 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem #UE4 | @UNREALENGINE

18.

Subsystem とは? #UE4 | @UNREALENGINE

19.

Subsystem とは? Engine, Editor, Game Instance, World, Local Player が 管理(生成・保持・破棄)する インスタンス( UObject ) 各Subsystemを継承したC++クラスを元に管理する #UE4 | @UNREALENGINE

20.

Game Instance Subsystemの場合 - 事前準備 - #UE4 | @UNREALENGINE

21.

Game Instance Subsystemの場合 - 事前準備 - #UE4 | @UNREALENGINE

22.

Game Instance Subsystemの場合 - 事前準備 UCLASS() class ○○○_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() UFUNCTION(BlueprintCallable) int32 GetScore(){return Score;} private: int32 Score; }; #UE4 | @UNREALENGINE

23.

Game Instance Subsystemの場合 - 生成 - #UE4 | @UNREALENGINE

24.

Game Instance Subsystemの場合 - 生成 - My Game Instance Subsystem Game Instance の SubsystemCollection に格納 ( FSubsystemCollection<UGameInstanceSubsystem> ) #UE4 | @UNREALENGINE

25.

Game Instance Subsystemの場合 - 保持 - My Game Instance Subsystem #UE4 | @UNREALENGINE

26.

Game Instance Subsystemの場合 - 取得 - GameInstance->GetSubsystem <UMyGameInstanceSubsystem>(); #UE4 | @UNREALENGINE

27.

Game Instance Subsystemの場合 - 破棄 - My Game Instance Subsystem #UE4 | @UNREALENGINE

28.

Subsystem とは? 事前に用意したC++クラスを元に Engine の一部機能が自動生成するインスタンス Subsystem の 生成(初期化)・破棄処理は 自身を管理しているものと同じタイミングで実行 Subsystem への アクセスは 自動生成されたBPノード か C++関数から可能 #UE4 | @UNREALENGINE

29.

本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 3. 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem #UE4 | @UNREALENGINE

30.

できるようになったこと ①(振り返り) 使い勝手の良い ○○○ Manager, Systemを簡単に作れるように! #UE4 | @UNREALENGINE

31.

Score Managerを作る場合… ゲーム実行中だけ機能してほしい ● ゲーム開始したら生成・初期化 ゲーム終了したら破棄 or リセット 様々なBP, C++からアクセスしたい #UE4 | @UNREALENGINE

32.

Subsystemがないとき… 既存のGame Instance や Game Mode などに処理を追加…? 処理・管理の複雑化、汎用性の欠如 専用のManager Actorをレベルに配置…? 配置忘れなどのヒューマンエラー、Actorへのアクセスが面倒 Game Singleton Class や 新規C++クラスを作って対応…? 実装コストの問題、エンジン改造が必要になる可能性 機能が不足 or 過剰すぎる可能性 #UE4 | @UNREALENGINE

33.

Score Managerを作る場合… ゲーム実行中だけ機能してほしい ● ゲーム開始したら生成・初期化 ゲーム終了したら破棄 or リセット 様々なBP, C++からアクセスしたい これを1から作るのは めんどくさいなぁ… #UE4 | @UNREALENGINE

34.

ざっくりまとめると…(振り返り) Subsystem の 生成(初期化)・破棄処理は 自身を管理しているものと同じタイミングで実行 Subsystem の 寿命は その Subsystem を管理してるものと同じ Subsystem への アクセスは 自動生成されたノード または 専用のC++関数から可能 #UE4 | @UNREALENGINE

35.

Engine #UE4 | @UNREALENGINE Editor Game Instance World Local Player

36.

Engine Editor Game Instance World Local Player Score Subsystem Game Instance は 実行時に生成され、終了時に破棄される #UE4 | @UNREALENGINE Score Subsystem は 実行中だけ機能する 初期化・破棄も呼ばれる

37.

Subsystem の活用例 #UE4 | @UNREALENGINE

38.

Engine Editor Game Instance Performance Check Asset Check Score Gimmick Player Life Subsystem Subsystem Subsystem Subsystem Bullet Pooling Weather Player State World Local Player Subsystem Subsystem Subsystem Subsystem Player Attack Subsystem #UE4 | @UNREALENGINE

39.

○○○Manager/SystemをSubsystemで作るメリット 実装コストを削減 初期化・破棄・寿命管理などが既に揃っている! 高いユーザビリティ BP, C++からのSubsystemへのアクセスは非常にかんたん! Engine 機能 の Component・Moduleとして扱うことが可能 既存コード・アセットに手を入れる必要もない!Plugin化も可能! 一つのクラスに実装が集中する問題も回避 #UE4 | @UNREALENGINE

40.

逆にデメリットは? Subsystem側の処理は 全て C++ で実装する必要がある カプセル化・ブラックボックス化しやすいと考える! 神クラス・マネージャになる危険性 機能毎にSubsystemを分けること(モジュール化)を意識する! アセットへの参照過多によるロード・メモリ増加問題 直接参照ではなく間接参照にすることを意識しましょう https://docs.unrealengine.com/ja/Programming/Assets/ReferencingAssets/index.html #UE4 | @UNREALENGINE

41.

本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 3. 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem #UE4 | @UNREALENGINE

42.

できるようになったこと ② (振り返り) Editor Scripting機能が更に捗るように! より柔軟な作業・チェックフローを構築可能に! #UE4 | @UNREALENGINE

43.

UE4.24 時点では 8 個のエディタ作業用Subsystemが エンジン標準に組み込まれています 更に、エンジンのコア機能の一部は それらのSubsystemを経由して 処理が走るように変更されています #UE4 | @UNREALENGINE

44.

UE4標準の エディタ作業用 Subsystem Asset Tags Subsystem Editor Utility Stylus Input Subsystem Subsystem Subsystem Layers Import VPSouting Subsystem Subsystem Asset Editor Subsystem Editor Validator Subsystem #UE4 | @UNREALENGINE Engine Subsystem 継承 Editor Subsystem 継承

45.

Skeletal Meshアセットを開いた際の処理 Asset Editor Subsystem Open Editor For Asset Find Editor For Asset On Asset Editor Opened #UE4 | @UNREALENGINE

46.

Skeletal Meshアセットを開いた際の処理 Asset Editor Subsystem Open Editor For Asset Find Editor For Asset On Asset Editor Opened #UE4 | @UNREALENGINE

47.

エディタ作業用 Subsystem のメリット 既存のEditor Scripting機能よりも 更にコア寄りな機能を BP, C++から呼び出せる!エンジン改造なしで! ( BPの場合、Editor Utility Blueprint / Widgetからのみ利用可能 ) 特定のエディタ操作に 処理を紐付ける(Bindする)ことも! #UE4 | @UNREALENGINE

48.

エディタ作業用 Subsystem の課題 標準で用意されている関数を Override する場合は エンジン改造が必要になる AssetEditorSubsystemの派生クラスで処理を改造…ができない 呼ばれるのはこちら #UE4 | @UNREALENGINE

49.

エディタ作業用 Subsystem の課題 FSubsystemCollectionBase::GetSubsystemInternal か FSubsystemCollectionBase::AddAndInitializeSubsystem を 「いい感じに」すれば「いい感じに」になるはず… 既存のコードだと派生クラスが使われない… EditorEngine の EditorSubsystemCollection から エンジン標準のエディタ作業用Subsystem を除外する必要がある 実装担当者に相談中… #UE4 | @UNREALENGINE

50.
[beta]
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;

#UE4 | @UNREALENGINE

51.
[beta]
抽象化クラスの場合 は override 可能
UCLASS(Abstract)
class UMySubsystemBase
class UMySubsystem

: public UGameInstanceSubsystem {}
: public UMySubsystemBase {}

GameInstance->GetSubsystem< UMySubsystemBase >();
GameInstance->GetSubsystem< UMySubsystem >();
返すインスタンスは どちらも UMySubsystem

#UE4 | @UNREALENGINE

52.

本日のお品書き 1. Subsystem とは? 2. Subsystem の メリットについて 3. 1. ○〇〇Manager, Systemを簡単に作れる! 2. Editor Scriptingがさらに捗る! 各Subsystem の 概要・使い方について 1. Runtime で使える Subsystem 2. Editor 上でのみ使える Subsystem #UE4 | @UNREALENGINE

53.

Subsystemの種類 Runtime で使える Subsystem EngineSubsystem, WorldSubsystem, GameInstanceSubsystem, LocalPlayerSubsystem, AssetTagsSubsystem Editor Only な Subsystem EditorSubsystem, AssetEditorSubsystem, EditorUtilitySubsystem, EditorValidatorSubsystem, ImportSubsystem, LayerSubsystem, StylusInputSubsystem, VPScoutingSubsystem その他 Subsystem, DynamicSubsystem #UE4 | @UNREALENGINE

54.

時間の都合により 使う可能性の高い Subsystem のみをご紹介 #UE4 | @UNREALENGINE

55.

VPScoutingSubsystem https://docs.unrealengine.com/ja/Engine/Editor/VR/VirtualScouting/index.html StylusInputSubsystem http://historia.co.jp/archives/12917/ #UE4 | @UNREALENGINE

56.

Runtime で使える Subsystem #UE4 | @UNREALENGINE

57.

Engine Subsystem UEngineが管理 最も早く生成され、最も最後に破棄される ● 初期化 :UEngine::Init() ● 破棄 : アクセス方法の例( C++ ) GEngine->GetEngineSubsystem<UMyEngineSubsystem>(); #UE4 | @UNREALENGINE

58.

GameInstance Subsystem UGameInstanceが管理 ゲーム実行時(PIEなど)に生成され、終了時に破棄される ● 初期化 :UGameInstance::Init() ● 破棄 :UGameInstance::Shutdown() アクセス方法の例( C++ ) UGameInstance* GameInstance = GetWorld()->GetGameInstance(); GameInstance->GetSubsystem<UMyGameInstanceSubsystem>(); #UE4 | @UNREALENGINE

59.

World Subsystem UWorldが管理 ゲーム実行・Open Level時に生成・破棄される。サブレベルは無関係 ● 初期化 :UWorld::InitWorld() ● 破棄 :Uworld::CleanupWorld() アクセス方法の例( C++ ) UWorld* World = GetWorld(); World->GetSubsystem<UMyWorldSubsystem>(); #UE4 | @UNREALENGINE

60.

Local Player Subsystem ULocalPlayerが管理 ローカルプレイヤーの数だけ存在するSubsystem ● 初期化 :ULocalPlayer::PlayerAdded ● 破棄 :ULocalPlayer::PlayerRemoved() アクセス方法の例( C++ ) ULocalPlayer* LocalPlayer = PlayerController->GetLocalPlayer() LocalPlayer->GetSubsystem<UMyLocalPlayerSubsystem>(); #UE4 | @UNREALENGINE

61.

生成・破棄タイミングの把握は重要! 各Subsystem の特性を理解した上で どれを使って 仕組みを実装するか検討するべき 天候に関するシステムを作る場合は? #UE4 | @UNREALENGINE Object Poolを作る場合は?

62.

判断基準の例 ゲーム全般に 関わる要素を管理 Game Instance プレイヤー毎の 要素を管理 Local Player #UE4 | @UNREALENGINE Subsystem Subsystem レベルに紐づく 要素を管理 監視系などの ツール寄りの機能 World Subsystem Engine Subsystem

63.

Engine Editor Game Instance Performance Check Asset Check Score Gimmick Player Life Subsystem Subsystem Subsystem Subsystem Bullet Pooling Weather Player State World Local Player Subsystem Subsystem Subsystem Subsystem Player Attack Subsystem #UE4 | @UNREALENGINE

64.

Engine Editor Game Instance Performance Check Asset Check Score Gimmick Player Life Subsystem Subsystem Subsystem Subsystem Bullet Pooling Weather Player State World Local Player Subsystem Subsystem Subsystem メモリに余裕がない場合は World の方が 破棄の管理が楽かも #UE4 | @UNREALENGINE Subsystem Player Attack Subsystem

65.

おすすめドキュメント ゲームフローの概要 https://docs.unrealengine.com/ja/Gameplay/Framework/GameFlow/index.html #UE4 | @UNREALENGINE

66.

AssetTags Subsystem Content Browser の Collection 機能に関する機能を提供 エディタ作業用寄りですが、一部の機能はRuntimeでも利用可能 #UE4 | @UNREALENGINE

67.

余談ですが、UE4.24 から Collection の UI変わりました #UE4 | @UNREALENGINE

68.

Editor でのみ使える Subsystem Editor Utility Stylus Input Subsystem Subsystem Subsystem Layers Import VPSouting Subsystem Subsystem Asset Editor Subsystem Editor Validator Subsystem #UE4 | @UNREALENGINE Editor Subsystem 継承

69.

Editor Only な Subsystem なので、BPノードは Editor Utility Blueprint または Editor Utility Widget でしか使うことができません! おすすめ解説ブログの紹介 Editor Utility Blueprint タグ付きの記事一覧 Editor Utility Widget タグ付きの記事一覧 http://kinnaji.com/ #UE4 | @UNREALENGINE

70.

Asset Editor Subsystem 指定アセットに紐づく 編集エディタの開閉処理に関するSubsystem 編集エディタの 開閉タイミングを取得可能 ( C++限定 ) #UE4 | @UNREALENGINE

71.

Editor Utility Subsystem Editor Utility系BPの実行や ウィンドウ展開に関するSubsystem Tips: Editor Utility系 BP の Run関数を このSubsystem の Try Runノードで 呼び出せます #UE4 | @UNREALENGINE

72.

Layer Subsystem World Outliner の Layer の制御に関するSubsystem #UE4 | @UNREALENGINE

73.

#UE4 | @UNREALENGINE

74.

Import Subsystem Asset の Import 処理に加えて Import に関する 通知を行うためのSubsystem ● Pre Import ● Post Import ● Re Import ● Post LOD Import #UE4 | @UNREALENGINE

75.

Editor Validator Subsystem アセットのチェック処理( Validate ) に関するSubsystem アセット保存時 か 右図の項目を実行した際に チェック処理を実行 #UE4 | @UNREALENGINE

76.

このチェック処理を BPで簡単に拡張することが 可能です! #UE4 | @UNREALENGINE

77.

頂点数が一定値以上 かつ LODがない 場合に エラーを出す Editor Validator Base クラスをベースにした Editor Utility Blueprint で実装 #UE4 | @UNREALENGINE

78.

#UE4 | @UNREALENGINE

79.

http://pafuhana1213.hatenablog.com/entry/2019/12/31/233628 #UE4 | @UNREALENGINE

80.

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) #UE4 | @UNREALENGINE

81.

まとめ UE4.22 から入った Subsystemには Runtime で使えるものと エディタ作業用の2種類がある Subsystemを活用することで 使い勝手が良い○○○ Manager / System を 作りやすくなった ただし、事前に各Subsystem の特性を把握しておくことは大事 エディタ作業用Subsystemを活用することで エンジンのよりコア機能を プロジェクト側から触れるようになった #UE4 | @UNREALENGINE

82.

難しそうに感じた方へ… まずは GameInstance Subsystem を使って 簡単な ○○○ Manager を作ってみると良いかと思います! また、エディタ作業用Subsystem で用意されている BPノードを使って オレオレエディタ拡張 するのもオススメです! その後に本資料を見返すと より理解が進む…進んだら良いなぁ… と思いましたまる #UE4 | @UNREALENGINE

83.

UNREAL FEST WEST 2020 参加登録受付中! http://unrealengine.jp/unrealfest/ 今年は初の2日間開催! 4/18:エンタープライズデー 4/19:ゲームデー #UE4 | @UNREALENGINE

84.

おまけ SubsystemをTickで動かすには FTickableGameObject または FTickableEditorObject を継承させる 例: class STYLUSINPUT_API UStylusInputSubsystem : public UEditorSubsystem, public FTickableEditorObject #UE4 | @UNREALENGINE

85.

おまけ Subsystemを使ったScore Managerの作り方 Programming Subsystems | Live from HQ | Inside Unreal https://www.youtube.com/watch?v=v5b1FvKBYzc サンプルプロジェクト https://forums.unrealengine.com/unreal-engine/events/1673854programming-subsystems-october-17-live-from-hq UE4.24でも動作することを確認済み #UE4 | @UNREALENGINE