10.3K Views
May 02, 24
スライド概要
Editor Utility Widget Petit Deep Dive ゲームデザイナー キンアジ
注意 • 「Editor Utility Widget」のことを「EUW」と省略しています。 • スライド内のUE4Editorのキャプチャー画像は すべて4.24.2を使用しています。 • 以下のEUWの知識をつけてから読むことをお勧めします。(スライドは後日公開) また、一部の紹介した機能は、後日プロジェクトを公開するのでダウンロードして ご自身の環境でお試しください。 ↓↓EUWのドキュメント • Editor Utility Widget | Unreal Engine ドキュメント • Editor Utility Widgetで色々便利にしてみた。by しょーご様 • 【UE4】Editor Utility Widgetについてのあれこれby 株式会社アンナプルナ(キンアジ) • [UE4]エディタ上で動作するツール・エディタ拡張をUMGで簡単に作れる Editor Utility Widget についてby おかず様 • 【UE4】メモ:実はEditor Utility WidgetはBlutilityの完全上位互換だった話【★★】by キンアジ
目次 • Details View & Single Property View Widget • Details View Widget • Single Property View Widget • Help Text • Editor Utility Widgetの罠 • その1 • その2 • その3 • レベル遷移時に自動でEUWを消す方法 • Editor Utility Widgetの制作事例 今日話すこと part2!!
Editor Utility Widget(EUW)って? • 「User Widget」を使って、エディター拡張ができるものです。 この EUWは、その機能をエディター上のツールとして使用することができ ます。 EUWを右クリック→「Run Editor Utility Widget」選択で実行できる。 「Add New」から「Editor Utilities」 →「Editor Utility Widget」で作成可能
EUWの特徴 • 非プレイ中でも機能する →ゲームを実行していなくても、エディターツールなので機能を使うことができます。 • Editor UtilityなBlueprintが使える →エディター上でのみ使えるBlueprint(アセットをセーブする「Save Asset」や、 DataTableをReimportする「Fill Data Table from csv String」など)を 使うことができます。 • 特殊なWidget「Detail View」「Property View」が使える →Detail Windowなんかでよく使われているアセットの参照などのUIを使うことができます。
では早速Petit Deep Dive! プチディープ!
Details View & Single Property View Widget
Details View Widget
Details View Widget • UObject*を対象に、そのObjectが持っている UPROPERTYなプロパティとCallInEditorをつけたUFUNCTIONな 関数を呼び出すボタンを表示してくれる。 こんな風に、EUWの中にアセットの参照や、 →「Set Object」関数でUObjectを指定。 パラメーターなどを表示してくれる。 超便利!
Details View Widget • UObject が持つプロパティが多い場合に、表示するプロパティを制限したい 場合、「Categories to Show」と「Property to Show」という配列に それぞれ、CategoryName,PropertyNameを指定することで 表示するプロパティを制限することができます。 CategoryNameを指定して表示 PropertyNameNameを指定して表示
Details View Widget • Property Viewにフィルターを付けたい場合は、 「bAllowFiltering」をTrueにすることで、 DetailViewの上に検索ボックスが現れる。(デフォルトでFalse) bAllow Filtering=False bAllow Filtering=True 検索ボックスが出てくる! 「View」カテゴリ内にある
Details View Widget • 表示されるプロパティは、デフォルトではUProperty*の 「PropertyFlags」に「CPF_Edit」をもつUPROPERTY (EditAnywhere,VisibleDefaultOnlyとか)のみ。 →しかし、「bForceHiddenPropertyVisibility」をTrueにすることで、 すべてのUPROPERTYを表示するようになる。 Uobject継承のクラスにいろんなUPROPERTYをつける それをDetailViewで表示する (Editor Utility WidgetのEventGraph)
Details View Widget bForceHiddenPropertyVisibility = False このように表示される プロパティを制御できる bForceHiddenPropertyVisibility = True
Single Property View Widget
Single Property View Widget Details View同様プロパティを表示するものだが、 こちらはPropertyNameを指定して使う。指定したPropertyNameの プロパティのみ表示してくれる。 プロパティの一つを表示してくれる! 超便利!
Single Property View Widget • PropertyNameは正しく指定すること。特にbool。 (例えば、エディター上はSceneComponentの「bVisible」というプロパティは エディター上では「Visible」となっており勘違いしやすい。 正しく「bVisible」と入力する。 • 表示できるプロパティに制約が多い(次スライド) Editorで表示される名前じゃなく 実際の変数名で指定するのを気を付ける!
Single Property View Widget • 「NameOverreide」というプロパティに任意の文字を入れることで、 表示される名前が入力した文字になる。 表示名が変化! 任意の文字を入力
Single Property View Widget • Details Viewとは違いどんなプロパティでも表示できるわけではない。 ( bForceHiddenPropertyVisibilityは設定できない) → 「PropertyFlags」に「CPF_Edit」をもつUPROPERTYのみ。 ・さらに、 UStructProperty,UArrayProperty,UMapProperty,USetProperty なプロパティも設定できない FVectorとかも構造体だから (つまり構造体とか配列とかを設定することはできない) ※SinglePropertyView.cpp参照 ダメなんだ…
Help Text
Help Text Content Browser上で補助的な検索ワードとなる文字を設定できる。 →どんな機能なのかをあらかじめ記載しておけば、そのテキストで検索が可能。 (UPROPERTY(AssetRegistrySearchable)なプロパティです) ClassDefaultで設定 Content Browserで 「HelpText=…」と入力
Editor Utility Widgetの罠
その1 • 通常のBlueprintを作成する方法でEUWを作成した場合は、 EUWアセット右クリック→「Run Editor Utility Widget」が使えません 「Editor Utilities」から作成しましょう。 ※Runが使えない以外は特に問題はなさそうです。
その2 実はEUWを一度実行してEUWを消しても、EUWのインスタンスは残っています。 →EUWのBPをコンパイルするとリセットされます! (もしくは他のGCのタイミングで消える) 実行&消す 3つ…? 実行&消す 実行&消す DebugFilterみると 残っているのがわかる
その3 • EUWがActorではないため、WorldContextが必要な関数があります。 そして、プレイ中か非プレイ中かで、指定するWorldContextが変わってきます。 →FWorldContext • プレイ中なら「Get Game World」非プレイ中なら「Get Editor World」 でWorldContext用のオブジェクトを取得しよう! (Editor Scripting Utilitiesプラグインを有効にする必要あり) WorldContextオブジェクトが必要な関数 これらの関数の返り値をつなげることで、機能するようになる
その4 • Actorの参照をもったまま、別のレベルを開いたりしようとすると クラッシュします。気を付けましょう。 ※変数に保持するだけなら問題なさそうでした。 →Detail Views系のWidgetの参照が残ってるとクラッシュする。 EUWを開いたまま 別マップを開こうとする くらっしゅ!!
このクラッシュの回避方法 (レベル遷移時に自動でEUWを消す方法)
まずは、実行中のEUWをBPで消す方法
実行中のEUWをBPで消す方法 • EditorUtilitySubsystem.cppのSpawnAndRegisterTab()内の タブを取得する部分をコピーして使用する。 この辺りをコピー!
実行中のEUWをBPで消す方法 • 自作のFunctionLibraryクラスにペーストする。 →SDockTabの関数「RequestCloseTab()」を使ってウィンドウを消す。 LevelEditor.hをinclude いらないところは消す! RequestCloseTab()を追加!
実行中のEUWをBPで消す方法 • Header
実行中のEUWをBPで消す方法 • Moduleは「Blutility,UMGEditor,Slate」の3つを追加
実行中のEUWをBPで消す方法 • ブループリント側 EUWにButtonを登録 それが押されたら、 自身のEUWアセットを指定し、そのEUWを消す
実行中のEUWをBPで消す方法 • 結果 消せた!!
次は、レベルを開く際のイベントをバインド
レベル遷移時に自動でEUWを消す方法 • EUWを継承したクラスを作成
レベル遷移時に自動でEUWを消す方法 • C++の中身追加部分 UUserWidget::Initialize()の オーバーライド (アセットを開いた時のデリゲートを バインド) バインド デリゲートされる処理の中身 開いたアセットが「レベル(Uworld*)」 であれば、EUWを消す。 レベルを開く際、 UAssetEditorSubsystem::OnAssetEditorRequestedOpen() がデリゲートされるので、そのイベントを受け取って、EUWを消す
レベル遷移時に自動でEUWを消す方法 • ブループリント側(例) 通常のEUWクラス 作成したEUWクラス 作成したEUWクラスの ClassDefaultで、 「EUWBPRef」に、 作成した自身のBPアセットを設定する。
レベル遷移時に自動でEUWを消す方法 • 結果 通常のEUWクラス ばいばいエディター!! 作成したEUWクラス くらっしゅ回避!!
Editor Utility Widgetの制作事例
①エディター上でWebを表示 • 「Web Browser」プラグインをつかうことで、EUW上にWebサイトを表示できる。 ドキュメントなどのリンクを入れることで、いちいちアクティブウィンドウの切り替え をしなくてもよくなり、すぐにドキュメントに飛んだりできる。 「Web Browser」プラグインを 有効にすることで、「Web Browser」 ウィジェットを使えるようになる。
②配置物をPhysicsで設置させる • LandScapeなどに箱などを設置させるときに、いちいちRotationを細かく 設定するのは面倒です。なので、SimulateしたPhysicsの結果をそのまま Transformに上書きするEUWを作成。(ブループリントオンリー)
③AssetのFavorite機能 • 選択したアセットをお気に入りに登録できるツール。 Content Browserにはフォルダのお気に入りしかないので、 アセットのお気に入りを自作。
④ScriptEditor • 自社用に作っているScript用のプラグインのScriptEditor。 関数名をプルダウンで選んだり、引数のデフォルト値を勝手に入力して くれる。(まだ試作) このようなテキスト形式で管理!
⑤自動ダンジョン生成ツール • あらかじめいくつかのマップの部品を作成しておくことで、 自動でその部品を指定した数・アルゴリズムでつなげてくれるツール。 レギュレーションをアルゴリズムに取り込んでおり、一瞬でいろんなパターン を作成できる。 通路の部品クラスをもったデータアセット 生成するアルゴリズムのクラス 生成する部品クラスの出現ウェイト 生成する部品の数 分岐の数や連続する部品の種類の ランダムな範囲のカーブアセット 最初や最後の部品を固定するフラグ 生成失敗したときに再試行する回数
以上 ご清聴ありがとうございました お疲れ様です!