Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录

引言

一、创建一个C++插件TextureReader插件

二、Build.cs文件

三、ModuleRules

四、TextureReader插件的构造

4.1ReadOnlyTargetRules的作用

4.2TextureReaderd的构造调用

4.3设置当前类的预编译头文件的使用模式

4.4PublicIncludePaths.AddRange与PrivateIncludePaths.AddRange 

五、加载PrivateIncludePathModuleNames

5.1Core

5.2UMG



引言

在UE5中我们可以点开插件功能,我们可以看到有很多的插件供我们选择和下载,其中除了UE官方给我们提供了非常丰富的插件以外,来自世界各地的UE开发者也上传了很多自己实现的插件,同样,我们也可以实现自己想要的插件。以下,博主将从自己在公司实习过程中所掌握的开发技巧作以分享,从0自己实现一个加载特定路径下不同类型图片的插件。

一、创建一个C++插件TextureReader插件

点击添加插件,我们创建一个蓝图库类型的插件。可以自己对齐进行命名操作。

创建完毕后,在VS中我们可以清晰的看到Plugins目录下保存着我们刚刚创建的插件文件夹。


二、Build.cs文件

点击C#开头的Build.cs文件夹我们可以看到以下结构:

在Unreal Engine(UE)项目中,Build.cs 文件是一个非常重要的配置文件,用于定义项目的构建设置和依赖关系。这个文件是Unreal Engine 4(UE4)及更高版本(如UE5)中使用的C#脚本,属于Unreal Build Tool(UBT)的一部分。UBT是Unreal Engine的专用构建系统,用于编译和管理项目的构建过程。

Build.cs 文件的主要作用包括:

  1. 定义项目依赖:在Build.cs中,你可以指定项目所依赖的其他模块。这确保了当构建你的项目时,所有必需的模块都会被正确编译和链接。
  2. 配置构建平台:你可以为不同的平台(如Windows、Mac、Linux、Android、iOS等)设置特定的构建选项。这包括定义条件编译符号、平台特定的库依赖等。
  3. 设置编译选项:你可以在这里定义编译器标志、优化级别、调试信息等编译选项。
  4. 管理项目模块Build.cs文件允许你定义和配置项目中的模块(Modules)。模块是UE项目的基本构建块,可以包含代码、资源、插件等。
  5. 插件和第三方库:如果你的项目使用了第三方库或UE插件,你可以在Build.cs中配置这些依赖,确保它们被正确集成到构建过程中。
  6. 自定义构建步骤:虽然不常见,但在某些高级用例中,你可以定义自定义的构建步骤或脚本,以在标准构建过程之前或之后执行特定的任务。

而在Build.cs文件中我们可以看到我们刚刚所命名的TextureReader被定义为一个类,并且继承自一个名为ModuleRules的父类。


三、ModuleRules

在UE中,ModuleRules是一个非常重要的类,它用于定义和配置模块的编译规则。这些规则包括模块的类型、依赖关系、包含路径、库路径等,它们共同决定了模块如何被构建和集成到UE项目中。而ModuleRules的详细作用体现在以下几个方面:

一、定义模块类型

ModuleRules类中的Type属性用于指定模块的类型。在UE中,模块可以是标准的C++模块(CPlusPlus),也可以是外部的第三方模块(External)。这个属性对于UE构建系统来说至关重要,因为它决定了模块如何被构建和管理。

二、管理依赖关系

ModuleRules类提供了多个属性来管理模块的依赖关系,包括:

  • PublicDependencyModuleNames公共依赖模块名称列表。这些模块对于当前模块的公共代码是可见的,并且会在编译时被链接到当前模块中。
  • PrivateDependencyModuleNames私有依赖模块名称列表。这些模块仅对当前模块的私有代码可见,并且会在编译时被链接到当前模块中,但不会被其他模块看到。

通过管理这些依赖关系,ModuleRules确保了模块之间的正确链接和隔离,从而提高了代码的可维护性和可扩展性。

三、指定包含路径和库路径

ModuleRules类还提供了多个属性来指定模块的包含路径和库路径,包括:

  • PublicIncludePathModuleNamesPrivateIncludePathModuleNames:这些属性用于指定包含头文件的模块名称列表,它们分别对应公共和私有包含路径。
  • PublicSystemIncludePathsPrivateSystemIncludePaths:这些属性用于指定系统/库包含路径列表,它们通常用于外部(第三方)模块。
  • PublicRuntimeLibraryPathsPrivateRuntimeLibraryPaths:这些属性用于指定运行时库的搜索路径列表。

通过指定这些路径,ModuleRules确保了编译器能够正确地找到和包含所需的头文件和库文件。

而我们实现插件的第一步也就是要对这几个继承自父类ModuleRules的属性进行编辑。

四、配置附加库和延迟加载

ModuleRules类还提供了属性来配置附加库和延迟加载的DLL文件。例如:

  • PublicAdditionalLibraries附加库的列表(.lib文件的名称,包括扩展名),通常用于外部(第三方)模块。
  • PublicDelayLoadDLLs用于指定需要在程序运行时延迟加载的DLL文件列表。

这些配置有助于优化程序的启动速度和内存使用,同时提高了程序的灵活性和可扩展性。


四、TextureReader插件的构造

4.1ReadOnlyTargetRules的作用

在Unreal Engine(UE)中,ReadOnlyTargetRules是一个结构体(struct),它封装了与目标平台相关的只读编译规则。这些规则定义了如何针对不同的目标(如编辑器、游戏客户端、服务器等)以及不同的平台(如Windows、Mac、Linux、iOS、Android等)进行编译。ReadOnlyTargetRules类型的参数通常用于配置和初始化那些需要根据目标平台差异而调整其行为或特性的类、函数或模块。

ReadOnlyTargetRules的主要用途:

  1. 平台特定设置:提供平台特定的编译选项,例如是否启用某些特性、是否包含特定的头文件或库等。

  2. 编辑器与游戏区分:允许代码在编辑器模式下和游戏模式下有不同的行为。例如,某些调试功能或编辑器专用的工具可能只在编辑器模式下可用。

  3. 性能优化:根据目标平台的性能特性,调整代码以优化性能。例如,在移动设备上可能需要减少内存使用或降低图形质量。

  4. 兼容性处理:处理不同平台之间的兼容性问题,确保代码能够在所有目标平台上正确运行。

ReadOnlyTargetRules参数的使用场景:

  • 类构造函数:在类的构造函数中使用ReadOnlyTargetRules参数,以便根据目标平台初始化类的成员变量或配置类的行为。

  • 函数参数:将ReadOnlyTargetRules作为函数参数传递,以便函数能够根据目标平台执行不同的操作。

  • 模块配置:在模块的构建脚本(如UE4中的Build.cs或UE5中的MyModule.Build.cs)中使用ReadOnlyTargetRules来配置模块的编译选项。

4.2TextureReaderd的构造调用

TextureReaderd类的构造函数接收一个ReadOnlyTargetRules类型的参数Target,并将其传递给基类(base)的构造函数。下面是对这段代码的详细解读:

类的定义与构造函数

  • 类名TextureReader
  • 构造函数public TextureReader(ReadOnlyTargetRules Target) : base(Target)

构造函数参数

  • 参数类型ReadOnlyTargetRules
  • 参数名Target(注意,这里的Target是参数名,并非关键字,因此可以使用小写)
  • 参数用途:此参数通常包含了目标平台的编译规则,例如是否针对编辑器、游戏,或是特定硬件平台(如PC、移动设备等)的编译设置。

基类构造函数调用

  • base(Target)这部分代码表示调用TextureReader基类的构造函数,并将Target参数传递给它。这是C++中初始化基类部分的标准做法。

4.3设置当前类的预编译头文件的使用模式

PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 这行代码用于设置预编译头文件(Precompiled Headers,简称PCHs)的使用模式。UE中的PCHs是一种优化技术,它允许开发者将常用的头文件编译成单个预编译文件,从而加速编译过程并减少编译时间。

让我们详细解释一下这行代码的含义:

  • PCHUsage:这是一个属性或设置项,用于指定当前模块如何使用PCHs。

  • ModuleRules.PCHUsageModeModuleRules是一个类,它定义了模块的编译规则。PCHUsageModeModuleRules类中的一个枚举类型,用于指定PCHs的使用模式。

  • UseExplicitOrSharedPCHs:这是PCHUsageMode枚举中的一个值,它表示模块将使用显式定义的PCHs或共享PCHs。

    • 显式PCHs:开发者需要在模块的Build.cs文件中明确指定哪些头文件应该被包含在PCH中。这通常是通过PublicPCHHeaderPrivatePCHHeader属性来实现的。

    • 共享PCHs:UE项目可以配置一个或多个共享PCHs,这些PCHs包含了项目中多个模块共同需要的头文件。当模块设置为使用共享PCHs时,它会自动包含这些共享PCHs中的内容。

PCHUsage设置为UseExplicitOrSharedPCHs意味着开发者可以选择为当前模块指定显式的PCH,或者如果项目配置了共享PCHs,则模块将使用这些共享PCHs。这提供了灵活性,允许开发者根据项目需求和模块特性来决定最佳的PCH使用策略。

4.4PublicIncludePaths.AddRange与PrivateIncludePaths.AddRange 

PublicIncludePaths.AddRange()方法的作用主要是向项目的公共包含路径集合中添加一组路径。以下是对其作用的详细解释:

作用

  1. 添加公共路径
    • AddRange是一个集合方法,用于将一个集合(如数组、列表等)中的所有元素添加到另一个集合中。在UE的项目配置中,PublicIncludePaths是一个包含公共头文件路径的集合。通过调用PublicIncludePaths.AddRange方法,你可以将一组新的路径添加到这个集合中。
  2. 公共性
    • PublicIncludePaths中的路径不仅对当前项目可见,还可能对依赖此项目的其他项目或模块可见。这意味着,通过添加路径到PublicIncludePaths,你确保这些路径中的头文件在编译过程中可以被当前项目及其依赖项访问。
  3. 头文件包含
    • 包含路径(Include Paths)是编译器在查找头文件时应该搜索的目录列表。在C++等编程语言中,头文件包含函数声明、宏定义等,这些文件在编译过程中被包含(include)到源文件中。PublicIncludePaths中的路径允许编译器在编译当前项目及其依赖项时找到并包含这些公共头文件。

应用场景

  1. 多项目共享头文件
    • 当你有多个项目需要共享相同的头文件时,可以将这些头文件的路径添加到PublicIncludePaths中。这样,所有依赖这些头文件的项目都可以访问它们,而无需在每个项目中单独配置路径。
  2. 使用第三方库
    • 当你使用第三方库时,通常需要将库的头文件路径添加到项目的包含路径中。如果这些头文件需要被多个项目或模块访问,那么将它们添加到PublicIncludePaths是一个合适的选择。
  3. 模块间依赖
    • 在UE中,模块之间可能存在依赖关系。如果一个模块需要访问另一个模块的头文件,那么可以将这些头文件的路径添加到PublicIncludePaths中,以确保在编译过程中可以正确找到并包含它们。

配置方式

  • 在UE的C++项目中,PublicIncludePaths.AddRange方法通常在项目的.Build.cs文件中被调用。你需要在这个文件中找到或创建PublicIncludePaths集合,并调用AddRange方法将新的路径添加到集合中。


PrivateIncludePaths.AddRange()方法的作用主要是向项目的私有包含路径集合中添加一组路径。以下是对其作用的详细解释:

  1. 添加私有路径
    • AddRange是一个集合方法,用于将一个集合(如数组、列表等)中的所有元素添加到另一个集合中。在UE的项目配置中,PrivateIncludePaths是一个包含私有头文件路径的集合。通过调用PrivateIncludePaths.AddRange方法,你可以将一组新的路径添加到这个集合中。
  2. 私有性
    • PublicIncludePaths不同,PrivateIncludePaths中的路径仅对当前项目可见,不会影响到依赖此项目的其他项目。这意味着,通过添加路径到PrivateIncludePaths,你确保这些路径仅在当前项目的编译过程中被使用。
  3. 头文件包含
    • 包含路径(Include Paths)是编译器在查找头文件时应该搜索的目录列表。在C++等编程语言中,头文件包含函数声明、宏定义等,这些文件在编译过程中被包含(include)到源文件中。PrivateIncludePaths中的路径允许编译器在编译当前项目时找到并包含这些私有头文件。
  4. 应用场景
    • 在UE项目中,你可能有一些头文件不希望被其他项目或模块访问,这时可以将这些头文件的路径添加到PrivateIncludePaths中。
    • 当你使用第三方库或自定义的模块,并且这些库或模块的头文件需要被包含到你的项目中,但又不希望它们被外部访问时,也可以将这些路径添加到PrivateIncludePaths中。
  5. 配置方式
    • 在UE的C++项目中,PrivateIncludePaths.AddRange方法通常在项目的.Build.cs文件中被调用。你需要在这个文件中找到或创建PrivateIncludePaths集合,并调用AddRange方法将新的路径添加到集合中。

五、加载PrivateIncludePathModuleNames

私有依赖模块仅对当前模块可见,其他模块无法直接访问这些私有依赖。这有助于减少模块间的耦合度,提高代码的可维护性和可扩展性。所以我们将此次TextureReader插件所需要用到的模块加载到PrivateIncludePathModuleNames中。

PrivateDependencyModuleNames.AddRange(new string[]{"CoreUObject","Engine","Slate","SlateCore","ImageWrapper",//图像类的总的模块类"Core","UMG"// ... add private dependencies that you statically link with here ...	});

5.1Core

Core模块在Unreal Engine中扮演着至关重要的角色,它提供了游戏开发所需的基础数据类型、数据结构、跨平台支持、内存管理等功能。

核心功能与重要性

  1. 基础数据类型与结构Core模块提供了游戏开发中所需的基础数据类型和数据结构,这些是构建更复杂游戏逻辑和系统的基石。
  2. 跨平台支持包含了针对不同平台的代码和资源,如Android、iOS、Windows等,使得游戏能够轻松地在多个平台上运行。
  3. 内存管理与优化高效的内存管理机制有助于游戏开发者优化游戏的性能,减少内存泄漏和浪费,从而提升游戏的运行效率。
  4. 基础框架与功能提供了引擎的基本框架和功能,如日志记录、配置管理、数学运算等,这些都是游戏开发中不可或缺的部分。

5.2UMG

UMG(Unreal Motion Graphics UI Designer)是一个重要的可视化UI(用户界面)创作工具。UMG的作用主要体现在以下几个方面:

一、创建和编辑UI元素

UMG允许开发者创建各种UI元素,如游戏中的HUD(平视显示器)、菜单、按钮、复选框、滑块、进度条等。这些元素是构成游戏用户界面的基础,通过UMG,开发者可以轻松地设计和布局这些元素,以满足游戏的需求。

二、编辑界面布局

UMG提供了强大的布局编辑功能,开发者可以在可视化的界面中拖放控件,调整它们的位置、大小和属性。此外,UMG还支持多种布局面板,如Canvas Panel(画布面板)、Grid Panel(网格面板)、Horizontal Box(水平框)和Vertical Box(纵向框)等,这些面板可以帮助开发者实现复杂的界面布局。

三、编辑界面动画

除了静态的UI元素外,UMG还支持创建和编辑界面动画。通过UMG,开发者可以为UI元素添加动画效果,如淡入淡出、滑动、缩放等,以提升用户界面的交互性和视觉吸引力。

四、处理UI交互

UMG与虚幻引擎的蓝图系统紧密集成,允许开发者在蓝图中处理UI交互。通过蓝图,开发者可以定义UI元素的响应事件,如按钮点击、滑块拖动等,并编写相应的逻辑来处理这些事件。这使得开发者能够轻松地实现用户界面的交互功能。

这也是我们创建的蓝图类的插件所必不可少的一个模块,所以必须要加载进来

五、优化性能和内存管理

UMG还提供了多种优化性能和内存管理的功能。例如,开发者可以使用无效框(Invalidation Box)来缓存UI绘制的中间数据,减少绘制的CPU消耗。此外,通过合理结构提升渲染性能,如减少UI层级、合并图集等,可以进一步优化游戏的性能表现。

六、与Slate的关系

UMG是基于Slate构建的界面编辑系统。Slate是虚幻引擎的底层UI框架,负责执行控件的逻辑(包括渲染和事件)。UMG则是对Slate的封装,提供了更友好、更直观的界面编辑工具,使得开发者能够更方便地创建和编辑用户界面。

博主作为第一次接触UE开发的新手,搞懂以上内容也花费了大量的实践和精力,而熟悉C++的特性语法以及常见的开发技巧也只是学习UE开发的万里长征第一步,唯有不断学习不断提升才能真正的掌握其精髓,成为一个真正的UE开发工程师

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

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

相关文章

探索C嘎嘎:初步接触STL

#1024程序员节|征文# 前言: 在前文小编讲述了模版初阶,其实讲述模版就是为了给讲STL提前铺垫,STL是C中很重要的一部分,各位读者朋友要知道它的份量,下面废话不多说,开始走进STL的世界。 目录&am…

指令系统 I(指令的格式、寻址)

一、指令系统 1. 指令集体系结构 指令(机器指令)是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。 指令系统是指令集体系结构(ISA&#xf…

如何精准选择Yandex关键词

Hey小伙伴们👋,今天来聊聊如何精准选择Yandex关键词,让你的广告投放效果最大化!🔍 1.使用Yandex关键词工具:Yandex提供了关键词工具,如Yandex Keyword Planner和Yandex Wordstat&#xff0…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐: 随着 AI 技术的不断发展,视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中,图像与文字的交互需求愈发旺盛,很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

jmeter附件上传

可以采用录制的方式获取附件上传的http请求 普通参数 附件参数 文件名称: 方式一:如果只添项目名称,默认充jmeter的bin目录下获取 方式二:点击文件名称,再点击浏览,可以自己选择文件信息

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

如何用Python同时抓取多个网页:深入ThreadPoolExecutor

背景介绍 在信息化时代,数据的实时性和获取速度是其核心价值所在。对于体育赛事爱好者、数据分析师和投注行业而言,能否快速、稳定地抓取到实时比赛信息显得尤为重要。特别是在五大足球联赛中,能够在比赛进行时获得比分、控球率等实时数据&a…

【UBuntu20 配置usb网卡】 记录Ubuntu20配置usb网卡(特别是建立热点)

【UBuntu20 配置usb网卡】 Ubuntu20配置usb网卡(特别是建立热点) 一、 闲言碎语的前言 usb的外置网卡,相比Windows即插即用,Linux买回来一顿折腾,准备把过程梳理一下记录起来。 网卡的方案其实就那几家,…

前端开发模块VUE-Element UI学习笔记

前端开发模块VUE-Element UI学习笔记 文章目录 前端开发模块VUE-Element UI学习笔记 1、Element UI 简介2、Element UI 安装3、Icon 图标4、Button 按钮5、Link 超链接6、Radio 单选框7、Checkbox 多选框8、Input 输入框9、Select 下拉框10、Switch 开关 1、Element UI 简介 基…

Java面试经典 150 题.P169. 多数元素(005)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int majorityElement(int[] nums) …

如何在Python爬虫等程序中设置和调用http代理

在Python爬虫中为了更好地绕过反爬机制,获取网页信息,有时可能需要在Python中应用代理服务,这样做的目的就是防止自己的ip被服务器封禁,造成程序运行时中断连接,那么如何在python中设置代理呢? 我们通过几个…

海思MPP音视频总结

基础篇 1.常用图像格式介绍 常用图像像素格式 RGB 和 YUV。 1.1RGB RGB分类通常指的是将图像或颜色按照RGB(红、绿、蓝)颜色空间进行分组或分类。RGB图像格式通常包括RGB24(RGB888)、RGB32、RGBA、RGB565等。 RGB24是一种常用…

预览 PDF 文档

引言 在现代Web应用中,文件预览功能是非常常见的需求之一。特别是在企业级应用中,用户经常需要查看各种类型的文件,如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…

Pycharm,2024最新版Pycharm现在安装环境配置汉化详细教程!

码(文末附带精品籽料): K384HW36OBeyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsIm…

【论文分享】TensorTEE 24‘ASPLOS

目录 AbstractIntroductionContribution BackgroundCollaborative ComputingLLM CPU-NPU collaborative computing Memory ProtectionMemory encryption Integrity verificationHeterogeneous NPU TEEIntegrated NPU TEEDiscrete NPU TEE Threat Model MotivationInefficient C…

力扣每日一题合集

3211. 生成不含相邻零的二进制字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<string> validStrings(int n) {vector<string> ans;ans.emplace_back("0");ans.emplace_back("1");for(int i 1; i < n; i)…

Vue3 中实现过渡动画的几种方式?

前言 首先抛开 vue 本身&#xff0c;假设需要给某个 Dom 元素实现一些过渡动画&#xff0c;那么下面这些事是必须的&#xff1a; 实现目标元素不同时刻下的样式&#xff0c;常见做法就是抽取在不同的 css 选择器中根据不同时刻切换不同的 css 选择器以达到样式的变化设置样式…

Linux 中,flock 对文件加锁

在Linux中&#xff0c;flock是一个用于对文件加锁的实用程序&#xff0c;它可以帮助协调多个进程对同一个文件的访问&#xff0c;避免出现数据不一致或冲突等问题。以下是对flock的详细介绍&#xff1a; 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

【华为HCIP实战课程二十七】中间到中间系统协议IS-IS Hello报文,网络工程师

一、IS-IS术语 1、IIH: ISIS hello 报文,相当于OSPF的Hello报文,hello-interval 10s, hold-time 30s 2、LSP:链路状态数据单元,类似OSPF的LSA,携带路由信息(L1和L2的LSP) 3、SNP:系列号PDU (1)、PSNP:部分序列号协议数据单元,类似OSPF的ACK,Request (2)、CSNP:…