UE5 用DLL文件制作第三方插件

news2024/11/25 10:50:15

本篇博文介绍了,如果在UE 中如何使用第三方库,及制作成插件的方法。
DLL 文件是上篇文章中创键的具体的方法见上篇文章。下面开始介绍方法
首先,创建一个空白的 UE5 C++ 项目,然后再创建一个空白内容的插件,如下图所示
在这里插入图片描述
在这里插入图片描述

修改UeWllApi.uplugin 里面的内容 如下图所示
在这里插入图片描述
在 插件的文件夹中 ,添加文件夹及DLL,LIB,.H 文件(注意具体的路径不要错否则可能插件制作不成功)如下图所示
首先在插件中添加一个ThridParty的文件夹(文件夹名字不要错)如下图所示
在这里插入图片描述
然后在ThridParty 内再添加一个文件夹(WllApi)如下图所示
在这里插入图片描述
然后在 WllApi 里面添加三个文件夹 bin,inc,lib(名字不要错)如下图所示
在这里插入图片描述
然后再bin ,lib,分别添加x64 文件夹 inc 里面添加WllApi 文件夹 如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后再bin ,lib,的x64文件夹下添加 Debug,Release 文件夹,然后在Debug,Release 里面添加对应的Dll ,lib文件,在inc 里面的WllApi文件夹下添加需要的头文件.如下图所示
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

在 插件的的Build.cs (UeWllApi.Build.cs)中添加以下代码

// Copyright Epic Games, Inc. All Rights Reserved.
using System.IO;
using UnrealBuildTool;

public class UeWllApi : ModuleRules
{
	public UeWllApi(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		
		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 ...	
				 "Projects"
            }
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
		LoadPlugins(Target);
	}
	public void LoadPlugins(ReadOnlyTargetRules Target)
	{
		bool bSupport = false;
		string BinPath = "", LibPath = "";//初始化BIN,LIB路径为空
		string PluginPath = Path.Combine("ThridParty", "WllApi");
		PrivateIncludePaths.Add(Path.Combine(PluginDirectory,PluginPath,"inc"));
		if(Target.Platform==UnrealTargetPlatform.Win64)
		{
			if(Target.Configuration==UnrealTargetConfiguration.Debug)
			{
				BinPath = Path.Combine(PluginPath, "bin", "x64", "Debug");
				LibPath = Path.Combine(PluginPath, "lib", "x64", "Debug");
			}
            else
            {
				BinPath = Path.Combine(PluginPath, "bin", "x64", "Release");
				LibPath = Path.Combine(PluginPath, "lib", "x64", "Release");
            }
			bSupport = true;
        }
		if(bSupport)
		{
			PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, LibPath, "FirstDll.lib"));
			PublicDelayLoadDLLs.Add("FirstDll.dll");
			RuntimeDependencies.Add(Path.Combine("$(PluginDir)", BinPath, "FirstDll.dll"));
		}

	}
}

还有要注意添加 “Projects” 模块
具体结果如下图所示
在这里插入图片描述

在UeWllApi.h中添加以下代码,如下图所示

public :
	static constexpr wchar_t* ModuleName{ L"UeWllApi" };//插件的名字
public:

	/** IModuleInterface implementation */
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
public:
	static FName GetModularFeatureName()
	{
		static FName FeatureName = FName(ModuleName);
		return FeatureName;
	}
	static inline IModuleInterface& Get()
	{
		return FModuleManager::LoadModuleChecked<IModuleInterface>(ModuleName);
	}
	static inline bool IsAvailable()//是否可以获得
	{
		return FModuleManager::Get().IsModuleLoaded(ModuleName);
	}
private:
	FString GetLibaryPath();
	void* LibraryHandle = nullptr;

在这里插入图片描述
在UeWllApi.cpp中添加以下代码,如下图所示

#include "UeWllApi.h"
#include"Misc/MessageDialog.h"//消息框头文件
#include "Interfaces/IPluginManager.h"//插件管理头文件
#define LOCTEXT_NAMESPACE "FUeWllApiModule"

void FUeWllApiModule::StartupModule()
{
	FString LibraryPath = GetLibaryPath();
	LibraryHandle = LibraryPath.IsEmpty() ? nullptr : FPlatformProcess::GetDllHandle(*LibraryPath);//当前的路径是否为空,不为空的话获取句柄
	if (!LibraryHandle)
	{
		FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("ThridPartyLibraryError", "Failed to load WllApi Library"));
	}
}

void FUeWllApiModule::ShutdownModule()
{
	FPlatformProcess::FreeDllHandle(LibraryHandle);//释放句柄
	LibraryHandle = nullptr;
}
FString FUeWllApiModule::GetLibaryPath()
{
	FString BaseDir = IPluginManager::Get().FindPlugin(ModuleName)->GetBaseDir();//寻找插件
	FString LibraryPath;
#if PLATFORM_WINDOWS
# if PLATFORM_64BITS
# if UE_BUILD_DEBUG
	LibraryPath = FPaths::Combine(*BaseDir, TEXT("ThridParty/WllApi/bin/x64/Debug/FirstDll.dll"));
#	else
	LibraryPath = FPaths::Combine(*BaseDir, TEXT("ThridParty/WllApi/bin/x64/Release/FirstDll.dll"));
#   endif
#  else
#	if UE_BUILD_DEBUG
	LibraryPath = FPaths::Combine(*BaseDir, TEXT("ThridParty/WllApi/bin/x86/Debug/FirstDll.dll"));
#	else
	LibraryPath = FPaths::Combine(*BaseDir, TEXT("ThridParty/WllApi/bin/x86/Release/FirstDll.dll"));
#   endif
# endif
#endif
	return LibraryPath;

}
#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FUeWllApiModule, UeWllApi)

在这里插入图片描述
添加C++类型的Blueprint Function Library,如下图所示,运行时是插件
在这里插入图片描述
在UeWllApiFunctionLibrary.h 添加以下代码,如下图所示

public:
	UFUNCTION(BlueprintCallable,Category="UeWllApi")
		static int GetSum();

在这里插入图片描述
在UeWllApiFunctionLibrary.cpp 添加以下代码 如图所示

int UUeWllApiFunctionLibrary::GetSum()
{
	return sum(3,4);
}

在这里插入图片描述
到此为止插件就制作完成了,只要打包调用就可以了,可以看到在本程序内可以调用结果也正确

在这里插入图片描述
在这里插入图片描述
打包出来,在其他程序调用也正确,结果如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

转义字符\

转义字符就是反斜杠想要实现的转义功能首字母。 为什么需要转义字符&#xff1f; 当字符串中包含反斜杠、单引号和双引号等有特殊用途的字符时&#xff0c;必须使用反斜杠对这些字符进行转义&#xff08;转换一个含义&#xff09; 反斜杠&#xff1a;\ 单引号&#xff1a;’ 双…

HCIA动态路由基础实验(eNSP)

实验题目及要求&#xff1a; IP配置&#xff1a; R1: <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int GigabitEthernet 0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.1 30 Jul 22 2023 13:07:24-08:00 r1 %%01IFNET/4/…

构建Web3生态系统:区块链技术与数字管理的融合

Web3技术是一种基于区块链技术的下一代互联网技术&#xff0c;它致力于实现去中心化、安全和透明的互联网世界。在Web3生态系统中&#xff0c;区块链技术是基础设施&#xff0c;而浏览器和数字管理是主要的应用场景。 区块链技术是Web3的核心&#xff0c;它是一种去中心化的分…

Spring更简单读取和存储对象

目录 前言 注解 存储Bean 通过类注解 配置扫描路径 添加类注解存储Bean对象 Controller(控制器存储) Service(服务存储) Repository(仓库存储) Component(组件存储) Configuration(配置存储) 类注解之间的关系 Bean的命名规则 通过方法注解 重命名Bean 方式一 方式…

【【51单片机 --秒表--定时器扫描按键数码管】】

轻松做秒表&#xff0c;谁用谁知道 我们在Key 和Nixie 内部都写一个函数这个是main 中中断函数的调用 因为中断是有优先级的&#xff0c;假设有多个中断&#xff0c;那么总是优先级高的在进行&#xff0c;如果我们安排多个中断的话&#xff0c;整体设计就会变得很麻烦 我们放在…

K8s系列---【K8s如何配置优雅停机?】

K8s如何配置优雅停机&#xff1f; 应用部署在k8s中&#xff0c;需要设置pod的优雅停机时间(terminationGracePeriodSeconds)&#xff0c;一般大于应用程序中spring.lifecycle.timeout-per-shutdown-phase设置的超时时间&#xff1b;设置之后服务更新或者重启时k8s会捕获到1号进…

2 push方法的使用(相当于python的append方法)

push方法相当于python的append方法&#xff0c;用来添加数组元素。 另外&#xff0c;数组取元素也是使用data[i]的格式。 例子&#xff1a; <script>var dataList [[1,2,3,4,5,6],[7,8,9,1,2,3]];var x dataList[0];console.log(x);dataList.push([1,1,2,3,4,5]);cons…

leetcode 47. 全排列 II

2023.7.23 这道题是上一题全排列 的一个升级版。 唯一区别就是需要增加一个树层去重的操作&#xff0c;因为数组nums中允许有重复的元素了&#xff0c;而上一题没有重复元素。 下面看代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<…

MySQL存储过程——概念及基本语法

1.什么时存储过程 2.存储过程操作语法 2.1 创建和调用 2.2 查看和删除 show create procedure p1;删除存储过程 drop procedure if exists p1;

Linux6.11 Docker 网络

文章目录 计算机系统5G云计算第四章 LINUX Docker 网络及Cgroup资源限制一、Docker 网络实现原理二、Docker 的网络模式1.网络模式详解1&#xff09;host模式2&#xff09;container模式3&#xff09;none模式4&#xff09;bridge模式5&#xff09;自定义网络 三、资源控制1.CP…

5.2 Bootstrap 过渡效果(Transition)插件

文章目录 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件使用案例 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件 过渡效果&#xff08;Transition&#xff09;插件提供了简单的过渡效果。 注意&#xff1a;如果您想要单独引用该插件的功能&#xff0…

如何在 Linux 中创建和使用别名命令

动动发财的小手&#xff0c;点个赞吧&#xff01; Linux 用户经常需要反复使用一个命令。一遍又一遍地键入或复制相同的命令会降低您的工作效率并分散您对应该做的事情的注意力。 您可以通过为最常用的命令创建别名来节省一些时间。别名就像自定义快捷方式&#xff0c;代表可以…

FM算法介绍

文章目录 1. 逻辑回归模型的不足2. POLY2模型——特征交叉的开始3. FM模型——隐向量特征交叉4. FFM模型——引入特征域的概念5. 从POLY2到FFM的模型演化过程6. 参考书籍 1. 逻辑回归模型的不足 逻辑回归作为一个基础模型&#xff0c;显然有其简单、直观、易用的特点。 但其局…

第二讲:MySQL安装及启动 Windows

目录 1.MySQL安装及启动2.MySQL常用命令&#xff1a; 1.MySQL安装及启动 1、官网下载 官网入口&#xff1a;官网 点击下载。 2、双击打开安装包 3、安装 4.设置密码&#xff08;随便设置能记住就行&#xff09; 5.配置环境变量 6、找到安装的MySQL路径&#xff0c;复制到上方…

经典CNN(二):ResNet50V2算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 论文解读 在《Identity Mappings in Deep Residual Networks》中&#xff0c;作者何凯明先生提出了一种新的残差单元&#xff0c;为区别原始…

MOS,PCB如何添加散热孔、过孔

一、什么是 PCB 散热孔&#xff1f; 散热孔是利用贯通PCB板的通道&#xff08;过孔&#xff09;使热量传导到背面来散热的手法&#xff0c;配置在发热体的正下方或尽可能靠近发热体。 散热孔是利用PCB板来提高表面贴装部件散热效果的一种方法&#xff0c;在结构上是在PCB板上…

element-ui里的el-table在grid布局下切换数据有滚动条时不断增加?

今天在项目里面遇到了这个问题&#xff0c;相当炸裂&#xff0c;看了半天都没有看出什么问题&#xff0c;很是逆天&#xff0c;记录一下 下面使用代码情景复现一下&#xff1a;el-table 是在 grid 布局下面的&#xff0c;不是子层级&#xff0c;中间还有一层 content 的元素包…

【数据结构】差分数组

【数据结构】差分数组 差分数组二维差分数组二维数组的前缀和 差分数组 如果给定一个包含1000万个元素的数组&#xff0c;同时假定会有频繁区间修改操作&#xff0c;但是不会有频繁的查询操作&#xff0c;比如对某个范围【l&#xff0c;r】内的数字加上某个数字&#xff0c;此时…

Java基础-->异常

什么是异常&#xff1f; 异常&#xff1a;异常就是代表程序出现的问题 误区&#xff1a;不是让我们以后不出现异常&#xff0c;而是程序出了异常之后该如何处理 Error 代表系统级别的错误&#xff08;属于原重问题&#xff09; 系统一旦出现问题&#xff0c;sun公司会把这些…

数据库应用:Mycat实现读写分离

目录 一、理论 1.Mycat 2.Mycat安装启动 3.Mycat搭建读写分离 4.垂直分库 5.水平分表 6.Mycat高可用 7.Mycat安全设置 8.Mycat监控工具 二、实验 1.Mycat读写分离 2.Mycat监控安装 三、问题 1.Mycat命令无法补全 2.Mycat启动失败 3.zookeeper启动报错 四、总结…