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

UE4 手把手教你做插件(1) 从代码引用插件

0,前言

我看的是 技术宅阿棍儿 的视频,B站有。

系列视频:从代码引用插件_哔哩哔哩_bilibili

看不懂,只能边查资料边看,讲的顺序有点乱

1,根据视频提示创建第三方插件 

注意:如果只有空白插件的情况,需要你创建一个C++类,就能够看到很多插件类型了

具体看着:Creating New Plugins - non-content only - missing templates? - #3 by JollyTarkaVFX - C++ - Epic Developer Community Forums (将这个插件放在了ue引擎或者选择放在项目下面,建议后者)

2,创建游戏模式

可以参考以下文章,很简单,就看前面的两步就OK: (以下过程会让你的UE不断重启)

​​​​​​​UE4开发三:创建游戏模式、角色、控制器_mergerly的博客-CSDN博客_ue4玩家控制器游戏模式作用

然后你会拥有如下的文件结构:

新建工程下的目录:

介绍一下文件结构和调用关系是:

​​​​​​​第三方插件调用第三方库 

3,创建第三方插件的类:

(1)按照图上的步骤来:​​​​​​​

​​​​​​​

​​​​​​​

最后,打开vs,重启就行

4,第三方插件的代码修改 

(1)修改ThirdLibInvoker类的代码

ThirdLibInvoker.h

class MYTHIRDPLUGIN2_API UThirdLibInvoker : public UObject
{GENERATED_BODY()void* ExampleLibraryHandle;public:~UThirdLibInvoker();void InvokeLib();
};

ThirdLibInvoker.cpp

(这里其实是将MyThirdPlugin2.cpp的代码拷贝过来,憋看到就害怕了~)

// Fill out your copyright notice in the Description page of Project Settings.#include "ThirdLibInvoker.h"
#include "Core.h"
#include "Modules/ModuleManager.h"
#include "Interfaces/IPluginManager.h"
#include "MyThirdPlugin2Library/ExampleLibrary.h"UThirdLibInvoker::~UThirdLibInvoker()
{FPlatformProcess::FreeDllHandle(ExampleLibraryHandle);ExampleLibraryHandle = nullptr;
}void UThirdLibInvoker::InvokeLib()
{if (ExampleLibraryHandle == nullptr){// Get the base directory of this pluginFString BaseDir = IPluginManager::Get().FindPlugin("MyThirdPlugin2")->GetBaseDir();// Add on the relative location of the third party dll and load itFString LibraryPath;
#if PLATFORM_WINDOWSLibraryPath = FPaths::Combine(*BaseDir, TEXT("Binaries/ThirdParty/MyThirdPlugin2Library/Win64/ExampleLibrary.dll"));
#elif PLATFORM_MACLibraryPath = FPaths::Combine(*BaseDir, TEXT("Source/ThirdParty/MyThirdPlugin2Library/Mac/Release/libExampleLibrary.dylib"));
#elif PLATFORM_LINUXLibraryPath = FPaths::Combine(*BaseDir, TEXT("Binaries/ThirdParty/MyThirdPlugin2Library/Linux/x86_64-unknown-linux-gnu/libExampleLibrary.so"));
#endif // PLATFORM_WINDOWSExampleLibraryHandle = !LibraryPath.IsEmpty() ? FPlatformProcess::GetDllHandle(*LibraryPath) : nullptr;if (ExampleLibraryHandle){// Call the test function in the third party library that opens a message boxExampleLibraryFunction();}else{//FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("ThirdPartyLibraryError", "Failed to load example third party library"));}}}

  (2)修改MyThirdPlugin2的代码

MyThirdPlugin2.h

删掉:void * exemplexxxx(具体啥名字忘记了)

加上:class UThirdLibInvoker * Lib;

MyThirdPlugin2.cpp

void FMyThirdPlugin2Module::StartupModule()
{// 将这些代码复制到ThirdLibInvoker.cpp里面去Lib = NewObject<UThirdLibInvoker>();Lib->InvokeLib();}
void FMyThirdPlugin2Module::ShutdownModule()
{//删掉这里面的代码
}

(3)MyThirdPlugin2.Build.cs修改

添加CoreUObject

5,第三方库的代码修改 及其 编译方法

(1)ExampleLibrary.cpp代码修改

改一个你喜欢的弹窗吧~

EXAMPLELIBRARY_EXPORT void ExampleLibraryFunction()
{
#if defined _WIN32 || defined _WIN64MessageBox(NULL, TEXT("你成功调用了我(* ^ *)~"), TEXT("Third Party Plugin"), MB_OK);
#elseprintf("Loaded ExampleLibrary from Third Party Plugin sample");
#endif
}

(2) 编译方式

1,VS新建一个工程叫MyThirdLibPluginLibrary,我放在了这里:UE4_PluginAndSlate\Plugins\MyThirdPlugin2\Source\ThirdParty\MyThirdPlugin2Library\ExampleLibrary\MyThirdLibPluginLibrary

2,工程中添加ExampleLibrary.cpp, ExampleLibrary.h两个文件

3,修改MyThirdLibPluginLibrary工程属性(点击工程,右键选择属性):

    找到这两个文件的路径,修改输出目录为这两个文件的路径,如下图

然后点击右上角配置管理器,改为release:

4,将生成的dll拷贝到编辑器寻找的路径下面

我们可以看到ThirdLibInvoker.cpp代码里面是通过这句话来加载第三方库的,编辑器只会朝这个路径下寻找ExampleLibrary.dll,因此需要将新生成的ExampleLibrary.dll拷贝过去 

LibraryPath = FPaths::Combine(*BaseDir, TEXT("Binaries/ThirdParty/MyThirdPlugin2Library/Win64/ExampleLibrary.dll"));

 4,游戏模块的代码修改 

(1).cs代码统一修改

 UE4_PluginAndSlate.Build.cs

UE4_PluginAndSlate.Target.cs

UE4_PluginAndSlateEditor.Target.cs

 (2)MyGameModeBase

MyGameModeBase.h

添加beginplay函数

class UE4_PLUGINANDSLATE_API AMyGameModeBase : public AGameModeBase
{GENERATED_BODY()
protected:virtual void BeginPlay() override;
};

MyGameModeBase.cpp

void AMyGameModeBase::BeginPlay()
{Super::BeginPlay();UThirdLibInvoker* Lib = NewObject<UThirdLibInvoker>();Lib->InvokeLib();
}

5,设置世界场景运行游戏

设置游戏模式,并且运行

 

运行结果: 

 

相关文章:

UE4 手把手教你做插件(1) 从代码引用插件

0&#xff0c;前言 我看的是 技术宅阿棍儿 的视频&#xff0c;B站有。 系列视频&#xff1a;从代码引用插件_哔哩哔哩_bilibili 看不懂&#xff0c;只能边查资料边看&#xff0c;讲的顺序有点乱 1&#xff0c;根据视频提示创建第三方插件 注意&#xff1a;如果只有空白插件的情…...

【Mybatis源码解析】一级缓存和二级缓存源码解析

文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》&#xff0c;主要讲解了Mybatis的基本原理一级执行的流程&#xff0c;这一章来讲一下Mybatis的两个缓存&#xff1a;一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...

你知道MES实施的要点吗?

随着国家行动纲领&#xff1a;中国制造2025&#xff08;智能制造&#xff09;的发布&#xff0c;MES系统在制造业的工厂中所占比重越来越大&#xff0c;越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大&#xff0c;生产MES的厂…...

告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢

统计一张表的总数量&#xff0c;是我们开发中常有的业务需求&#xff0c;通常情况下&#xff0c;我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加&#xff0c;你会发现这条语句执行的速度越来越慢&#xff0c;为什么它会变慢呢&#xff1f; 为什…...

Redis 命令和Redis key键

Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作&#xff0c;而命令运行的方式是通过客户端命令行来执行的&#xff0c;这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令&#xff0c;您首先需要开启一个 Redis 客户端。操作方法如下&#xff1a; …...

如何入侵服务器

根据中华人民共和国刑法&#xff1a; 第二百八十六条违反国家规定&#xff0c;对计算机信息系统功能进行删除、修改、增加、干扰&#xff0c;造成计算机信息系统不能正常运行&#xff0c;后果严重的&#xff0c;处五年以下有期徒刑或者拘役&#xff1b;后果特别严重的&#xff…...

在Windows10上安装虚拟机---VMware 17 Pro下载与安装

在Windows10上安装虚拟机---VMware下载与安装0 前言1 下载VMware 17 pro2 安装VMware 17 Pro3. 打开Vmware0 前言 电脑原生系统&#xff1a;Windows10虚拟机软件&#xff1a;VMware 17 pro准备好安装虚拟机的文件夹路径 1 下载VMware 17 pro 下载网址&#xff1a;VMware 官网…...

生命周期函数、组件

1. 生命周期函数 beforeCreate &#xff1a; 无法通过 vm 访问data 中的数据、methods 中的方法created &#xff1a;可以访问 vm 中的 data 的数据&#xff0c; methods 中的方法beforeMount&#xff1a;为经 Vue 编译的 dommounted&#xff1a;经过 vue 编译的 dom &#x…...

蓝桥杯 stm32 PWM 测量频率

本文代码使用 HAL 库。 文章目录 前言一、PWM 原理图:二、CubeMX 创建工程:三、PWM 单路测频:四、详细代码:1. 获取 CNT函数。2. 设置CNT为 0 函数3. 开启TIM2_CH1的输入捕获中断函数4. TIM 回调函数5. 在 LCD 上显示 R40 和 R39 的频率。总结前言 一、PWM 原理图: 参考…...

Docker CPU 资源控制

01-本章背景知识 在生产环境里运行服务的一个主要问题是如何公平有效的进行资源分配。 1、Docker 容器使用核心操作系统的 Cgroups 管理容器的 CPU资源分配。 2、Docker 容器资源竞争时&#xff0c;默认使用简单均分&#xff08;CFS&#xff09;算法。 3、Docker 容器也可以根…...

小红书数据平台:笔记爆文率提升的三大秘诀公式!

导语 对于小红书商家 / 博主来说&#xff0c;写出爆文就像买彩票&#xff0c;根本不能预知哪一篇会爆。2023年&#xff0c;小红书哪些内容会脱颖而出呢&#xff1f;我们又该如何把握热点趋势&#xff0c;实现优质内容转化出爆文~ 美妆作为小红书的长红赛道&#xff0c;本文我…...

Spring MVC 之Tomcat启动流程

从web.xml说起在开始 Spring MVC 的分析之前&#xff0c;先来聊一聊 Java 初学者接触的最多的 Java Web 基础。还记得我的第一个 Web 工程是由 Servlet、Velocity 和 Filter 来完成的&#xff0c;那时几乎所有人都是根据 Servlet、JSP 和 Filter 来编写自己的第一个 Hello Worl…...

大疆车载更新产品矩阵,覆盖从主动安全到城区领航的全场景

新年智驾供应商的攻势&#xff0c;也像车企一样猛烈。大疆车载近期趁着官网更新&#xff0c;对外公布了梳理后的智驾方案序列&#xff0c;覆盖8大功能产品&#xff1a;主动安全、行车辅助、泊车辅助、记忆泊车、记忆行车、跨层记忆泊车、领航高速、领航城区。需要关注的是&…...

总结Anisble中的任务执行控制并练习

文章目录一、循环1.简单循环2.循环散列或字典列表二、条件三、触发器四、处理失败任务1.ignore_errors2.force_handlers3.changed_when4.failed_when5.block五、 练习建立大小为1500M名为/dev/sdb1的设备利用ansible循环安装且开启vsftpd&#xff0c;apache&#xff0c;dns&…...

PMP好考吗,有多大的价值?

关于PMP考试题型及考试内容&#xff0c;PMP考试共200道单选题&#xff0c;其中25道题不计分&#xff0c;会被随机抽查&#xff0c;答对106道题以上通过考试&#xff0c;参考比例106/175&#xff0c;60.57%估计答对&#xff08;10625&#xff09;道题及上即可通过&#xff0c;参…...

http常用状态码(204,304, 404, 504,502)含义

网络状态码含义&#xff0c;常用&#xff08;204&#xff0c;304, 404, 504&#xff0c;502&#xff09; 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 常见HTTP状态码大全 1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继…...

记录锁,间隙锁,插入意向锁,临键锁兼容关系

插入意向锁是什么&#xff1f; 注意&#xff01;插入意向锁名字里虽然有意向锁这三个字&#xff0c;但是它并不是意向锁&#xff0c;它属于行级锁&#xff0c;是一种特殊的间隙锁。 在MySQL的官方文档中有以下重要描述&#xff1a; An Insert intention lock is a type of gap…...

map相关接口(map接口、HashMap、LinkedHashMap、TreeMap)

Java知识点总结&#xff1a;想看的可以从这里进入 目录8.3、map结构8.3.1、 map接口8.3.2、HashMap8.3.3、LinkedHashMap8.3.4、TreeMap8.3、map结构 8.3.1、 map接口 map的集合是以键值对的形式存在的 (key-value)&#xff0c;每个键只能对应一个值&#xff0c;通常通过键去…...

抽象工厂模式(Abstract Factory Pattern)

1.抽象工厂模式定义: 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口&#xff0c;无需指定它们具体的类 2.抽象工厂模式适用场景: 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量…...

Linux驱动学习笔记

驱动学习笔记 1、字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中&#xff0c;这样当 Linux 内核启 动的时候就会自动运行驱动程序。 第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko)&#xff0c;在 Linux 内核启动以后使用“insmod”命…...

百川2-13B-4bits模型精调:解决OpenClaw复杂任务分解难题

百川2-13B-4bits模型精调&#xff1a;解决OpenClaw复杂任务分解难题 1. 问题背景&#xff1a;OpenClaw的复杂任务执行困境 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理一份市场调研报告时&#xff0c;遭遇了令人抓狂的体验。这个看似简单的任务需要完成网页数据…...

RPA工程化实践:三种核心设计模式让复杂流程优雅可控

一、为什么RPA需要设计模式&#xff1f; 在回答这个问题前&#xff0c;我们先看一个典型的复杂RPA场景&#xff1a;企业财务自动化需要从多个系统获取数据&#xff08;ERP、CRM、银行&#xff09;&#xff0c;经过清洗、验证、转换&#xff0c;然后生成报表并上传至OA系统&…...

大模型赋能金融底稿搜索:告别大海捞针,实现高效精准合规管理!

文章主要介绍了达观数据利用大模型技术升级其底稿搜索产品&#xff0c;为金融行业带来革命性的变化。传统底稿搜索存在关键词匹配局限、非结构化文件解析困难、溯源关联不便和合规风险高等问题。达观数据通过深度语义理解、全格式解析兼容、智能要素抽取、全链路溯源关联和开箱…...

Simulink整车控制器vcu应用层模型,实车在用的,支持仿真和生成 文件分类明确

Simulink整车控制器vcu应用层模型&#xff0c;实车在用的&#xff0c;支持仿真和生成 文件分类明确&#xff0c;每个普通功能和核心功能建有单独的库&#xff0c;存放在文件夹里。 有相应的表格&#xff0c;描述了信号的意思。搞汽车电子的兄弟都知道&#xff0c;整车控制器&am…...

PDF Arranger:开源PDF管理的终极解决方案,3分钟掌握高效文档处理技巧

PDF Arranger&#xff1a;开源PDF管理的终极解决方案&#xff0c;3分钟掌握高效文档处理技巧 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an intera…...

UE4.62生成sln时失败:Missing .../DotNET/UnrealBuildTool/UnrealBuildTool/UnrealBuildTool.exe

问题1&#xff1a; vs编译报错&#xff0c;以为是热加载&#xff0c;把项目的几个文件删了&#xff0c;想右键点击Generate Visual Studio Project Files重构&#xff0c;报错。 解决方法&#xff1a;: 是看m0_62179790这个博主解决的。 只要把下面这行东西添加到你自己的UE…...

2021年中国村级行政区划边界矢量数据|行政村 + 社区|全国60万+单元|SHP格式、WGS84坐标

&#x1f50d; 数据简介 本数据集 2021年左右的中国村级行政区划边界矢量数据。 总计 超60万个村级单元&#xff0c;是目前公开可获取的最精细、最权威的全国村级边界数据之一&#xff0c;适用于乡村振兴、基层治理、人口空间化、公共服务设施布局、学术研究等高精度需求场景。…...

编写程序让智能洗手液机检测手部靠近,自动出液,无需按压。

&#x1f9fc; 项目实战&#xff1a;基于红外测距的智能洗手液机控制系统一、实际应用场景描述 (Scenario)在机场、医院、办公楼等公共场所&#xff0c;传统的按压式洗手液机存在卫生隐患——每个人都需要接触同一个泵头&#xff0c;容易造成细菌交叉感染。目标&#xff1a;通过…...

GPStar Audio串口控制库:嵌入式多轨音频系统开发指南

1. GPStar Audio Serial Library 技术深度解析GPStar Audio Serial Library 是专为 GPStar Technologies 公司推出的 GPStar Audio 与 GPStar Audio XL 系列嵌入式音频播放器设计的串行通信控制库。该库并非通用音频驱动&#xff0c;而是针对特定硬件平台深度定制的、面向实时交…...

OpenClaw镜像体验报告:GLM-4.7-Flash云端部署3大优势

OpenClaw镜像体验报告&#xff1a;GLM-4.7-Flash云端部署3大优势 1. 为什么选择云端体验OpenClaw 上周我在本地笔记本上折腾OpenClaw时&#xff0c;经历了所有开发者都熟悉的"依赖地狱"——Node.js版本冲突、Python环境污染、系统权限问题接踵而至。当终于看到open…...