はじめに
突然ですが、World Outlinerにおけるフォルダのリストを欲しくなったことはありませんか?
僕はあります。今回はその取得方法についてご紹介します。C++が必要ですがサクッとできます。
C++コード
フォルダの取得には、FActorFolders
のForEachFolder
関数を使用します。少し見慣れない書き方になっていますが、これはTFunctionRef
というものを使っているためです。
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyEditorBlueprintFunctionLibrary.generated.h"
UCLASS()
class ●●●●EDITOR_API UMyEditorBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable)
static TArray<FName> GetActorFolderNames(UWorld* World, bool bUseSort);
};
#include "MyEditorBlueprintFunctionLibrary.h"
#include "EditorActorFolders.h"
TArray<FName> UMyEditorBlueprintFunctionLibrary::GetActorFolderNames(UWorld* World, bool bUseSort)
{
TArray<FName> OutActorFolderNames;
// 全フォルダ(FFolder)に対してForEach処理を実行
FActorFolders::Get().ForEachFolder(*World, [&OutActorFolderNames](const FFolder& Folder)
{
OutActorFolderNames.Add(Folder.GetPath());
return true;
});
if(bUseSort)
{
OutActorFolderNames.Sort();
}
return OutActorFolderNames;
}
なお、上記のコードはエディタ専用の機能を使っているため、Editorモジュールで組むことを強く推奨します。Editorモジュールの作成方法については下記記事を参考にするか、
こちらの無料プラグインを使うのがオススメです。サクッとモジュールを追加できるので重宝してます。
話を戻して…
これで作成したGet Actor Folder Names
ノードを下記のように組んで実行すると…
結果は以下のようになります。ちゃんと取れてますね!
LogBlueprintUserMessages: [XXX] A
LogBlueprintUserMessages: [XXX] B
LogBlueprintUserMessages: [XXX] B/B-Child
LogBlueprintUserMessages: [XXX] C
応用例
これだけだと微妙なので、具体的にどんなことに役立つのかについて軽く…
まず、ActorのSetFolderPath
ノードを使うとそのActorを特定のフォルダに移動することができます。ここでのフォルダとは当然World Outlinerでのフォルダを指します。そして、そのSetFolderPath
ノードと今回ご紹介した内容を併用すると…特定のフォルダ名が見つかったらそこに選択中のActorを移動させるという処理を組めます。
これだけだと特に使い道はないですし、標準のMove To機能でいいじゃん!となりますが、
例えば…
- 複数のActorを特定のルールに基づいて一括でフォルダ移動・整理
- レベル上に特定のActor・BPを配置したら自動的に最適なフォルダに移動
といったエディタ拡張を組むことができます。どうでしょ?便利そうじゃないですか?
さいごに
開発規模が大きくなるに連れてWorld Outliner上のActor数は膨れがちです。更に、UE5のWorld Partitionを活用していくとUE4時代とは比にならないぐらい膨れることもあります。そんなときに今回の内容がきっと役に立つはずです。是非一度試してみてください!
おしまい