UE5.3 虚幻引擎 Windows插件开发打包(带源码插件打包、无源码插件打包)

0 引言

随着项目体量的增大,所有代码功能都放一起很难管理。所以有什么办法可以将大模块划分成一个个小模块吗。当然有,因为虚幻引擎本身就遇到过这个问题,他的解决办法就是使用插件的形式开发。

例如,一个团队开发了文件I/O模块插件,另一个团队开发了网络模块,那么大家各个模块可以统一的组合,那样虚幻引擎的功能就可以快速状态。

1 快速入门

1.1 新建插件的前提

创建插件之前,必须已经有一个UE C++的工程

1.2 创建插件步骤

  1. 打开【编辑】-【插件】面板
    在这里插入图片描述
  2. 点击左上角【添加】按钮,添加插件。选择空白插件模版,然后设置好插件名称等内容,进行创建。
    在这里插入图片描述
  3. 创建成功后的VS目录如下所示:
    每个文件的内容看文章的第三部分。
    在这里插入图片描述
  1. 打开【工具】栏新建C++类,父类选择【蓝图函数库】(相当于C++的全局函数,其他蓝图类可以直接使用)

在这里插入图片描述
在这里插入图片描述

  1. 选择新建C++类的位置,即是哪个模块的C++类。
    在这里插入图片描述
  1. 随后在 UGlobalFunction 类中添加一个静态函数 PrintNumer007(注意,一定要静态函数才行)
    在这里插入图片描述
  2. 这个函数要让蓝图使用需要添加对应的宏 UFUNCTION(BlueprintCallable)
    在这里插入图片描述
  1. 编译工程(生成解决方案),测试函数是否可以正常使用。随便在一个蓝图类中右键搜索函数名,可以搜索到就说明功能可以正常使用。
    在这里插入图片描述

此时插件的功能就制作完成,只需要打包插件即可。

1.3 打包插件

  1. 打包插件之间需要在插件的.uplugin做一些配置,确保WhitelistPlatforms是“Win32","Win64”,Type是“Runtime”。
    在这里插入图片描述
  1. 打开【编辑】-【插件】面板,点击【包】,进行插件打包。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 测试打包后的插件能否正常使用(注意:测试的工程一定要与插件编译的版本保持一致,即都是UE4.27版本或者UE5.0版本)
  1. 将Plugins目录直接拷贝到别的工程下即可
    测试的工程是纯蓝图工程或者C++工程都可以
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2 无源代码的插件制作

为什么可以不用源码:插件编译后生成了动态库文件,若是删除插件源码的话,就不能再进行编译。所以就不需要让插件编译,bUsePrecompiled = true; 就可以不让插件编译。(就和使用动态库一样,只需要保留头文件,还有动态库文件就可以让别人使用)

注意:无源码插件是在已经打包好插件的基础上,进行一些修改。然后再将程序给别人使用。

  1. 将打包后的插件Source文件夹中的Private文件夹删除
    在这里插入图片描述
  1. 需要修改.Build.cs文件内容
    在这里插入图片描述
  1. 得到了最终的文件目录,如下所示,我们只需要把插件目录下的文件拷贝到别的UE工程的Plugins文件夹下即可使用插件。
    在这里插入图片描述

3 插件详细介绍

3.1 插件的使用方法

插件有两种使用方法:

  1. 安装到引擎目录
    你可以将插件直接放到C:\Program Files\Epic Games\UE_5.0\Engine\Plugins\Marketplace目录下,也可以放到这个的上级目录。Marketplace目录一般存放的是虚幻商场中下载的插件,我也习惯将自己做的插件放到这个目录,看个人习惯了。
    在这里插入图片描述
  1. 安装到工程目录
    如果需要进行工程拷贝的话,将插件安装到工程目录中是最简单的,别人不需要再去引擎中配置一下你工程中的插件。而是可以直接把插件也拷贝过去。
    将插件放到工程的Plugins目录下即可,如果没有该目录则新建一个。
    在这里插入图片描述

3.1 UE 预置插件模版

在UE中新建插件时,有很多 UE 预置的插件模版,如下图所示:
在这里插入图片描述

3.1.1 空白
  • 使用极少量的代码创建一个空白插件
  • 如果想要从头开始设置,或创建一个不可见的插件,请选择此模版。用此模板创建的插件将会出现在编辑器的插件列表中,但不会注册任何按钮或菜单输入。

该模板创建出来,只包含下面这些最基本的文件。在这里插入图片描述

3.1.2 纯内容
  • 创建一个值包含内容的空白插件。
  • 这个模板创建出来是真正意义上的空白插件,什么都没有(一般不会用这个模板)。不会生成C++代码。
3.1.3 编辑器独立窗口
  • 创建一个插件,其将在关卡编辑器的工具栏中添加一个按钮;点击按钮可调出一个空白独立选项卡窗口
  • 该插件的代码,如下图所示:内容就多了许多,用于完成按钮点击事件,还有窗口调用等功能。
    在这里插入图片描述在这里插入图片描述
3.1.4 编辑器工具栏按钮
  • 创建一个插件,其将在关卡编辑器的工具栏中添加一个按钮。
  • 首先在创建的"OnButtonClick"事件中实现一些内容
  • 插件的代码如图所示:
    在这里插入图片描述在这里插入图片描述
3.1.5 编辑器模式
  • 创建一个将含有编辑器模式的插件。
  • 其将包含工具包范例,以指定出现在**“模式”选项卡**(在植物、地形等选项卡旁边)中的UI。其也将包含最基础的UI,展示编辑器交互和取消/回复功能的使用。
  • 插件的代码如图所示:可以发现代码量增多了。
  • 【注意】需要编译下插件再打开工程才能看见插件的UI。
    在这里插入图片描述在这里插入图片描述
3.1.6 第三方库
  • 创建一个使用已包含第三方库的插件。
  • 这可用作范例,展示如何自行包含、加载和使用第三方库
  • 该模版包括了一个测试用的三方库,然后还有如何使用该三方库的代码
    在这里插入图片描述
3.1.7 蓝图库
  • 创建一个含有蓝图函数库的插件。
  • 如果创建静态蓝图节点,请选择此模板
  • 代码结构如图所示:
    在这里插入图片描述

3.2 插件中文件的含义

  • 插件中包含许多文件夹和文件
    在这里插入图片描述
  • Binaries:编译后的dll文件存放位置
  • Content:游戏资源Asset文件存放位置
  • Intermediate:编译的中间文件存放位置
  • Resources:一般为图片图标的存放位置
  • Source:代码存放位置
  • .uplugin文件:插件项目配置文件,JSON格式
  • .Build.cs文件:每个 .build.cs 文件声明派生自 ModuleRules 基类的类,并设置属性控制器从构造函数进行编译的方式。由虚幻编译工具编译,并被构造来确定整体编译环境。使用 C# 语法。
  1. ***.uplugin文件详解
{"FileVersion": 3,"Version": 1,"VersionName": "1.0","FriendlyName": "HHW_PluginTest","Description": "TestPlugin","Category": "Other",				// 类目名即在插件浏览器中所属的类目"CreatedBy": "hhw","CreatedByURL": "","DocsURL": "","MarketplaceURL": "","SupportURL": "","CanContainContent": true,"IsBetaVersion": false,"IsExperimentalVersion": false,"Installed": false,					// 默认启用或禁用状态,在插件浏览器中可以控制加载卸载插件模块"Modules": [						// 描述模块名、运行类型、加载时机、支持平台等信息{"Name": "HHW_PluginTest","Type": "Runtime",			// 有多种:Runtime,RuntimeNoCommandlet,Developer,Editor,EditorNoCommandlet,Program"LoadingPhase": "Default","WhitelistPlatforms": [		// 支持的平台"Win32","Win64"]}]
}
  1. ***.Build.cs文件
// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class HHW_PluginTest : ModuleRules
{public HHW_PluginTest(ReadOnlyTargetRules Target) : base(Target){PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;// 将bUsePrecompiled设置为true后,就不会让插件编译//bUsePrecompiled = true;//PrecompileForTargets = PrecompileTargetsType.None;PublicIncludePaths.AddRange(new string[] {// ... add public include paths required here ...});PrivateIncludePaths.AddRange(new string[] {// ... add other private include paths required here ...});PublicDependencyModuleNames.AddRange(new string[]{"Core",// ... add other public dependencies that you statically link with here ...});PrivateDependencyModuleNames.AddRange(new string[]{"CoreUObject","Engine","Slate","SlateCore",// ... add private dependencies that you statically link with here ...	});DynamicallyLoadedModuleNames.AddRange(new string[]{// ... add any modules that your module loads dynamically here ...});}
}

4 插件开发常见问题

  1. 增删代码时,没有更新VistualStudio项目(uproject文件上右键点击Generate Vistual Studio project files可更新重载项目代码)
  2. .Build.cs 代码语法错误导致编译错误。
  3. .uplugin内容语法错误导致启动失败。
  4. 第三方库路径配置错误,导致引入失败,头文件找不到或者链接lib文件失败。
  5. 引擎版本与插件版本不一致导致插件模块丢失不能使用。
  6. 插件的"Installed": false,或者插件浏览器中没有启动插件,导致插件模块没有找到。
  7. 插件的Module下的"Type"配置与实际项目运行类型不一致。
  8. .插件的Module下的"LoadingPhase"配置与项目实际使用插件模块时机不一致,导致插件模块没有找到。

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

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

相关文章

自学记录鸿蒙API 13:实现多目标识别Object Detection

起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13&#xff09…

光伏安装在屋顶:安全、环保还是潜在威胁?

随着环保意识的增强和科技的进步,光伏发电作为一种可再生能源技术,正逐渐走进千家万户。然而,随着光伏板的普及,关于其在屋顶安装是否对人体有害的疑问也随之而来。 一、光伏发电的基本原理 光伏发电是利用半导体界面的光生伏特效…

被催更了,2025元旦源码继续免费送

“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…

MYsql--------ubantu中安装mysql

在Ubuntu平台上下载、启动和关闭MySQL的方法如下: 下载安装MySQL 更新软件包列表:打开终端,输入以下命令,确保软件包列表是最新的。sudo apt update安装MySQL服务器:执行以下命令安装MySQL服务器。在安装过程中&…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 import random import pygame WIND…

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项,在项目实施中,往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备,作为前端无线信号的覆盖。在具体安装无线AP过程中,我们必须要注意以下几点才能保证项目实施完…

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言,其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程,典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型,它通常以透明的文本或图片形式叠加在页面内容之上,为文档添加标识或信息提示。与传统的静态水印不同,水印注释并不会永久嵌入…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解,如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中,一个好的Logo是品牌身份的象征,它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间,尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来,让我们深入探讨如何利用这些工具来创…

游戏如何检测iOS越狱

不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下,视频联网平…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history,表示同时删除 IDEA 本地缓存以及历史。 Delete I…

计算机网络•自顶向下方法:路由选路算法

路由选路算法 在网络层中,选路是指数据包从源主机到目的主机的传输过程中,如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳,直到数据包到达目的地。 选路算法分类 静态算…

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…

【区块链】零知识证明基础概念详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…