追記
公開当初は「4.24から入った」というタイトルでしたが…4.23からでしたああああああああああああ
申し訳ありませんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんn
はじめに
SubSystemって何?という方はまず以下のページをご確認ください。
プログラミング サブシステム | Unreal Engine ドキュメント
UE4.24時点であるSubSystem pic.twitter.com/Q3ZOMALtSC
— おかず (@pafuhana1213) 2019年12月29日
UE4.24でEdiorSubSystem継承のSubSystemが幾つか追加されています。そして、その中のEditor Validator Subsystemはアセット保存時などで走るチェック処理(Validate Assets)を簡単に拡張できるという非常に強力な仕組みです!例えば「対象のStatic MeshアセットがLODを持っていない場合はエラーを出す」というチェック・通知処理をBPでサクッと作ることができます。
このような仕組みを用意することで「不適切な設定なアセットが混じることで余分な負荷・エラーが発生する」ことを防止できます。特に中規模・大規模プロジェクトでは致命的になりがちなので早めの段階で用意しておきましょう!
Editor Validator Subsystemの使い方
「対象のStatic MeshアセットがLODを持っていない場合はエラーを出す」を例にどのようにしてEditor Validator Subsystemを使うのかを説明します。
Editor Utility Blueprintを作成
はじめに、EditorValidatorBaseクラスをベースにしてEditor Utility Blueprintを作成します。この作成したBPにて「チェック対象にするクラスの指定」と「対象のアセットに対して行うチェック処理」を実装していきます。
チェック対象にするクラスを指定
まずはCan Validate Asset関数をオーバーライドし、どのアセットクラスを対象とするか指定します。今回はStatic Meshアセットを対象とするので上図のようにします。
対象のアセットに対して行うチェック処理を実装
次にValidate Loaded Asset関数をオーバーライドし、チェック処理の内容を書いていきます。
チェック処理を通過した場合は、Asset Passesノードを呼び、ReturnノードでValidを返します。
チェック処理に引っかかった場合は、Asset Failsノードを呼び、ReturnノードでInvalidを返します。このAsset Failsノードの各引数ピンで指定する内容はエラー画面にて表示されるのでちゃんと設定しましょう!
Editor Validator SubsystemにEditor Utility Blueprintを登録(新規作成時のみ)
次に、Add Validatorノードを使うことで実装したチェック処理をEditor Validator Subsystemに登録します。
(BPの場合、Editor Validator SubsystemはEditor Scripting系のBPからしかアクセスできないため、EditorUtilityWidgetなどで実装する必要があります)
なお、エディタ起動時に各EditorValidatorBase継承のBPは自動的にEditor Validator Subsystemに登録されます。 そのため、上記の処理はEditorValidatorBase継承のBPの作成した後にエディタを再起動すれば不要です。(UEditorValidatorSubsystem::Initialize参照)
アセットのチェック処理を走らせてみよう
これで準備完了です!試しにLODを持っていないStatic Meshアセットを保存するか、右クリックメニューからチェック処理(Validate Assets)を走らせてみましょう!
こんな感じにエラーが出ます!最前面にウィンドウが出てくるので、ログに出力する場合と違って無視される可能性が低い…かと思います!
また、EditorUtilityWidgetなどから明示的にチェック処理を走らせることもできます。そのため、AssetRegistryを使って自動抽出したアセットに対してチェック処理を走らせたりすることができます。
最後に
簡単ではありましたが、Editor Validator Subsystemを使ってアセットのチェック処理を拡張する方法について紹介しました!実装が簡単な上に、エンジン標準のチェック処理に追加する形になるのでワークフローも組みやすいかとと思います。また、ログ出力と違って最前面にエラー文を出せるというのは大きな強みかと思います!是非試してみてください!
おまけ
具体的にどういう仕組みになっているのか知りたい方は UEditorValidatorSubsystem::ValidateAssets の実装をご確認ください。
おしまい