※この記事で使用している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にアップされています。
サンプルプロジェクト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です