目次
※この記事で使用しているUnrealのVersionは04.27.0です。
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト
Reimport可能なアセットをBlueprintからReimportする
StaticMeshやDataTable、TextureなどのアセットはImportやReimportが可能なアセットです。
基本的にReimportが可能なアセットは、アセットを右クリックし「Reimport」というメニューをクリックすることでアセットをReimportすることができます。
Reimportが可能なAssetは、「UFactory」と「FReimportHandler」というクラスを多重継承したFactoryクラスで定義されています。
この「FReimportManager」にある「Reimport」という関数を使用することで、AssetをReimportすることができます。
以下C++ソースの例
MyEditorUtilityLibrary.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyEditorUtilityLibrary.generated.h"
/**
*
*/
UCLASS()
class KA_IMPORTSUBSYSTEMEDITOR_API UMyEditorUtilityLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static bool Reimport(UObject* InAsset);
};
MyEditorUtilityLibrary.cpp
#include "MyEditorUtilityLibrary.h"
#include "EditorReimportHandler.h"
bool UMyEditorUtilityLibrary::Reimport(UObject* InAsset)
{
if (!InAsset)
{
return false;
}
return FReimportManager::Instance()->Reimport(InAsset, true);
}
↓以下EditorUtilityWidgetにて実行した結果
ちなみに、Reimportする際のSourceFileを変更するには、Reimportできるアセットが持っている「AssetImportData」というUObject変数がSourceFileの情報を持っており、「UpdateFilenameOnly」という関数を使うことでSourceFileを編集することができます。
ただ、UObjectクラスに 「AssetImportData」 が定義されているわけではなく、継承先の各アセットごとに「AssetImportData」という変数が定義されているため、汎用的な関数として作成するにはReflection機能を使い、「AssetImportData」という名前の変数からAssetImportDataのポインターを拾ってきます。
※Reflectionに関しては以下を参照してください。
void UKAEditorFunctionLibrary::SetAssetImportData(UObject* Obj, FString ResourcePath)
{
if (!Obj)
{
return;
}
FProperty* Property = Obj->GetClass()->FindPropertyByName(TEXT("AssetImportData"));
if (!Property)
{
return;
}
class UAssetImportData* AID;
if (FObjectProperty* ObjectProperty = CastField<FObjectProperty>(Property))
{
AID = Cast<UAssetImportData>(ObjectProperty->GetObjectPropertyValue(Property->ContainerPtrToValuePtr<UObject*>(Obj)));
}
else
{
return;
}
AID->UpdateFilenameOnly(ResourcePath);
}
以上
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト