【UE4】编辑器开发(七)模型导入与映射

文章目录

  • 一、导入模型
  • 二、将新导入的模型渲染在视窗中

一、导入模型

我们创建一个结构体,取名为FNewMesh,通过这个结构体导入模型和保存路径。所以,我们需要先在CustAsset中声明这个结构体并暴露给属性面板。

USTRUCT(BlueprintType)
struct FNewMesh
{
     
	GENERATED_BODY()
};

UCLASS(Blueprintable, BlueprintType)
class NEWASSETS_API UCustAsset : public UObject
{
     
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere)
	FNewMesh NewMesh;
};

FNewMesh这个结构体需要具备导入模型的功能,所以我们就要修改这个结构体在属性面板中的样式,使其可以导入模型。
所以我们自定义这个结构体的属性样式。给这个结构体添加一个import按钮,通过单机按钮,打开模型导入弹窗并导入模型。

void CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow & HeaderRow, IPropertyTypeCustomizationUtils & CustomizationUtils)
{
     
	HeaderRow.NameContent()
	[
		SNew(STextBlock).Text(LOCTEXT("NewMesh", "New Mesh"))
	];
	HeaderRow.ValueContent()
	[
		SNew(SButton).OnClicked_Raw(this, &FPropertyType_NewMesh::OnImportButtonClicked)
		[
			SNew(STextBlock).Text(LOCTEXT("Import", "Import"))		//导入模型的按钮
		]
	];

}

FReply OnImportButtonClicked()
{
     
	FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
	AssetToolsModule.Get().ImportAssetsWithDialog("/Game");		//当点击导入按钮后,将会打开资源导入弹窗,然后选择模型后导入
	return FReply::Handled();
}

当然,除了上述代码,还要将FNewMesh的自定义属性类注册。
下面是完成后的的功能。
【UE4】编辑器开发(七)模型导入与映射_第1张图片

二、将新导入的模型渲染在视窗中

FReply FMeshImportDetail::HandleImportClicked()
{
     
	FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools");
	AssetToolsModule.Get().ImportAssetsWithDialog(TEXT("/Game"));
	if(CustomAsset)
	{
     
		FString LastPaths = FEditorDirectories::Get().GetLastDirectory(ELastDirectory::GENERIC_IMPORT);
		FString L, R, S, K;
		LastPaths.Split(".", &L, &R);	//L= D://AssetProject/Content/xxx R= obj
		L.Split("AssetProject", &S, &K); //	K=  /Content/xxx

		UStaticMesh* ObjMesh = Cast<UStaticMesh>(StaticLoadObject(UObject::StaticClass(), NULL, *K));
		if(ObjMesh)
		{
     
			TArray<FVector> Vertices;
			TArray<int32> Triangles;
			TArray<FVector> Normals;
			TArray<FVector2D> UVs;
			TArray<FProcMeshTangent> Tangents;
			UKismetProceduralMeshLibrary::GetSectionFromStaticMesh(ObjMesh, 0, 0, Vertices, Triangles, Normals, UVs, Tangents);

			CustomAsset->ClearMesh();

			CustomAsset->Vertices = Vertices;
			CustomAsset->Triangles = Triangles;
		}
	}
	return FReply::Handled();
}

你可能感兴趣的:(【UE4】编辑器开发(七)模型导入与映射)