
目次
※この記事で使用しているUnrealのVersionは05.1.0です。
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト
前置き
EditorUtilityでツールを作成する上で欠かせないのが、
「現在選択中のアセット・アクターの情報を取得する」
というBlueprintです。
これはEditorUtilityなBlueprintGraphで、大体「GetSelected…」(…は不要)という関数名でBlueprintノードを検索すれば出てくるかと思います。

一つずつ解説していきます。
※解説用に予め「EditorUtilityWidget(EUW)」を作成しています。
EditorUtilityWidgetは、ContentBrowser(またはContentDrawer左上の「+Add」ボタンから)EditorUtilities
→EditorUtilityWidget
を選択することで作成できます。

作成後、EUWを開き、DesignerでButton
ウィジェットを配置して、ボタンが押された時にイベントを発生させられるようにGraph側でOnClicked
イベントを配置しています。


EditorUtilityのGetSelected系について レベル【★☆】
GetSelectedAssets

GetSelectedAssets
ノードは、ContentBrowser上で現在選択中のアセットのリファレンスを取得できる関数です。

↓動画
配列で返ってくるため、複数選択していても全て取得することができます。
ちなみに配列の順番ですが、アセットを選択した順番で配列の中にアセットが入っております。

↓動画
便利ですね!
…ん?どんなときに使うかですか?
例えば、
「特定の文字列が入ったStaticMeshのCollisionComplexy
を変更する」
みたいなことはできます。
↓アセット名に「Complex」という文字の入ったStaticMeshのCollisionComplexy
をUseCollisionComplexAsSimple
とするデモ

↓動画
(まあぶっちゃけ↑の例はEUW使うまでもなく、PropertyMatrixでちょちょいと編集できますけどね!!)
GetSelectedAssetData

GetSelectedAssetData
ノードはGetSelectedAssets
とほぼ同じようなことができます。
返ってくるのはFAssetData
という構造体の配列が返ってきます。

↓動画
ただし、GetSelectedAssetData
は
「アセットをロードすることなく名前やクラス名を取得でき、必要なアセットだけロードすることができる」というメリットがあります。
つまり、メモリ的にも処理速度的にもPCに優しい処理になります。
アセットをロードすると言いましたが、GetAsset
という関数を使用した際に自動でアセットをロードします。

なので、使用したいアセットのみでGetAsset
ノードを使用することで、必要最低限のアセットのロードを行うことができます。
↓特定の文字列のアセットのみロードして使用するデモ

↓動画
DataAssetは、ロードされる前と後でアイコンが変わるので、ロードされているかどうかが↑の動画でわかったかなと思います。
GetSelectedBlueprintClasses

GetSelectedBlueprintClasses
はBlueprintクラスアセット用のノードです。
少しややこしいのですが、BlueprintクラスアセットはGetSelectedAssets
ノードでリファレンスを取得した場合、そのクラスはクラスそのものにはなっておらずBlueprint
というクラスになっています。
↓どんなBlueprintクラスアセットもBlueprintというクラスになっているデモ

これは、ContentBrowser上にあるBlueprintクラスアセットは、あくまでアセットとして配置されているUnreal内でファイルとして管理するためのBlueprint自体の設計図のような役割を持っています。
実際にBlueprintアクターやウィジェットなどは、そのBlueprintクラスアセットの中にある情報を元に作られており、アセットとしてのBlueprintと生成されたアクターやウィジェットなどとはクラスは別物の扱いになります。
なので、選択しているBlueprintクラスアセットのインスタンスとして活用する際のクラスの情報を取得したい場合にGetSelectedBlueprintClasses
というノードが役に立つのです。

↓動画
どんなときに使うかというと、例えば選択しているBlueprintアクタークラス一覧からランダムでアクターをSpawnするみたいな使い方とか思いつきますよね。
選択しているBlueprintアクタークラス一覧からランダムでアクターをSpawnするデモ

↓動画
な~んか使えそうな感じですよね。
GetSelectedFolderPaths

GetSelectedFolderPaths
はUE5.1から追加された関数で、選択中のフォルダーの階層を取得してくれるものになります。

↓動画
ちなみに、EngineフォルダやPluginフォルダも問題なく取得できます。
気をつけるのは、このFolderPathはPackagePathのように/Game
始まりではなく、/All
から始まっているという点です。
それと、左側にあるソースパネルとよばれるフォルダーをツリー階層表示している部分でフォルダーを選択状態にしても、その部分の情報を取得することはできません。
用途的にはそこまではないかもですが、EUWではなく右クリックメニューにツールを仕込んだりする際などは使えるんじゃないかなと思います。
右クリックメニューのツールを作りたい方は↓を御覧ください。
さて、ここまでContentBrowser内のアセット関連のものでした。
すこし補足をしますと、ContentBrowserはEditorで最大4つまで出せます。

また、ContentDrawerというUE5から使用できる、「Ctrl+Space」でいつでも表示できるContentBrowserもあります。
では、ContentBrowserが複数あったり、ContentDrawerとContentBrowserが混在している状態では、どのContentBrowserの情報が取得できるのでしょうか?
結論から言いますと、「最後にアクティブにしたContentBrowser,ContentDrawer」で選択状態のものが取得できます。
ちなみに、「アクティブにする」とは、ContentBrowser,ContentDrawerをマウスでクリックすることです。
また、ContentBrowserを消した場合は、残りのContentBrowserの数字の小さい順に優先して情報を取得してくれます。ContentBrowserがない場合、ContentDrawerが存在している場合はContentDrawerがアクティブになります。そうでない場合はアクティブなブラウザはなくなります(閉じた後の抽選処理はFContentBrowserSingleton::ChooseNewPrimaryBrowser
を御覧ください)
↓実験
GetSelectionSet/GetSelectedActors/GetSelectedLevelActors

GetSelectionSet
,GetSelectedActors
,GetSelectedLevelActors
は、どれも現在レベル上で選択状態のアクターを取得することができます。

↓動画
基本的にはGetSelectionSet
を使用します。
GetSelectedActors
は、機能こそEditorスクリプトで問題なく使えますが、どうやらVR用に作られたモジュール内にある関数のようです。GetSelectionSet
とほぼ同じ機能となります。
GetSelectedLevelActors
は挙動が少しだけ異なり、他の2つは、プレイ中にEject(F8キーを押してプレイ中にEditor操作を行えるモード)でも選択状態のアクターを取得できるのですが、GetSelectedLevelActors
の方はプレイ中は取得できないようになっています(バグではなく仕様です)
今回の解説には
で解説を行います。GetSelectionSet
どんな用途があるの?というと、この関数はわりと無限に使用用途が考えられます。
例えば、選択中のアクターにTagを追加するとかです。
※タグはアクターが共通に持っているメタ情報用パラメータで、一括選択で追加することもできますが、すでにアクターがそれぞれいろいろなタグを持っている場合にDetailsWindowでは追加できないため、そういった場合に有効なスクリプトです。
↓選択中のアクターにTagを追加するデモ

↓動画
GetSelect系は以上になります。
ちょいたし
ちなみに、選択状態を取得するのではなく、選択状態にする関数もあります。
ContentBrowserのアセットであれば、SyncBrowserToObjects
フォルダーであればSyncBrowserToFolders
(フォルダーに関しては、選択状態にするわけではなく、そのフォルダー階層を表示するだけになります)

Level内のアクターであれば「SeSelectedLevelActors
」になります。
ちなみにアクターの選択状態を操作する関数は↓だけあります(すべてEditorActorSubsystemにあります)

以上!
選択中のアクター・アセットを取得できれば、Editorスクリプトを幅広くつかえるとおもいますので、是非ご活用を!
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト