当前位置: 首页 > news >正文

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录

准备工作

1.创建插件

2.修改插件设置

快速资产操作(quick asset action) 自定义编辑器功能

0.创建编辑器button,测试debug message功能

 大致流程

详细步骤

1.ctrl+F5 launch editor

2.创建新的cpp class,derived from AssetActionUtility (如下图)

3.ACCESS HEADER FILE

Header File

Blutility

4.DECLARE A FUNCTION放进编辑器中

UFUNCTION(CallInEditor)

key (-1)

版本bug:editor面板没有Scripted Asset Action...

补充:GEngine

详细解释

1. GEngine 是什么?

2. 常见用途

3. 注意事项

4. 示例代码

总结

待更新

1.add prefix

2.batch duplication

3.remove unused assets

4.create editor message

5.dynamically load other modules to help fix up redirectors from code


准备工作

1.创建插件

插件名字不可修改

2.修改插件设置

.uplugin 是 Unreal Engine 插件的描述文件,它以 JSON 格式存储插件的元数据和配置信息,用于定义插件的基本属性、模块、依赖项以及启用方式。

在.uplugin文件中

  • Type: Runtime是游戏实时使用的插件,Editor是编辑器使用的插件
  • LoadingPhase改成PreDefault,插件会在游戏模块前被加载

ctrl+B编译

快速资产操作(quick asset action) 自定义编辑器功能

we create three custom editor functionalities that could allow us to automatically add prefix to assets, batch duplication, and remove unused assets from selection.我们主要会制作三个编辑器工具:批量添加前缀,批量复制,批量移除无用资产。另外还有创建编辑器信息、修复重定向器

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

0.创建编辑器button,测试debug message功能

 大致流程

  • 对于actions to assets, 有一个built-in class叫做AssetActionUtility
  • 我们创建一个class,derived from AssetActionUtility
  • 我们创建一个function inside that class,Mark as UFUNCTION(CallInEditor)

详细步骤

1.ctrl+F5 launch editor
2.创建新的cpp class,derived from AssetActionUtility (如下图)
  • 放在新创的插件模块里,name后面可以选择插件模块(我的插件是SuperManager(editor))(不是默认的ExtendEditor(Runtime)模块)
  • class name起名叫做QuickAssetAction,
  • 路径在SuperManager下新建一个AssetAction文件夹。
  • Class type选public,header file will be put into public folder, and cpp file will be in private folder.

3.ACCESS HEADER FILE
Header File

头文件(Header File)是编程中常用的一种文件类型,尤其在 CC++ 语言中尤为重要。它们主要用于声明函数、类、宏、常量和其他编程元素,以便在多个源文件(.c 或 .cpp 文件)之间共享和重用代码。

头文件通常以 .h.hpp 为扩展名,包含了程序中需要共享的声明部分,而具体的实现部分则放在源文件(.cpp)中。通过包含头文件,多个源文件可以访问和使用这些声明,从而实现代码的模块化和组织。

在QuickAssetAction.h里

#include "AssetActionUtility.h"

如果#include下面有red squiggle,means无法access这个 header file,证明这个headerfile在一个我们无法access的module里。

去VS右边的search solution explorer搜索,会找到AssetActionUtility.h在Blutility下

Blutility

"Blutility" 是 Unreal Engine 中的一个功能,是 "Blueprint Utility" 的缩写,专门用于创建可以在编辑器内执行的 Blueprint 工具或功能。它允许开发者通过 Blueprint 脚本创建自定义的编辑器实用工具,从而自动化一些常见的任务,提高工作效率。

去插件的build.cs SuperManager.Build.cs文件里找到PublicDependencyModuleNames.AddRange();部分加入"Blutility"

此时出现identifier"UAssetActionUtility" is undefined.证明还有一些private include path我们需要去include

clear search, 然后去到Blutility.Build.cs文件,会看到一个

PrivateIncludePaths.Add("Editor/Blutility/Private");

by default, anything in private folder, we do not have the access to, unless we add it to this include path.

去插件的build.cs SuperManager.Build.cs文件里找到 PrivateIncludePaths.AddRange();部分加入System.IO.Path.GetFullPath(Target.RelativeEnginePath)+"/Source/Editor/Blutility/Private"(是按private文件层级)

System.IO.Path.GetFullPath(Target.RelativeEnginePath)+"/Source/Editor/Blutility/Private"

depending where your engine is installed, the path for the engine folder varies from computer to computer, System.IO.Path.GetFullPath(Target.RelativeEnginePath) this big chunk simply means engine path.

总结:在SuperManager.Build.cs里加入如下代码↓

		PrivateIncludePaths.AddRange(new string[] {System.IO.Path.GetFullPath(Target.RelativeEnginePath)+"/Source/Editor/Blutility/Private"//"D:\\Epic Games\\UE_5.2\\Engine\\Source\\Editor\\Blutility\\Private"//Path.Combine(Target.RelativeEnginePath, "Source", "Editor", "Blutility", "Private")});PublicDependencyModuleNames.AddRange(new string[]{"Core","Blutility"// ... add other public dependencies that you statically link with here ...});

4.DECLARE A FUNCTION放进编辑器中

在QuickAssetAction.h里,declare a function(如下图),我们就可以在右键时加一个按键。

public:UFUNCTION(CallInEditor)void TestFuckingFunc();
};
UFUNCTION(CallInEditor)
  • UFUNCTION 是 Unreal Engine 的一个宏,用于向 Unreal Engine 的反射系统注册函数。通过这个宏,你可以为函数指定各种属性和功能。

  • CallInEditor 是这个 UFUNCTION 宏中的修饰符,表明该函数可以在 编辑器中 调用。它的作用是在不运行游戏的情况下,在 Unreal Editor 的界面中手动触发该函数。常用于创建在编辑器中帮助开发的功能,如自动化工具、批量处理任务等。

void TestFuckingFunc();

  • 这是一个函数声明,名为 TestFuckingFunc,返回类型为 void(即无返回值)。这个函数没有参数。

5.编写打印debug message的功能

创建DebugHeader.h  (里面声明print和print log两个function,然后QuickAssetAction.cpp里调用这个头文件)省的一直写GEngine

#pragma oncevoid 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);
}

                                                   8.f是debugMessage显示8秒的意思

6.去QuickAssetAction.cpp里具体实现QuickAssetAction.h声明的这个TestFuckingFunc功能

头文件声明函数,而具体的实现部分则放在源文件(.cpp)中。


#include "AssetAction/QuickAssetAction.h"
#include "DebugHeader.h"void UQuickAssetAction::TestFuckingFunc()
{Print(TEXT("I hate the plugin"), FColor::Cyan);PrintLog(TEXT("杀杀杀"));//if (GEngine) //{//	GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Yellow, TEXT("I hate this plugin"));//}
}

key (-1)

// key 为 0 的调试消息
GEngine->AddOnScreenDebugMessage(0, 5.f, FColor::Green, TEXT("Message with key 0"));

// key 为 2 的调试消息
GEngine->AddOnScreenDebugMessage(2, 5.f, FColor::Blue, TEXT("Message with key 2"));

// 再次调用 key 为 0,会替换之前 key 为 0 的消息
GEngine->AddOnScreenDebugMessage(0, 5.f, FColor::Red, TEXT("Updated message with key 0"));

key只会覆盖相同编号的message,which means, 下一个key是-1时就会覆盖它

10.这时候创建一个Blueprint,右键,就可以在Scripted Asset Action里看到自定义的这个TestFuckingFunc

版本bug: 面板没有Scripted Asset Action...(黑字英文为讲师回答)

This is a bug reappearing in versions above 5.2.  To get rid of it, you'll need to create  an AssetActionUtilityBlueprint asset for debugging.(Valid for 5.3 and above)

这是一个在5.2以上版本重复出现的bug,你需要创建一个AssetActionUtilityBlueprint资产用于debug。

1. An AssetActionUtilityBlueprint asset

Go to your plugin's content folder. Very important. Not your project's content folder. 亲测直接在content folder里创建EditorUtilityBlueprint (can rename it EUB_dummy) 并reparent也可以(parent class改为QuickAssetAction)(默认的parent class是Asset Action Utilities)

Right mouse click your content browser, go to EditorUtilities, select EditorUtilityBlueprint , a window will pop out,select AssetActionUtility, then an asset will appear. Double click to open that asset, click file and select reparent blueprint(如下图). In the selection panel, type in the C++ class we created. In my case, it's called QuickAssetAction. Click compile and save, and now you should see ScriptedAssetAction.

2.I can't see new menu entry created after I create a new CallInEditor function in C++(这个bug我没有遇到)

In case you run into this issue as well, you just need to manually open the debug asset we created. Click compile and save again. That should do the trick.

Keep this newly created asset in your plugin's content folder during development. 

补充:GEngine

“GEngine” 通常出现在 Unreal Engine(虚幻引擎) 的 C++ 编程中。它是一个全局指针,指向当前运行的引擎实例,允许开发者在代码中访问引擎的各种功能,比如日志记录、调试信息输出、渲染管理等。

详细解释

1. GEngine 是什么?

在 Unreal Engine 中,GEngine 是一个全局变量,类型为 UEngine*。它提供了一种访问引擎核心功能的便捷方式。通过 GEngine,你可以执行诸如打印调试信息、访问渲染设置、管理游戏状态等操作。

2. 常见用途
  • 打印调试信息: 使用 GEngine 可以在游戏窗口中显示调试信息,这对于调试非常有用。

    if (GEngine)
    {GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Hello, Unreal!"));
    }//此代码会在游戏屏幕上显示一条持续 5 秒的红色调试信息“Hello, Unreal!”。
    
  • 访问引擎功能: 你可以通过 GEngine 访问引擎的各种子系统,例如渲染、声音、输入等。

    if (GEngine && GEngine->GameViewport)
    {// 例如,获取当前视口大小FVector2D ViewportSize;GEngine->GameViewport->GetViewportSize(ViewportSize);UE_LOG(LogTemp, Log, TEXT("Viewport Size: %f, %f"), ViewportSize.X, ViewportSize.Y);
    }
    
3. 注意事项
  • 空指针检查: 在使用 GEngine 之前,最好检查它是否为 nullptr,以避免潜在的崩溃。

  • if (GEngine)
    {// 安全地使用 GEngine
    }
    
  • if (GEngine)
    {// 安全地使用 GEngineGEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Hello, Unreal!"));
    }
    else
    {// 处理 GEngine 为 nullptr 的情况UE_LOG(LogTemp, Warning, TEXT("GEngine is not available."));
    }
    

  • 性能考虑: 虽然 GEngine 很有用,但过度依赖全局变量可能会影响代码的可维护性和测试性。尽量在需要的地方使用,并考虑依赖注入或其他设计模式来减少对全局变量的依赖。

  • 仅在适当的上下文中使用GEngine 通常在游戏运行时有效,但在编辑器模式或某些特殊情况下可能不可用。因此,确保在适当的上下文中使用它。

4. 示例代码

以下是一个在角色类中使用 GEngine 打印玩家位置的示例:

#include "GameFramework/Actor.h"
#include "Engine/Engine.h"void AMyCharacter::PrintPlayerLocation()
{if (GEngine){FVector Location = GetActorLocation();FString LocationString = FString::Printf(TEXT("Player Location: X=%f, Y=%f, Z=%f"), Location.X, Location.Y, Location.Z);GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, LocationString);}
}//这个函数获取角色的位置并在屏幕上显示出来,持续 5 秒,颜色为绿色。

总结

总结:GEngine 是 Unreal Engine 中一个非常有用的全局指针,允许开发者在 C++ 代码中方便地访问引擎的各种功能。正确使用 GEngine 可以大大简化调试和开发过程,但也要注意其使用场景和潜在的风险。

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

待更新

1.add prefix

2.batch duplication

3.remove unused assets

4.create editor message

5.dynamically load other modules to help fix up redirectors from code

相关文章:

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作(quick asset action) 自定义编辑器功能 0.创建编辑器button,测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class,derived from AssetAction…...

力扣上刷题之C语言实现-Day2

一. 简介 本文记录一下,力扣C语言逻辑题。主要涉及 数组方面的知识。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target…...

Visual Studio 2022 - QT 环境中文字符乱码问题

Visual Studio 2022 - QT 环境中文字符乱码问题 一、Visual Studio 2022 - Qt 环境 在 QT 中使用中文字符串常会出现乱码现象&#xff0c;如下&#xff1a;以下提供了几个解决方法&#xff0c;仅供参考 QString str "百香果真是一直可爱的小猫咪"; qDebug() <…...

获得ASPICE认证需要满足哪些条件?

要获得ASPICE认证&#xff0c;需要满足以下条件&#xff1a; ( 要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 一、基础条件…...

鸿蒙_异步详解

参考详细链接&#xff1a; 鸿蒙HarmonyOS异步并发开发指南...

linux日志查询搜索view

view 命令实际上是 vim 编辑器的一个只读模式。当你使用 view 打开一个文件时&#xff0c;实际上是在用 vim 查看该文件&#xff0c;只是不能编辑内容。因此&#xff0c;view 下的搜索操作与 vim 类似。 以下是如何在 view 模式下进行搜索&#xff1a; 启动 view 并打开文件&a…...

性能测试工具——JMeter

目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一&#xff1a; 方式二&#xff1a; 3、JMeter基础设置 4、JMeter基本使用流程 &#xff08;1&#xff09;启动JMeter &#xff08;2&#xff09;在测试计划下添加线程组 &#xff08;3&#xff09;在 “线…...

1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G 操作系统&#xff1a;Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 关…...

c/c++八股文

c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…...

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置&#xff1a;你需拥有&#x1f431; 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d&#xff0c;进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意&#xff1a;每个人的路径可…...

ECharts的特点

ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;由百度团队开源&#xff0c;并于2018年初捐赠给Apache基金会&#xff0c;成为ASF孵化级项目。ECharts提供了直观、生动、可交互、可个性化定制的数据可视化图表&#xff0c;广泛应用于数据分析和展示领域。以下是关于…...

JVM OutOfMemoryError 与 StackOverflowError 异常

目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…...

linux防火墙学习

Linux 防火墙配置&#xff08;iptables和firewalld&#xff09; Linux 防火墙配置&#xff08;iptables和firewalld&#xff09;_iptables配置文件位置-CSDN博客 Linux查看防火墙状态及开启关闭命令_linux 查看防火墙-CSDN博客...

Java面试篇基础部分- Java中的阻塞队列

首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。 阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是…...

Go语言并发编程之Channels详解

并发编程是Go语言的一大特色,而channel(通道)则是Go语言中用于实现并发的核心工具之一。它源于CSP(Communicating Sequential Processes)的概念,旨在让多个goroutine之间能够高效地进行通信和同步。本文将深入探讨channel的用法、原理和最佳实践,通过丰富的示例代码和详…...

【Java集合】LinkedList

概要 LinkedList是用链表结构存储数据的&#xff0c;很适合数据的动态插入和删除&#xff0c;随机访问速度比较慢。另外&#xff0c;他还提供了 List 接口中没有定义的方法&#xff0c;专门用于操作表头和表尾元素&#xff0c;可以当作堆栈、队列和双向队列使用。 链表 链表是…...

大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集

引言 在去年(2023)云栖大会上&#xff0c;阿里云正式发布千亿级参数大模型通义千问2.0。据现场介绍&#xff0c;在10个权威测评中&#xff0c;通义千问2.0综合性能超过GPT-3.5&#xff0c;正在加速追赶GPT-4。以下是通义千问在MMLU、C-Eval、GSM8K、HumanEval、MATH等10个主流…...

解决selenium爬虫被浏览器检测问题

文章目录 专栏导读1.问题解析2.代码解析(Edge/Chrome通用)2.1 设置Edge浏览器选项:2.2 尝试启用后台模式2.3 排除启用自动化模式的标志2.4 禁用自动化扩展2.5 设置用户代理2.6 实例化浏览器驱动对象并应用配置2.7 在页面加载时执行JavaScript代码 3.完整代码&#xff08;可直接…...

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…...

LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142463789 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 多模态…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...