こんにちは、株式会社Leon Gameworksの遠藤です。

前回までは Editor Utility Widget(以下、EUW)でスクリプトアクションなどの機能を用いて実用的なツールを作成してきましたが、今回は少し趣旨を変えてエディタのUIに独自のメニューを追加する方法を解説します。

記事の目次

    0:動作環境

    本記事はUE5.3.2を基に執筆しており、エディタの言語は「英語」でスクリーンショットを撮影しております。

    本記事で作成するツールのプロジェクト一式のデータは以下からダウンロードできます。

    今回のプロジェクトデータ

    1:独自のメニューを追加

    Editor Utility Blueprint(以下、EUB)関連のクラスには、簡単にメニューを追加できるクラスが用意されています。まずはエディタ上部のツールバーにボタンを追加していきます。

    ▲ツールバー

    コンテンツブラウザ上で右クリックし、[Editor Utilities → Editor Utility Blueprint]を選択してアセットを作成します。

    ▲Editor Utility Blueprintの作成

    親クラスは「EditorUtilityToolMenuEntry」を指定します。

    ▲親クラスに「EditorUtilityToolMenuEntry」を選択

    アセット名は「EUB_MyMenu」とします。

    ▲アセット名を指定

    作成したアセットを開き、[Class Default]からメニューの設定を行います。

    設定項目の詳細については後述していますのでいったん下記のように設定しておきます。

    設定項目

    Menu

    LevelEditor.LevelEditorToolBar.User

    Name

    MyMenu

    Tool Tip

    MyMenu

    Style Set Name

    EditorStyle

    Style Name

    UnrealDefaultThumbnail

    Entry Type

    Tool Bar Button

    ▲メニューの設定

    これでメニューの側部分の設定が完了したので、次にメニューを登録するためのEUBを作成します。

    再度コンテンツブラウザで右クリックし、EUBアセットを作成します。親クラスには、[Editor Utility Object]を指定します。

    ▲親クラスは[Editor Utility Object]を指定

    アセット名は「EUB_ResisterMenus」とします。

    ▲アセット名を指定

    アセットを開き、[FUNCTIONS]から「Run」関数を上書きします。

    ▲「Run」関数の上書き

    追加した「Run」から画像のように繋いでいき、メニューを登録する処理を書きます。

    ▲メニューの登録

    「Get」ノードは見つかりづらいため、「toolm get」などで検索すると検索結果が少なくて見つけやすいです。

    ▲「Get」ノードの検索

    コンテンツブラウザに戻り、「EUB_ResisterMenus」を右クリックから[Run Editor Utility Blueprint]をクリックして実行します。

    ▲「EUB_ResisterMenus」の実行

    無事ツールバーに独自のボタンが追加されました! まだ処理は書いていないため、押しても何も実行はされません。

    ▲ツールバーに追加されたボタン

    2:メニューの設定項目

    メニューの設定の中で「メニューを追加する場所」「アイコン」の設定方法について解説します。

    ▲「メニューを追加する場所」と「アイコン」

    メニューを追加する場所

    エディタ内のメニューを追加できる箇所には名前が割り当てられており、その文字列を指定する必要があります。

    どういった文字列が割り当てられているか確認するため、まずはエクスプローラから[プロジェクトのディレクトリ → Config]フォルダに「DefaultEditorPerProjectUserSettings.ini」というファイルを作成します。既にファイルがある場合はそれを開きます。

    ▲「DefaultEditorPerProjectUserSettings.ini」を作成

    ファイルを開き下記の文字列を追加し、エディタを再起動します。

    [/Script/UnrealEd.EditorExperimentalSettings]
    bEnableEditToolMenusUI=True

    すると、メインメニューの[Window]に[Enable Menu Editing]という項目が追加されました。

    ▲[Enable Menu Editing]という項目が追加される

    チェックを入れると、メニューを追加できる箇所に歯車アイコンが追加されます。

    ▲歯車アイコンの表示

    表示された歯車アイコンをクリックすると、メニューの詳細情報が確認できる[Edit Menu]ウィンドウが表示されます。

    このウィンドウは本来メニューを動的に表示/非表示などの変更ができるものですが、各場所に割り当てられている文字列を確認できるので、メニュー追加箇所を確認する目的でも使えます。追加したい箇所の文字列をコピーしてメニューの設定に貼り付けましょう。

    ▲Edit Menu

    アイコン

    次にアイコンについてです。

    まずはメインメニューから[Tools → Debug → Widget Reflector]を開きます。Widget Reflectorは、エディタを構成しているWidgetの詳細情報を見ることができるツールです(公式ドキュメント)。

    ▲Widget Reflectorを開く

    開いたらツール上部から[Atlases → Display Texture Atlases]をクリックします。

    ▲[Display Texture Atlases]をクリック

    すると、Texture Atlas Visualizerが開きます。Texture Atlas Visualizerは読み込み済みのテクスチャを確認することができるツールです。

    ▲Texture Atlas Visualizer

    メニューに設定したいアイコンにカーソルを合わせるとアイコンの情報を確認できるので、「Used by」より下の文字列をアイコンの設定項目に指定します。

    ▲アイコン情報の確認

    アイコンの文字列は SlateEditorStyle.cpp などで定義されており、画像ファイルは下記ディレクトリに配置されています。

    C:\Program Files\Epic Games\[UE Version]\Engine\Content\Editor\Slate\Icons

    3:メニュー実行時の処理

    「EUB_MyMenu」を開き、[FUNCTIONS]から[Execute]を上書きします。メニューが実行されるとExecute関数が実行されます。ただし、「EditorUtilityToolMenuEntry」を継承したEUBでは、「Delay」や「GetAllActorofClass」など一部のノードが使えないため注意が必要です。

    ▲Execute関数の上書き

    4:エディタ起動時に自動でメニューを登録

    上記までの実装ですとエディタ起動時にメニューは登録されず、毎回手動で「EUB_ResisterMenus」を実行する必要があります。

    エクスプローラのConfigフォルダから再び「DefaultEditorPerProjectUserSettings.ini」を開き、下記のテキストのように「EUB_ResisterMenus」アセットへの参照パスを「StartupObjects」に追加します。

    [/Script/Blutility.EditorUtilitySubsystem]
    +StartupObjects=/Game/EUB_ResisterMenus.EUB_ResisterMenus

    すると、エディタ起動時に自動でメニューが追加されるようになります。メニュー以外でもエディタ起動時に実行したいEditor Utilityがあれば同じようなかたちで追加しましょう。

    5:まとめ

    今回は独自のメニューの追加方法について解説しました。本記事で解説していない内容も多く、メニュー関連は自由度も高いのでぜひ触ってみてください。

    次回以降、独自のメニューから実行するツールも作りたいと思います。お楽しみに。

    本記事で作成したツールのプロジェクト一式のデータは以下からダウンロードできます。

    今回のプロジェクトデータ

    株式会社Leon Gameworks

    ●公式サイト
    www.leon-game.co.jp

    ●X(Twitter)
    @Leon_Gameworks

    トンコツ(遠藤俊太)

    ●トンコツ開発ブログ
    shuntaendo.hatenablog.com

    ●X(Twitter)
    @tonkotsu3656

    TEXT_トンコツ(Leon Gameworks)
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)、オムライス駆