UE Asset Batch Duplication插件

目录

准备工作

"Scripting library"

三个最重要的功能(前两个是UEditorUtilityLibrary中的)

自动创建声明:

TArray

T 的含义

F 的含义

Live Coding (Ctrl+alt F11)

Live Coding 的工作流程:

关于刷新 Visual Studio 项目:

详细步骤

步骤0:refresh Visual Studio Project and close editor

步骤1.include EditorUtilityLibrary.h and EditorAssetLibrary.h to your cpp file

步骤2. 在QuickAssetAction.h中声明BatchAssets的Function

步骤3.QuickAssetAction.cpp中,

解释:

1. TArray SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();

2. uint32 Counter = 0;

示例应用

错误代码和主要问题

正确代码

插件效果


准备工作

"Scripting library"

"Scripting library" 通常指的是一组可重用的脚本代码,开发者可以在项目中调用以简化和加快开发过程。它提供了一些常见的功能和工具,这样开发者无需从头编写每个功能,而是可以通过调用库中的函数或类,来实现特定的任务或行为。

我们需要用UEditorUtilityLibrary和UEditorAssetLibrary这两个"Scripting library"

三个最重要的功能(前两个是UEditorUtilityLibrary中的)

  • GetSelectedAssets()   返回TArray<UObject*>
  • GetSelectedAssetData()    返回TArray<FAssetData>  (比UObject*包含更多信息)
  • ListAssets    返回TArray<FString>

自动创建声明:

  • 在函数声明(例如 MyFunction)上右键单击
  • 从右键菜单中选择 Quick Actions and Refactorings 或者直接使用快捷键 Ctrl + .

TArray<FAssetData>

  • TArray 是 Unreal Engine 中的动态数组模板,用于存储同类型的数据。
  • FAssetData 是一个结构体,包含有关资产的信息,如资产的路径、类、标签等。
  • FVector MyVector; // 三维向量
    FAssetData MyAssetData; // 资产数据结构
    //示例代码

    在 Unreal Engine 的命名约定中,

T 的含义

  • Template(模板):表示这是一个模板类,可以接受不同类型的参数。例如,TArray 表示一个动态数组模板,能够存储任何类型的数据。

F 的含义

  • Struct(结构体):表示这是一个结构体,通常用于存储一些数据。例如,FVector 表示一个三维向量结构体,FAssetData 表示关于资产信息的结构体。

Live Coding (Ctrl+alt F11)

Live Coding 是 Unreal Engine 的一个功能,允许你在运行游戏时直接修改代码并重新编译,从而可以即时看到更改的效果,而不必重新启动 Unreal Editor。这对于快速迭代和调试非常有帮助。

Live Coding 的工作流程:

  1. 启用 Live Coding 后,编写或修改代码。
  2. 在 Unreal Editor 中,点击 Live Coding 按钮(通常是一个闪电图标)或使用快捷键(默认为 Ctrl + Shift + B)来编译更改。
  3. 代码编译后,Unreal Editor 会自动应用这些更改,允许你立即看到效果。

关于刷新 Visual Studio 项目:

  • 不需要:在使用 Live Coding 时,你不需要在 Unreal Editor 中手动刷新 Visual Studio 项目。Live Coding 会处理代码的编译和应用。
  • 例外:如果你进行了更改,比如添加了新的类或模块,或者更改了 .uplugin.uproject 文件,可能需要手动刷新 Visual Studio 项目。在这种情况下,你可以右键点击项目的 .uproject 文件并选择 "Generate Visual Studio project files"。

Live Coding 可以大幅提高开发效率,对于结构性更改,还是需要手动刷新项目。

详细步骤

步骤0:refresh Visual Studio Project and close editor

avoid risk squiggles and have auto completion back.

步骤1.include EditorUtilityLibrary.h and EditorAssetLibrary.h to your cpp file

假设你有一个插件 SuperManager,需要包含另一个插件 AssetActionUtility 的头文件 AssetActionUtility.h。如果直接在 QuickAssetAction.h 中包含 AssetActionUtility.h 可能会导致编译器找不到路径的问题。为了解决这个问题,你需要在 SuperManager.Build.cs 中添加 AssetActionUtility 的包含路径:

在C++项目中,编译器需要知道每个头文件的确切路径,才能正确找到并包含它们。出现 include 失败的情况,通常是因为编译器找不到头文件的路径。这可能是由于文件的组织结构、模块划分或插件的配置问题。在这种情况下,<PluginName>.Build.cs 中加入include path告诉编译器如何找到相关头文件。

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

步骤2. 在QuickAssetAction.h中声明BatchAssets的Function

// QuickAssetAction.h#pragma once#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "QuickAssetAction.generated.h"UCLASS(Blueprintable, BlueprintType)
class YOURPLUGIN_API UQuickAssetAction : public UObject
{GENERATED_BODY()public:// 第一个按钮对应的函数UFUNCTION(CallInEditor, Category = "Asset Actions")void ExecuteFirstAction();// 第二个按钮对应的函数UFUNCTION(CallInEditor, Category = "Asset Actions")void ExecuteSecondAction();
};

步骤3.QuickAssetAction.cpp中,

  • 调用 UEditorUtilityLibrary 提供的 GetSelectedAssetData() 函数,获取当前在编辑器中选中的所有资产的数据,并将这些数据存储在名为 SelectedAssetsData 的动态数组中。
  • 声明一个名为 Counter 的无符号 32 位整数变量,并将其初始值设置为 0
TArray<FAssetData>SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();
uint32 Counter = 0;

解释:

1. TArray<FAssetData> SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();
  • TArray<FAssetData>:

    • TArray 是 Unreal Engine 中的动态数组模板,用于存储同类型的数据。
    • FAssetData 是一个结构体,包含有关资产的信息,如资产的路径、类、标签等。
  • SelectedAssetsData:

    • 这是一个变量名,用于存储获取到的选中资产的数据。
  • UEditorUtilityLibrary::GetSelectedAssetData():

    • UEditorUtilityLibrary 是 Unreal Engine 提供的一个实用工具库,包含许多用于编辑器扩展和工具开发的静态函数。
    • GetSelectedAssetData()UEditorUtilityLibrary 中的一个静态函数,用于获取当前在编辑器中选中的资产的数据。它返回一个 TArray<FAssetData> 类型的数组,包含所有选中的资产信息。
  • 综合起来:

    • 这一行代码的作用是调用 UEditorUtilityLibrary 提供的 GetSelectedAssetData() 函数,获取当前在编辑器中选中的所有资产的数据,并将这些数据存储在名为 SelectedAssetsData 的动态数组中。
2. uint32 Counter = 0;
  • uint32:

    • 这是一个无符号的 32 位整数类型,表示可以存储从 04,294,967,295 的整数值。
    • uint32 是 Unreal Engine 和 C++ 中常用的数据类型之一。它代表一个无符号的 32 位整数,即只能存储非负整数,范围是 0 到 4,294,967,295。无符号类型的好处是它能提供比有符号类型(如 int32)更大的正数范围,但不能表示负数。
  • Counter:

    • 这是一个变量名,通常用于作为计数器在循环或其他需要计数的场景中使用。
  • = 0;:

    • 这是对变量 Counter 进行初始化,将其值设置为 0
  • 综合起来:

    • 这一行代码的作用是声明一个名为 Counter 的无符号 32 位整数变量,并将其初始值设置为 0。这个计数器可能会在后续的代码中用于跟踪某些操作的次数,比如处理选中的资产数量。

示例应用

假设你正在编写一个函数,用于对选中的资产进行批量操作,比如批量复制资产。你可以使用 SelectedAssetsData 来获取所有选中的资产,然后使用 Counter 来记录已经处理的资产数量。

错误代码和主要问题

void UQuickAssetAction::BatchDuplication(int32 NumOfDuplicates)
{if (NumOfDuplicates<=0) {Print(TEXT("Pls enter a valid number"), FColor::Red);return;}TArray<FAssetData>SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();uint32 Counter = 0;for (const FAssetData& SelectedAssetData : SelectedAssetsData){for (int32 i = 0; i < NumOfDuplicates; i++) {const FString SourceAssetPath = SelectedAssetData.ObjectPath.ToString();const FString NewDuplicationAssetName = SelectedAssetData.AssetName.ToString() + TEXT("_") + FString::FromInt(i + 1);//在代码中声明了 NewDuplicationAssetName,但在 FPaths::Combine 中使用了 NewDuplicatedAssetName,导致未定义标识符错误。const FString NewPathName = FPaths::Combine(SelectedAssetData.PackagePath.ToString(), NewDuplicatedAssetName);UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName){//你在调用 UEditorAssetLibrary::DuplicateAsset 后使用了 {},这在C++中是不合法的。正确的做法应该是检查 DuplicateAsset 的返回值,然后在条件语句中执行相关操作。UEditorAssetLibrary::SaveAsset(NewPathName, false);++Counter;}}}if (Counter > 0){Print(TEXT("Successfully duplicated" + FString::FromInt(Counter) + "files"), FColor::Green);}}
  1. 未定义标识符 NewDuplicatedAssetName

    • 在代码中声明了 NewDuplicationAssetName,但在 FPaths::Combine 中使用了 NewDuplicatedAssetName,导致未定义标识符错误。
  2. DuplicateAsset 的使用方式错误:

    • 你在调用 UEditorAssetLibrary::DuplicateAsset 后使用了 {},这在C++中是不合法的。正确的做法应该是检查 DuplicateAsset 的返回值,然后在条件语句中执行相关操作。

  3.≤(Unicode字符)

在如下的 cpp 文件中,条件语句使用了 (Unicode字符),而不是标准的 <= 运算符。这会导致编译器将 NumOfDuplicates≤0 视为一个未定义的标识符,而不是一个比较表达式。

      4.Function按钮重复出现

         清理和重建项目:手动删除项目中的 BinariesIntermediateSaved 文件夹,然后重新编译项目。这些文件夹可能包含缓存的编译信息,导致旧代码未被正确移除。

修改了与 Unreal 反射系统相关的代码时,如 UFUNCTION 的声明和定义,要让你的修改( UFUNCTION 的变动)在 编辑器面板 中生效,建议关闭 Live Coding 并全量编译,以确保新的反射数据被生成并在编辑器中反映。

步骤:

  1. 关闭 Unreal Editor(这很重要,确保旧的插件代码不再占用)。
  2. 打开 Visual Studio,然后点击菜单栏的 Build > Rebuild Solution,进行完整的项目重编译。
  3. 编译完成后,重新打开 Unreal Editor,查看修改是否已经在编辑器面板中生效。

正确代码

#include "AssetAction/QuickAssetAction.h"
#include "DebugHeader.h"
#include "EditorUtilityLibrary.h"
#include "EditorAssetLibrary.h"void UQuickAssetAction::BatchDuplication(int32 NumOfDuplicates)
{if (NumOfDuplicates<=0) {Print(TEXT("Pls enter a valid number"), FColor::Red);return;}TArray<FAssetData>SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();uint32 Counter = 0;for (const FAssetData& SelectedAssetData : SelectedAssetsData){for (int32 i = 0; i < NumOfDuplicates; i++) {const FString SourceAssetPath = SelectedAssetData.ObjectPath.ToString();const FString NewDuplicatedAssetName = SelectedAssetData.AssetName.ToString() + TEXT("_") + FString::FromInt(i + 1);const FString NewPathName = FPaths::Combine(SelectedAssetData.PackagePath.ToString(), NewDuplicatedAssetName);if(UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName)){UEditorAssetLibrary::SaveAsset(NewPathName, false);++Counter;}}}if (Counter > 0){Print(TEXT("Successfully duplicated" + FString::FromInt(Counter) + "files"), FColor::Green);}}

插件效果

———————————————————————————————————————————

参考链接:

"Could not be compiled. Try rebuilding from source manually." - Ask - GameDev.tv

https://www.pome.cc/tips/livecoding/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146457.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

时序预测|基于灰狼优化LightGBM的时间序列预测Matlab程序GWO-LightGBM 单变量和多变量 含基础模型

时序预测|基于灰狼优化LightGBM的时间序列预测Matlab程序GWO-LightGBM 单变量和多变量 含基础模型 文章目录 一、基本原理原理概述流程注意事项 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 时序预测中使用灰狼优化&#xff08;GWO&#xff09;结合LightGBM的…

Hash-通过哈希桶解决Hash冲突

哈希桶 基本结构 template<class T> struct HashNode {T _data;HashNode<T>* _next; }; template<class K,class T,class KeyOfT> class HashTable {typedef HashNode<T> Node; public:private:vector<Node*> _tables;size_t _num; }; insert …

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后&#xff0c;效果如下。 &#xff08;1&#xff09;简单介绍本游戏项目&#xff08;待完善&#xff09; &#xff08;2&#xff09;运行效果图&#xff08;具体大家自己可以试&#xff09; 初始运行情况。 手动更换背景图。 通过子弹攻击敌机&#xff0c;累…

java之单链表的基本概念及创建

1.链表的概念: 链表是一种 物理存储结构上非连续 存储结构&#xff0c;数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 组成结构: 由一系列节点组成&#xff0c;每个节点包含数据域和指向下一个节点的指针。 优点: 动态大小&#xff0c;易于插入和删除操作。 缺点…

无人机集群路径规划:​北方苍鹰优化算法(Northern Goshawk Optimization,NGO)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

51单片机——LED灯篇

一、LED与单片机P2管脚相连 二、点亮一个LED灯 #include <STC89C5xRC.H> void main() { P2 0xFE; //1111 1110 } P2有8个管脚&#xff0c;对应8个二进制位。 LED灯右侧接电源是正极&#xff08;1&#xff09;&#xff0c;左侧给负极&#xff08;0&#xff09;即可…

Web_php_include 攻防世界

<?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) { 以是否检测到php://为判断执行循环$pagestr_replace("php://", "", $page);//传入空值&#xff0c;替换 } include($page); ?&g…

第四范式发布AIGS Builder企业级软件重构助手,以生成式AI重构企业软件

产品上新 Product Release 今天&#xff0c;第四范式发布企业级软件重构助手——AIGS Builder&#xff0c;可快速重构软件交互体验。传统的企业软件开发&#xff0c;每次迭代通常要以月计。基于第四范式AIGS Builder大模型&#xff0c;用生成式Agent替代复杂的界面&#xff0c;…

AI绘制调整虚线教程

1、打开ai的软件&#xff0c;执行菜单栏中的文件—新建&#xff0c;新建一个大小任意的画板&#xff0c;画板大小根据自己的需要来设置。 2、选择工具箱中的直线段工具&#xff0c;将填充设置为无&#xff0c;描边设置为黑色&#xff0c;描边大小稍微设置大一点&#xff0c;画一…

模拟实现STL的stack、queue、deque等的介绍

文章目录 前言一、模拟实现stack二、模拟实现queue三、 deque总结 前言 模拟实现STL的stack、queue、deque等的介绍 一、模拟实现stack STL的stack是通过增加一个容器的模板参数&#xff0c;不直接实现栈&#xff0c;让容器存储数据&#xff0c;并调用容器的接口实现栈 name…

环形链表问题——力扣141,142

环形链表问题——力扣141&#xff0c;142 141.判断链表是否带环142.给定一个链表&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 NULL 141.判断链表是否带环 这道题不能用比较链表中的值来判断是否带环&#xff0c;因为链表中不同节点的值可以相同…

Java免税购物商城:Spring Boot技术实现

第二章 系统开发关键技术 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&#xff09…

matlab绘制二维云图,划分区域,并显示每个区域的均值

绘制成图如下&#xff1a; 代码如下&#xff1a; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建绘图的数据 ax0;bx1; ay0;by1; nx100; %数据的x轴点数 ny100; %数据的y轴点数 hx(bx-ax)/(nx-1); hy(by-ay)/(ny-1); Xax:hx:bx; Yay:hy:by; da…

有趣的Python-turtle

1 介绍 turtle 是 Python 中用来绘图的标准库&#xff08;Python解释器在安装后import直接使用&#xff09;&#xff0c;它简单且有趣&#xff0c;作为 Python初学者 都可以将它作为第一个学习对象&#xff0c;培养程序学习的兴趣&#xff0c;建立编程带来的成就感&#xff0c…

网络安全-webshell绕过,hash碰撞,webshell绕过原理

目录 一、题目 1.1 1.2 1.3 1.4 1.5 二、绕过动态检测引擎的一次尝试 三、一个比赛中的webshell 四、webshell绕过的原理以及哈希碰撞 五、JSP解释流程导致的绕过&#xff08;QT比赛&#xff09; 5.1环境 5.2例子 一、题目 这里我们通过几道题目来给大家讲解 1.…

Springboot3 + MyBatis-Plus + MySql + Uniapp 实现商品规格选择sku(附带自设计数据库,最新保姆级教程)

Springboot3 MyBatis-Plus MySql Uniapp 实现商品规格选择sku&#xff08;附带自设计数据库&#xff0c;最新保姆级教程&#xff09; 1、效果展示2、数据库设计2.1 商品表2.2 商品价格和规格中间表2.3 商品规格表 3、后端代码3.1 model3.2 vo3.3 mapper、server、serverImp3…

前端-javaScript:jquery补充

jquery绑定事件的方式 1.直接使用事件函数 &("div").click(function(){alert(1)}) 2.用统一的on函数绑定事件 on(事件类型&#xff0c;事件函数) $("div").on("click",function(){alert(2)}) 事件类型以参数的类型传递 --->可以同时绑…

go webapi上传文件 部属到linux

go厉害的地方&#xff0c;linux服务器上无需安装任务依赖就可以运行&#xff0c;大赞&#xff01; 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…

C++——关联式容器(4):set和map

在接触了诸如二叉搜索树、AVL树、红黑树的树形结构之后&#xff0c;我们对树的结构有了大致的了解&#xff0c;现在引入真正的关联式容器。 首先&#xff0c;先明确了关联式容器的概念。我们之前所接触到的如vector、list等容器&#xff0c;我们知道他们实际上都是线性的数据结…

使用pe工具制作ubuntu备份系统和还原系统

使用pe工具制作ubuntu备份系统和还原系统 备份系统还原系统修复磁盘教程修复引导教程为什么使用pe工具 1,因为我个人觉得这个工具实现起来比systemback软件操作起来报错少些,而且装的快,其他系统同理 实验准备 1,一个电脑,一个pe启动U盘 备份系统 插入U盘,开机进入pe系…