Unreal Engine 5 C++: Asset Batch Duplication插件编写02

news2024/9/27 12:07:40

目录

准备工作

"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 表示关于资产信息的结构体。

Open Editor (Ctrl+ F5)

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,查看修改是否已经在编辑器面板中生效。

正确代码

新建项,添加一个DebugHeader.h声明print功能

#pragma once

void Print(const FString& Message, const FColor& Color)
{
	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(-1, 8.f, Color, Message);
	}
}

void PrintLog(const FString& Message)
{
	UE_LOG(LogTemp, Warning, TEXT("%s"),*Message);
}
#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);
	}
		

}

插件效果

重要DEBUG

如果遇到旧的UFUNCTION遗留的问题(代码中已删除,编辑器仍显示按钮)

  • 先热重载,
  • 再去EUB里重新解绑和绑定一下parent class。(EUB的设置见专栏上一篇,是用于debug editor页面不显示Scriptable Asset Action

在ctrl shift B编译visual studio时,一定先关闭 Unreal Editor,原因如下:

1. 防止文件冲突和锁定

  • Unreal Editor 会锁定文件:当 Unreal Editor 打开时,它会加载大量资源、编译的 DLL、模块等。如果你在编译过程中,这些文件可能已经被编辑器使用或锁定,导致 Visual Studio 无法正确访问和覆盖这些文件,可能会出现编译失败或冲突错误。
  • DLL 文件被使用:如果你正在修改插件或模块的代码,编译后会生成新的动态链接库(DLL)文件。在编译时,Visual Studio 需要替换这些 DLL 文件,但如果编辑器正在运行并使用这些文件,新的 DLL 无法被覆盖。

2. 确保资源和内存的一致性

  • 资源占用问题:当编辑器打开时,它会占用大量内存和处理资源。关闭编辑器可以腾出系统资源,保证 Visual Studio 编译时有足够的内存和处理能力,尤其是大型项目的编译。
  • 避免内存数据不同步:当编辑器运行时,可能会产生临时缓存或文件。而编译新代码后,这些缓存可能与新生成的代码不匹配,导致运行时出现错误或不一致的问题。

3. 避免热重载失败

  • 热重载机制的限制:Unreal Engine 具有热重载(Hot Reload)功能,允许在编辑器运行时重新编译代码并加载新版本的 DLL。然而,热重载机制并不完美,尤其是在涉及到大量代码或模块更改时,可能会引发编译失败、崩溃、编辑器状态不一致等问题。
  • 模块结构变化影响热重载:如果代码中涉及到模块、宏、类的定义变化,热重载可能无法正确识别这些更改。这种情况下,最好关闭编辑器,重新启动以加载新的代码。

4. 清除和重建项目

  • 避免编辑器缓存干扰:如果你想进行清理并完全重新构建项目,编辑器的某些缓存文件可能会干扰编译。关闭编辑器可以确保 Visual Studio 完全清理并重新生成所有文件,避免潜在的旧缓存问题。

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

参考链接:

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

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

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

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

相关文章

uni-app - - - - - 实现锚点定位和滚动监听功能(滚动监听功能暂未添加,待后续更新)

实现锚点定位和滚动监听功能 1. 思路解析2. 代码示例 效果截图示例&#xff1a; 点击左侧menu&#xff0c;右侧列表数据实现锚点定位 1. 思路解析 点击左侧按钮&#xff0c;更新右侧scroll-view对应的scroll-into-view的值&#xff0c;即可实现右侧锚点定位滚动右侧区域&am…

攻防世界--->robots

学习笔记。 robots&#xff1a; 得&#xff0c;就是隐藏某些东西呗。 - - 好吧&#xff0c;还是不会。 参考&#xff1a; 攻防世界——新手区——robots_robots flag-CSDN博客https://blog.csdn.net/weixin_45864041/article/details/108036234 突破点&#xff1a; so&#…

u-navber自定义导航栏搜索框

效果 代码 <template><view><u-navbar :is-back"false"><view class"navbar"><view class"search"><image src"../../static/my_device/search_icon.png" class"search_image"></i…

代码随想录算法day40 | 动态规划算法part13 | 647. 回文子串,516.最长回文子序列

647. 回文子串 动态规划解决的经典题目&#xff0c;如果没接触过的话&#xff0c;别硬想 直接看题解。 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的…

箱包发霉怎么清洁霉斑 工厂箱包发霉翻箱处理方法

箱包是我们日常生活中的必备品&#xff0c;随着箱包工厂订单不断&#xff0c;但工厂最头疼的就是会经常遇到批量的箱包出现发霉的问题。一旦发霉&#xff0c;并要面临一笔巨额索赔问题&#xff0c;尤其出口到国外发霉了&#xff0c;经ihaoer防霉人士介绍一种简单有效的方法&…

apple developer 开发者账号被停用,提示Locked,终于解决了

事情是这样的&#xff0c;9.11我们要发布app的时候&#xff0c;一直登录不上。然后联系了苹果客服&#xff0c;告知账号不活跃。于是让我们通过活跃申请、以及重置密码申请操作来解决。 然后&#xff0c;操作一遍又一遍&#xff0c;都解决不了。 后来联系可国外的客服&#…

新能源行业的福音,复合机器人助力打造智能无人化充电站

随着工业自动化和智能化水平的不断提升&#xff0c;无人化作业已成为现代生产线的必然趋势。在山西地区的室内生产条件下&#xff0c;富唯智能凭借其在自卸车充电系统领域的深厚积累&#xff0c;成功设计出一套高效、稳定的自卸车自动充电系统&#xff0c;为工业领域带来革命性…

ssm协同办公系统-计算机毕业设计源码42133

摘要 随着信息技术的迅猛发展&#xff0c;协同办公系统在企业和组织中扮演着越来越重要的角色。本研究旨在基于SSM框架、Java编程语言和MySQL数据库&#xff0c;设计和开发一个协同办公系统。首先&#xff0c;介绍了协同办公系统的背景和意义&#xff0c;详细阐述了系统的功能模…

Git - 版本管理

本文我们来介绍下 Git 管理版本的几个常用命令。 ‍ git log&#xff1a;查看提交日志 随着对文件的不断修改与提交&#xff0c;Git 帮我们管理了之前的各个版本。就好比玩一个能存档的游戏&#xff0c;每过一关就能帮我们存档&#xff0c;如果某一关没打过&#xff0c;就可…

告别繁琐!用 Light To Freedomen一键打造你的专属后台管理系统

作为开发者&#xff0c;特别是后端开发人员&#xff0c;前端开发工作往往是一项让人头疼的挑战。复杂的UI设计&#xff0c;数据展示和交互逻辑&#xff0c;不仅费时费力&#xff0c;还容易出现各种问题。然而&#xff0c;后台管理系统作为企业应用的核心模块&#xff0c;又是无…

uboot以tag结构体的方式给内核传参,cmdline,bootargs,以及uboot如何启动内核

uboot以tag结构体的方式给内核传参&#xff0c;cmdline&#xff0c;bootargs&#xff0c;以及uboot如何启动内核 一、u-boot启动流程 1、第一阶段 cpu/s3c24xx/start.S 主要是一些依赖于 CPU 体系结构的代码,比如硬件设备初始化代码 等。这一阶段的代码主要是通过汇编来实现…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveRelative

机器自动化控制器——第三章 轴指令 5 MC_MoveRelative变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_MoveRelative 指定自指令当前位置起的移动距离&#xff0c;进行定位。 指令名称FB/FUN图形表现ST表现MC…

如何查看线程

1、首先找到我们的电脑安装jdk的位置&#xff0c;这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok&#xff0c;那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程&#xff1a; jconsole 这里能够罗列出你系统上的 java 进程&#xff0…

学习threejs,绘制二维线

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制二维线1. ☘️…

软件测试岗位的经典面试题

在我近十年的测试职业生涯中&#xff0c;我也面试过不少软件测试岗位的候选人&#xff0c;这几个问题我也经常问到。但很多同学在这几个高频面试题上&#xff0c;其实并不太了解面试官提问背后的逻辑和目的。 这篇文章&#xff0c;聊聊这几道经典面试题考查的目的&#xff0c;…

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;并基于前期收集到的5种常见的花朵数据集&#xff08;向日葵、玫瑰、蒲公英、郁金香、菊花&#xff09;进行处理后进行模型训练&#xff0c;最…

生成式AI赋能:对话式BI引领数据分析新潮流

引言&#xff1a;数据交互的革新之旅 在信息爆炸的今天&#xff0c;我们与数据交互的方式正经历着前所未有的变革。静态的仪表盘&#xff0c;尽管曾以视觉上的革新引领一时风尚&#xff0c;但如今已难以满足用户对动态、深度数据洞察的迫切需求。用户不再满足于仅仅观赏精美的…

如何恢复被删除的 GitLab 项目?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

攻防世界--->backup

学习笔记。 备份文件&#xff1f; 没听过&#xff0c;&#xff0c;&#xff0c;搜呗。 我看的这个&#xff1a; CTF——Web网站备份源码泄露_web常见备份文件有哪些-CSDN博客https://blog.csdn.net/weixin_51735061/article/details/124238304 进入靶场。 嗯&#xff1f; -…

实操学习——文章和评论的设计

实操学习——文章和评论的设计 1.文章表的设计2.文章表接口演示基础权限创建文章修改文章删除文章浏览所有文章 3.评论表的设计4.评论表接口演示1. 查询指定文章下的所有评论 1.文章表的设计 创建一个community的app 在settings中 完成注册 定义模型 创建文章表 from django.…