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