UE5 程序化批量导出staticmesh为FBX

// Fill out your copyright notice in the Description page of Project Settings.


#include "UpdateAssetVersionLibrary.h"
#include "Runtime\Core\Public\Misc\FileHelper.h"
#include "Runtime\Core\Public\Misc\Paths.h"
#include "Misc\Paths.h"
#include "EdGraphUtilities.h"
#include "MaterialGraph/MaterialGraphNode.h"
#include "Windows/WindowsPlatformApplicationMisc.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include "HAL\FileManagerGeneric.h"
#include "GenericPlatform/GenericPlatformApplicationMisc.h"
#include "MaterialGraph/MaterialGraphSchema.h"
#include "Runtime/Engine/Public/ImageUtils.h"
#include "Kismet\KismetSystemLibrary.h"
#include "Developer\DesktopPlatform\Public\IDesktopPlatform.h"
#include "Developer\DesktopPlatform\Public\DesktopPlatformModule.h"
#include "MaterialGraph/MaterialGraphNode_Comment.h"

FString UUpdateAssetVersionLibrary::OpenFileDialog(FString Dialog, FString OpenPath) 
{
	IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
	FString OutFolderName;
	FString DefaultFile;
	FString FileType = FString("*.uasset");
	if (DesktopPlatform != nullptr) {
		if (DesktopPlatform->OpenDirectoryDialog(nullptr, Dialog, OpenPath, OutFolderName)) {
			OutFolderName.Append("/");
			return OutFolderName;
		}
	}
	return FString();
}

FString UUpdateAssetVersionLibrary::ConvertObsolutePathToRelativePath(FString ObPath, FString TailPath) 
{
	FString HeadPath = UKismetSystemLibrary::GetProjectContentDirectory();
	for (uint16 Count = 0; Count < HeadPath.Len(); Count++) {
		ObPath.RemoveAt(0);
	}
	FString HeadDir = "/Script/Engine.StaticMesh'/Game/";
	HeadDir.Append(ObPath);
	for (uint8 Count = 0; Count < 7; Count++) {
		HeadDir.RemoveAt(HeadDir.Len() - 1);
		TailPath.RemoveAt(TailPath.Len() - 1);
	}
	HeadDir.Append("." + TailPath + "'");
	return HeadDir;
}

void UUpdateAssetVersionLibrary::ExportStaticMeshToFBX(FString Path) 
{
	//UStaticMesh* StaticMesh = LoadObject<UStaticMesh>(nullptr, TEXT("/Script/Engine.StaticMesh'/Game/FPWeapon/Mesh/FirstPersonProjectileMesh.FirstPersonProjectileMesh'"));
	TArray<UObject*> ExportMesh;
	//ExportMesh.Add(StaticMesh);
	IAssetTools& assetTools = IAssetTools::Get();
	IFileManager& FileManager = IFileManager::Get();
	FFileManagerGeneric* FileManagerGeneric = new FFileManagerGeneric();
	TArray<FString> AssetNames;
	TArray<FString> AllStaticMeshUassetPath;
	TArray<FString> IdentifyPath;
	if(FileManagerGeneric != nullptr)
		FileManagerGeneric->FindFiles(AssetNames, *Path, TEXT(""));
	if (AssetNames.Num() != 0) {
		for (auto AssetIter : AssetNames) {
			FString RelativePath = ConvertObsolutePathToRelativePath(Path + AssetIter, AssetIter);

			AllStaticMeshUassetPath.AddUnique(RelativePath);
		}
		for (auto PathIter : AllStaticMeshUassetPath) {
			//if (FileManager.FileExists(*PathIter)) {
			UStaticMesh* StaticMesh = LoadObject<UStaticMesh>(nullptr, *PathIter);
			if (StaticMesh->IsValidLowLevel()) {
				ExportMesh.Add(StaticMesh);
			}
		}
	}
	else {
		return;
	}
	//FString("D:/ExportAssets")
	assetTools.ExportAssetsWithDialog(ExportMesh, true);
}

bool UUpdateAssetVersionLibrary::WriteToTXT(FString Information, FString MaterialName)
{
	uint16 Number = 0;
	FString Dialog;
	FString OutFolderName;
	FString OpenPath = UKismetSystemLibrary::GetProjectContentDirectory();
	IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
	DesktopPlatform->OpenDirectoryDialog(nullptr, Dialog, OpenPath, OutFolderName);
	OutFolderName += ("/" + MaterialName);
	while (1) {
		FString PathTemp = OutFolderName + "_" + FString::FromInt(Number) + ".txt";
		if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*PathTemp)) {
			Number++;
		}
		else {
			OutFolderName = PathTemp;
			break;
		}
	}
	bool isSuccess = FFileHelper::SaveStringToFile(Information, *OutFolderName);

	return isSuccess;
}


vo
### 使用Unreal Engine创建数字人 对于希望利用Unreal Engine来创建高度逼真的数字人物,官方提供了专门的MetaHuman Creator工具。该工具允许创作者通过浏览器界面轻松定制角色外观,包括但不限于面部特征、发型、服装等方面的内容[^2]。 #### 访问与设置MetaHuman Creator - 需要先登录至[官方网站](https://metahuman.unrealengine.com/)。 - 登录后按照提示选择合适的版本号完成初始化配置过程。 - 利用内置的各种参数滑杆调整直至获得满意的角色形象为止。 一旦完成了上述步骤,则可以直接导出所设计的人物资产用于后续的游戏开发或其他应用场景之中。 ```cpp // 导入必要的库文件以便于处理导入后的资源 #include "Engine/StaticMesh.h" #include "Components/SkeletalMeshComponent.h" void ImportCharacterAsset(const FString& AssetPath){ UFactory* Factory = nullptr; ObjectInitializer.NoImportText(); Factory = NewObject<UFactory>(GetTransientPackage(), UFactory::StaticClass()); FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools"); TArray<FString> OutFilenames; AssetToolsModule.Get().ImportAssets(OutFilenames, AssetPath); } ``` --- ### 创建动物模型的方法论 当涉及到更复杂的生物如动物时,虽然没有像人类一样的专用工具链支持即时生成,但仍可以通过以下方式实现: 1. **外部建模软件制作**:借助Maya、Blender等第三方应用程序构建目标物种的身体结构,并将其作为FBX格式保存下来准备移植到UE环境中; 2. **骨骼绑定与蒙皮操作**:为静态网格物体添加骨架系统使之能够响应物理法则或动画序列的影响; 3. **行为逻辑编写**:运用蓝图可视化脚本或者C++代码定义AI控制模式让虚拟生物展现出自然的动作反应特性[^3]。 ```blueprint Event BeginPlay() { // 初始化动物的行为状态机 InitializeStateMachine(); // 设置初始位置和朝向 SetActorLocationAndRotation(StartLocation, StartRotation); // 启动巡逻路径跟随机制 PatrolAlongWaypoints(); } Function MoveToNextWaypoint() { // 获取下一个导航点坐标 FVector NextPoint = GetNextPatrolPosition(); // 移动至指定地点 MoveToLocation(NextPoint); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值