Start Auto
这一部分主要围绕 Unreal Editor 中的自动化操作展开
Asset Action Utility
UAssetActionUtility
是 Unreal Editor 中 Blutility
模块的一个工具类。
在该类的所有派生类中,只要将成员函数通过 UFUNCTION(CallInEditor)
暴露给编辑器,该函数入口将会自动添加到资产右键菜单的 Scripted Asset Actions 子菜单中。并且对于需要传入参数的函数,编辑器会以对话框的形式向用户收集参数。
此菜单注册操作由
FBlutilityMenuExtensions::CreateBlutilityActionsMenu()
实现。在FBlutilityContentBrowserExtensions
类中完成注册。
Editor Utility Library 函数库
UEditorUtilityLibrary
是 Unreal Editor 中 Blutility
模块的一个工具函数库。该函数库提供了如下工具函数,可以方便地获取一些编辑器当前状态。
GetSelectionSet();
GetSelectionBounds(FVector& Origin, FVector& BoxExtent, float& SphereRadius);
GetSelectedAssets();
GetSelectedBlueprintClasses();
GetSelectedAssetData();
RenameAsset(UObject* Asset, const FString& NewName);
GetActorReference(FString PathToActor);
GetCurrentContentBrowserPath(FString& OutPath);
关于资产对象的名称和路径
获取当前选中 Assets
UEditorUtilityLibrary
提供了两种获取编辑器中当前选中资产对象的 API ,分别为:
UEditorUtilityLibrary::GetSelectedAssets(); // () -> TArray<UObject*>
UEditorUtilityLibrary::GetSelectedAssetData(); // () -> TArray<FAssetData>
两者均通过 FContentBrowserModule
获取当前选中资产的 FAssetData
,区别在于:
GetSelectedAssetData()
在得到FAssetData
后直接返回。GetSelectedAssets()
使用FAssetData
查找相应的UObject
并返回。
资产对象的名称和路径
FAssetData
是一个记录已加载资产信息的结构体,拥有以下名称和路径属性:
ObjectPath
: 完整对象路径,形如/Game/Path/Package.ObjectName
PackageName
: 包名(含路径),形如/Game/Path/Package
PackagePath
: 包路径(不含包名),形如/Game/Path
AssetName
: 资产名,对于资产对象,一般与对象名一致AssetClass
: 资产类名,Unreal Editor 中的资产类型名
上述属性均为 FName
类型,可以使用 ToString()
方法获取相应的字符串。
此外,也可通过 UObject
提供的通用 API 获取资产对象的名称和路径属性,下面给出一组方法:
auto ObjectPath = Object->GetPathName();
auto PackageName = Object->GetPackage()->GetName();
int32 index;
ObjectPath.FindLastChar('/', index);
auto PackagePath = ObjectPath.Left(index);
auto AssetName = Object->GetName();
auto AssetClass = Object->GetClass()->GetName();
获取当前选中 Actors
Editor Scripting Utilities 插件已在 Unreal 5.0 中标记为 Deprecated。不建议使用该插件中 UEditorLevelLibrary
提供的 API,建议使用 Subsystem API。
auto SelectedActors = GEditor
->GetEditorSubsystem<UEditorActorSubsystem>()
->GetSelectedLevelActors();
或直接使用 GEditor
实现:
TArray<UObject*> Objects;
GEditor->GetSelectedActors()->GetSelectedObjects(Objects);
资产导入
在 Unreal Editor 中,资产的导入由 Import Subsystem 完成。我们可以使用该系统触发导入操作。
GEditor->GetEditorSubsystem<UImportSubsystem>()->ImportNextTick(Files, Path);
Import Subsystem 同时开放了一组可以干预资产导入过程的代理:
DECLARE_MULTICAST_DELEGATE_FiveParams(FOnAssetPreImport,
UFactory*,UClass*, UObject*, const FName&, const TCHAR*);
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnAssetPostImport, UFactory*, UObject*);
DECLARE_MULTICAST_DELEGATE_OneParam(FOnAssetReimport, UObject*);
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnAssetPostLODImport, UObject*, int32);
FOnAssetPreImport OnAssetPreImport;
FOnAssetPostImport OnAssetPostImport;
FOnAssetReimport OnAssetReimport;
FOnAssetPostLODImport OnAssetPostLODImport;
我们可以通过为以上代理绑定自定义函数的方式干预资产导入过程。
GEditor->GetEditorSubsystem<UImportSubsystem>()->OnAssetReimport.AddLambda([](UObject* Object) {...});
也可以广播以上代理调用导入模块。
GEditor->GetEditorSubsystem<UImportSubsystem>()->BroadcastAssetReimport(Object);