一、导入模型
我们创建一个结构体,取名为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的自定义属性类注册。
下面是完成后的的功能。
二、将新导入的模型渲染在视窗中
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();
}