UE4 制作导出Content目录下某个文件夹内所有模型的六视图并将模型资源文件复制到指定文件夹的插件

2023-11-20

一、新建空白插件

在Bulid.cs内加入两个模块,"EditorSubsystem","UnrealEd",

PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
                "EditorSubsystem",
                "UnrealEd",
				// ... add other public dependencies that you statically link with here ...
			}
			);

创建继承于EditorSubsystenm的子类

 

点创建后会报错,没关系回C++重新编译一下就好

二、C++代码

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

#pragma once

#include "CoreMinimal.h"
#include "EditorSubsystem.h"
#include "ExportSixViewsSub.generated.h"
class USpringArmComponent;

/**
 *
 */

UCLASS()
class EXPORTSIXVIEWS_API UExportSixViewsSub : public UEditorSubsystem
{
	GENERATED_BODY()

public:
	//获取World
	UFUNCTION(BlueprintPure, Category = "FunTool")
		UWorld* GetContextWorld();

	//遍历指定路径下所有的StaticMesh
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		TArray<UStaticMesh*> FindOrLoadAssetsByPath(const FString& FilePath);

	//将Actor的Privot设置为Center
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		bool SetActorPrivotOnCenter(AActor* InActor, bool bWorldSpace /*= false*/, FVector& CenterLocation);

	//拍摄模型六视图并保存到指定文件夹
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		bool SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& Filepath);

	//复制指定文件到指定目录
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		void CopyFile(UStaticMesh* SM, const FString& Filepath);

	//导出完成时的消息提示框
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		void Tips();

	//打开文件管理器并返回选择的文件的目录
	UFUNCTION(BlueprintCallable, Category = "FunTool")
		void OpenFiles(FString& DirectoryName);
};
ExportSixViewsSub.cpp
// Fill out your copyright notice in the Description page of Project Settings.


#include "ExportSixViewsSub.h"
#include "EngineUtils.h"
#include "UnrealEdGlobals.h"
#include "Editor/UnrealEdEngine.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Misc/FileHelper.h"
#include "ImageUtils.h"
#include "GameFramework/SpringArmComponent.h"
#include "Kismet/KismetSystemLibrary.h"

#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"


UWorld* UExportSixViewsSub::GetContextWorld()
{
	UWorld* World = GEditor->GetEditorWorldContext().World();
	return World;
}

TArray<UStaticMesh*> UExportSixViewsSub::FindOrLoadAssetsByPath(const FString& FilePath)
{
	TArray<UObject*> OutAssets;
	TArray<UStaticMesh*> OutStaticMeshs;
	FString GamePath = FilePath;
	GamePath.ReplaceInline(*FPaths::ProjectContentDir(), TEXT("/Game/"));
	if (!GamePath.IsEmpty())
	{
		EngineUtils::FindOrLoadAssetsByPath(GamePath, OutAssets, EngineUtils::ATL_Regular);
		for (auto SM : OutAssets)
		{
			UStaticMesh* TempSM = Cast<UStaticMesh>(SM);
			if (TempSM)
			{
				OutStaticMeshs.Add(TempSM);
			}
		}
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: Directory Exists"));
		return OutStaticMeshs;
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: Directory Does not exist"));
		return OutStaticMeshs;
	}
}

bool UExportSixViewsSub::SetActorPrivotOnCenter(AActor* InActor, bool bWorldSpace /*= false*/, FVector& CenterLocation)
{
	if (InActor)
	{
		FVector PivotOffset = InActor->GetComponentsBoundingBox().GetCenter();
		if (bWorldSpace)
		{
			FVector Delta(PivotOffset - InActor->GetActorLocation());
			PivotOffset = InActor->GetTransform().InverseTransformVector(Delta);
		}

		if (InActor->GetPivotOffset() == PivotOffset)
		{
			CenterLocation = InActor->GetActorLocation();
			return false;
		}
		else
		{
			InActor->Modify();
			InActor->SetPivotOffset(PivotOffset);
			GUnrealEd->SetPivotMovedIndependently(false);
			InActor->PostEditMove(/*bFinished=*/ true);
			CenterLocation = InActor->GetActorLocation() + PivotOffset;
			return true;
		}
	}

	return false;
}

bool UExportSixViewsSub::SaveRenderTargetToFile(UTextureRenderTarget2D* rt, const FString& fileDestination)
{

	FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();
	FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);
	TArray<FColor> outBMP;

	for (FColor& color : outBMP)
	{
		color.A = 255;
	}
	outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());
	rtResource->ReadPixels(outBMP, readPixelFlags);

	FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight());
	TArray<uint8> CompressedBitmap;
	FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap);
	bool imageSavedOk = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination);

	return imageSavedOk;
}

void UExportSixViewsSub::CopyFile(UStaticMesh* SM, const FString& FilePath)
{
	FString SM_AbsolutePath = UKismetSystemLibrary::GetSystemPath(SM);

	FString FileDestination = FilePath;
	FileDestination.Append("/" + SM->GetFName().ToString() + ".uasset");

	IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile();
	if (FileManager.CreateDirectory(*FilePath))
	{
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: Directory was created"));
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: Directory was not created"));
	}

	if (FileManager.CopyFile(*FileDestination, *SM_AbsolutePath))
	{
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: File Copied!"));
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("FilePaths: File not Copied!"));
	}
}

void UExportSixViewsSub::Tips()
{
	FText const Title = FText::FromString("Message");
	FText const DialogText = FText::FromString("Export complete!");
	EAppReturnType::Type const ReturnType = FMessageDialog::Open(EAppMsgType::Ok, DialogText, &Title);
}

void UExportSixViewsSub::OpenFiles(FString& DirectoryName)
{
	IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
	DesktopPlatform->OpenDirectoryDialog(nullptr, TEXT("ProjectDir"), FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()), DirectoryName);
}

 三、蓝图代码

 

1.新建Actor蓝图,就只添加一个StaticMeshComponent用于测试用

 2.新建相机蓝图,添加一个相机臂和SceneCaptureComponent2D,相机臂取消碰撞,设置CaptureSource默认值

 3.新建结构体和创建表格

 4.新建编辑器UI

设计界面:

 逻辑界面:

自定义事件:拷贝模型资源文件到指定文件夹

自定义事件:将图片保存到指定文件夹

销毁Actor的函数

 Button Pressed事件 选择文件夹

 Button Pressed事件 导出图片

 四、测试

 

 五、插件下载(4.27)

链接:https://pan.baidu.com/s/1q7uYrQ41xaY1mIR0ZuQGmA?pwd=rx5y 
提取码:rx5y

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4 制作导出Content目录下某个文件夹内所有模型的六视图并将模型资源文件复制到指定文件夹的插件 的相关文章

  • 如何把glb格式模型gltf格式模型导入3dmax和C4D,U3D,UE4这些主流软件中

    咱有时候去glbxz com添加链接描述 官网下载免费glb格式模型 gltf模型下载时候是没有通用格式 例如fbx obj 这个时候3dmax和C4D直接打开导入是不行的 也可以制作glb模型 扣扣 424081801 这个时候 咱们用
  • UE4 Slate 柱状图

    Fill out your copyright notice in the Description page of Project Settings include ZZTWidget h include Windows AllowWind
  • 解决UE4启动出现UE4Editor.exe-无法找到dll入口的弹窗

    UE4编辑器启动 一开始遇到的问题如下 上网找问题得到的解答都是在cmd下利用regsvr32 exe注册该dll到注册表 但是也提示报错 上网搜了一下 得知原因是生成该dll的源码没有实现 DllRegisterServer和DllUne
  • ue4 用武器切割物体.

    我们这里使用UE4自带的第三人称的模板开始我们的游戏 切割物体嘛 所以这里我们需要一把武器和人物的武器攻击动画 武器我们可以从官方商城的免费资源获得 人物攻击动画我们可以从下面这个网站获得 这里面有各种人物动画和模型 完全免费 业界良心啊
  • UE4中实现鼠标拖动游戏中的物体

    一 显示鼠标光标 启用鼠标点击事件 可以在关卡蓝图中或者游戏模式中加入下面代码 二 点击物体进入选中状态 三 根据通道获取命中结果 通过这个函数可以获取当前鼠标光标下接触的actor 重新设定actor位置即可 这里可以将类型转换去掉 就可
  • 如何解决x盘莫名出现的msdia80.dll文件

    如何解决x盘莫名出现的msdia80 dll文件 参考文章 https zhuanlan zhihu com p 138954717
  • 基于个人开发的C++MySQL插件使用UE4蓝图连接MySQL数据库

    关于UE4连接数据库 其实很简单 本质上就是使用c 来建立DB操作 再通过封装成蓝图可调用的函数即可 当然一般网络游戏是不需要在蓝图中连接数据库的 因为db操作放在客户端来做是不安全 也是不合理的 试想一下 我如果把你的游戏客户端破解了 是
  • UE4 DDC共享

    本人用的是源码引擎编译的 内网使用DDC 先创建一个共享文件夹 这个文件夹来保存共享资源 修改引擎的baseengine ini cpp DerivedDataBackendGraph Shared Type FileSystem Read
  • UE4学习日记——蓝图中的各种颜色代表什么

    节点类型颜色 白色 执行线 蓝色 调用的函数或事件 暗蓝色 结构体 草绿色 流程切换 绿色 纯函数 通常用于获取什么 青色 试着对象转换 紫色 函数定义 灰色 宏 红色 事件的定义 土黄色 时间轴 数据类型颜色 白色线条 执行线 程序的执行
  • UE4 蓝图通信:接口调用

    UE4学习心得 蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴 而且主要体现在主蓝图对子蓝图的信息通信 在内容浏览器中添加一个蓝图接口 命名为TestInterface 双击打开接口 直接使用其创建时自带的一个接口函数 将其重命
  • ue4中Pak文件中挂载的资源名称获取

    在pak文件中 会挂接很多资源 api也在变化 废话不多说 上代码 FPakPlatformFile GetPakPlatformFile FPakPlatformFile pakPlatformFile nullptr auto plat
  • 2022年11月7日--11月13日(ue4 tf1视频教程+cesium for ue源码CesiumUtility抄写,本周10小时,合计1737小时,剩余8263小时)

    目前 mysql 7 1 tf1 3 3 oss 12 1 蓝图反射 1 7 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 8 根据月计划 ue4 tf1视频教程 进度按照每天一小时时长视频 其余时
  • UE4 UI实现改键功能

    主要内容 本文主要讲解如何在UI中实现自定义按键的功能类似于游戏中的改键操作 用到的是UE4自带的第三人称案例 因为第三人称自带了小白人和几个按键绑定就不用再手动去设置 实现步骤 1 创建两个UMG用来展示UI效果 1 创建WBP Key
  • UE4_积分相同排名显示问题

    找了一下ue4 rank 函数相关 没找到合适的 自己简单写了个 解决积分相同时名次要一样 之后顺位排序 中国式排名 蓝图实现 c 原理一样 1 2 3 4 5
  • UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿 UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了 开了VPN也链接不上 这使得用UE4打包配置安卓游戏变得非常麻烦 博主捣鼓了好几天才打包成功 深感在中国学习UE4的艰难与
  • 【UE4】搭建局域网内VR直播 UE4.27

    前言 英伟达显卡 UE4 27的内网搭建360 相机直播 并在内网任意设备使用VR观看 理论上性能足够效果越好 此处使用的VR设备为Vive 梳理了整体构建流程 希望能帮到你 多图警告 图片教程比较直观 1 准备工作 下载UE和OBS所需安
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行
  • ue4 蓝图通信的几种方式

    一 设置公有变量 完成通信 1 蓝图类Door bp中声明变量NewVar 1 为公有 确定好变量类型 编译 2 关卡视口中选中这个蓝图类Door bp的实例 世界大纲视图下的细节面板中 默认下出现公有变量名称NewVar 1 用吸管吸取关
  • UE4 制作导出Content目录下某个文件夹内所有模型的六视图并将模型资源文件复制到指定文件夹的插件

    一 新建空白插件 在Bulid cs内加入两个模块 EditorSubsystem UnrealEd PublicDependencyModuleNames AddRange new string Core EditorSubsystem

随机推荐

  • 【计算机基础

    定点数的表示 定点数 小数点的位置固定 例 996 007 常规计数 浮点数 小数点的位置不固定 例 9 96007 10 2 科学计数法 二进制的定点数 浮点数也类似 无符号数 整个机器字长的全部二进制位均为数值位 没有符号位 相当于数的
  • 关于Linux和Shell的相关书籍

    入门类 一直认为 在一个系统上学习开发之前 首先需要熟悉这个系统的使用 鉴于天朝的国情 绝大部分人第一个接触的操作系统就是Windows 因此对于这绝大部分人来说 如果要学习Linux开发 学会使用这个系统都是必不可少的一个环节 现在的Li
  • UVa 1347 Tour

    题目 Tour 题意 来自luogu John Doe想用最小的路程游览完所有目的地 每个目的地都用坐标xi yi表示 任何两目的地的xi都不相同 两目的地之间的路程是两点之间的直线距离 John是这样走的 他从最左边的点开始 然后只能向右
  • word页码如何设置为章节加页码,例如第一章第一页1-1、第二章第一页2-1

    由于用到word页码分章节 页码的形式 从网上查了一下 质量真的很差 没有一篇文章讲清楚的 有的所答非所问 一怒之下 利用几个小时的时间解决问题并写下这篇文章 以供大家学习参考 1 word插入页码 选择包含章节号 1 1 双击页脚 点击插
  • 55黑马QT笔记之关闭子线程

    55黑马QT笔记之关闭子线程 1 这里为什么要单独写多一篇文章来说线程的关闭呢 主要是想让大家提升印象 养成资源回收的好习惯 任何时候都要想起开辟过的内存回收 这里的关闭子线程上一篇也写到了 就是利用关闭窗口时调用槽函数回收掉 2 具体步骤
  • 2023最新ChatGPT网站源码+支持GPT4+Ai绘画+用户会员套餐+邀请分佣功能+支持后台一键更新+永久更新!

    2023最新ChatGPT网站源码 支持GPT4 Ai绘画 用户会员套餐 邀请分佣功能 支持后台一键更新 永久更新 可同时 单独 开启或者关闭GPT3 5和GPT4 0两种ChatGPT提问模型 用户可切换 次数套餐也是分开的 支持手机电脑
  • News Feed 系统设计

    新鲜事系统 News Feed 什么是新鲜事 News Feed 你登陆 Facebook Twitter 朋友圈 之后看到的信息流 你的所有朋友发的信息的集合 有哪些典型的新鲜事系统 Facebook Twitter 朋友圈 RSS Re
  • Windows与Linux系统实现文件互传(通俗易懂)

    SCP指令可以实Windows系统与Linux系统之间的文件互传 引言 Windows系统文件传输到Linux系统上 先操作 Windows系统文件传输到Linux系统上 再细聊 Linux系统文件传输到Windows系统上 先操作 Lin
  • 趁着周日我卷了 uni-app《uview 狠 优秀的UI框架》

    前期回顾 手写一个服务器代码将 vue电商后台管理系统 部署上去 上线 打包 活在风浪里的博客 CSDN博客亲测可用 一定会收获颇多 1 上线vue电商后台管理项目2 手写搭建服务器并挂载 node 3 打包优化 完成上线https blo
  • Shell数组:shell数组的定义、数组长度

    Shell在编程方面比Windows批处理强大很多 无论是在循环 运算 bash支持一维数组 不支持多维数组 并且没有限定数组的大小 类似与C语言 数组元素的下标由0开始编号 获取数组中的元素要利用下标 下标可以是整数或算术表达式 其值应大
  • QGIS插件式开发(一)---PyQt5+python3.6+Pychram2017.3开发环境配置

    1 PyQt简介 PyQt是用来创建GUI应用程序的工具包 它把python和Qt成功地绑定在一起 Qt库是目前最强大的库之一 PyQt是由Phil Thompson开发 PyQt实现了一个Python模块集 它有超过300个类 将近600
  • 通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)

    哲学家进餐问题 代码实现以leetcode1226为例 问题场景 解决思路 解决死锁问题 代码实现 c go 代码实现以leetcode1226为例 提到多线程和锁解决问题 就想到了os中哲学家进餐问题 问题场景 回想该问题产生场景 五个哲
  • 流形学习(Manifold Learning)

    https www cnblogs com jiangxinyang p 9314256 html 1 什么是流形 流形学习的观点 认为我们所能观察到的数据实际上是由一个低维流行映射到高维空间的 由于数据内部特征的限制 一些高维中的数据会产
  • 数学(五) -- LC[415]&[455] 字符串相加与两数相加

    1 字符串相加 1 1 题目描述 给定两个字符串形式的非负整数 num1 和num2 计算它们的和并同样以字符串形式返回 你不能使用任何內建的用于处理大整数的库 比如 BigInteger 也不能直接将输入的字符串转换为整数形式 示例 1
  • qtdesigner界面美化

    文章目录 前言 一 QSS 1 1 QSS选择器介绍 2 2 使用 二 自定义属性 2 1 添加自定义属性 前言 pyqt5能快速构建界面 但是你会发现构建出来的界面没有像我们平常用的客户端界面一样美观 现在 就让我学习一下如何美化界面 本
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 如何终止java线程

    终止线程的三种方法 有三种方法可以使终止线程 1 使用退出标志 使线程正常退出 也就是当run方法完成后线程终止 2 使用stop方法强行终止线程 这个方法不推荐使用 因为stop和suspend resume一样 也可能发生不可预料的结果
  • n行Python代码系列:两行代码去除抖音快手短视频尾部Logo

    老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知识 带来了阅读量 撩动了老猿的心 决定跟风一把 推
  • 基于Springboot+Vue图书商城系统

    目录 1 系统架构 2 系统介绍 3 运行环境 4 系统演示 5 前端搭建 6 功能展示 7 代码展示 1 系统架构 后台 SpringBoot Mybatis plus Mybatis Hutool工具包 lombok插件 前台 Vue
  • UE4 制作导出Content目录下某个文件夹内所有模型的六视图并将模型资源文件复制到指定文件夹的插件

    一 新建空白插件 在Bulid cs内加入两个模块 EditorSubsystem UnrealEd PublicDependencyModuleNames AddRange new string Core EditorSubsystem