Windows下Dll在Unity中使用的一般方式

news/2025/1/11 17:26:53/文章来源:https://www.cnblogs.com/curiositywang/p/18665918

Windows下Dll在Unity中使用的一般方式

Unity中虽然已经有广泛的库和插件,但是相较于C++的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C++函数打包成动态链接库在Unity中使用的一般方法。

环境

Visual Studio 2019 , Unity2022 , Windows11,OpenCV

说明

  1. Unity中有针对Windows 下DLL文件的自动加载机制,所以只要把打包好的动态链接库拷贝到 Assets/Plugins,然后在Unity脚本中进行注册便可以使用。
  2. 由于动态链接库本质上可以理解成一个插件,所以本次记录侧重 Unity和C++动态链接库函数的传参一致性问题

步骤

Visual Studio 2019

  1. 新建一个项目,在源文件中按照如下格式编写函数

​ 缩略版:

extern "C" {// 变量static bool isModelInitialized = false;__declspec(dllexport) int add( int width, int height) {return width + height;}}

​ Demo:

#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
//#include"opencv2/xfeatures2d.hpp"
#include "SFace.h"
#include "opencv2/dnn.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/video.hpp"
#include "face_detector.hpp"
#include <iostream>using namespace cv;
using namespace declass;extern "C" {// static bool isModelInitialized = false;static YOLOv8_face* fdModel = nullptr;static SFace* face_recognizer = nullptr;static Mat targetFeature;__declspec(dllexport) bool reGetStartFaceBox(unsigned char* pixelData, int width, int height, int* box) {return false;}__declspec(dllexport) bool getStartFaceFeature(unsigned char* pixelData, int width, int height) {return true;}// 释放资源的函数__declspec(dllexport) void Cleanup() {{delete fdModel;delete face_recognizer;fdModel = nullptr;face_recognizer = nullptr;isModelInitialized = false;}

extern "C" 是一种 C++ 中的语言链接约定,用于指示编译器以 C 的方式处理函数的名称修饰(name mangling)规则。

__declspec(dllexport) 是 Microsoft 编译器特有的一个声明符,用于声明某个函数、变量或类在 DLL(动态链接库)中导出,使得它可以被其他程序或库调用。

image-20250111170515174

之后进行编译,便可以得到一个dll文件。

Unity

接下来需要将动态链接库拷贝到Unity的Assets/Plugins目录:

image-20250111170709616

接下来我们新建一个脚本,在Unity中注册我们编写好的函数

 public class FaceRecongnize
{// faceRecong是dll文件名字,函数名和上面的demo是一致的。[DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]public static extern bool reGetStartFaceBox(IntPtr pixelData, int width, int height, int[] box);[DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]public static extern bool getStartFaceFeature(IntPtr pixelData, int width, int height);[DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]public static extern void Cleanup();}

至于参数,比如我想把一个纹理,或者一个数组传入到动态链接库中进行赋值,一般是用指针进行传送,比如上面的纹理数据和box,都是指针。

调用示例。

image-20250111171259391

PS:一个比较值得关注的点是,如果使用了第三方库,OpenCV,我们还需要把OpenCV相关的dll文件也拷贝到Assets/Plugins下,这是因为动态链接库之间也有一些依赖关系,我们需要把他们都导入进去。同时我建议如果要打包的话,因为可能跨设备运行,所以建议采用相对目录的方式,配置Visual Studio中的第三方库的依赖关系。

Refer

  • Mac下在Unity中调用C++库

  • 演练:创建和使用自己的动态链接库 (C++)

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

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

相关文章

C# WinForm 托盘程序

添加控件 将NotifyIcon和一个ContextMenuStrip控件。拖到主窗体中本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18665897

中考英语优秀范文-热点话题-传统文化-002 Spreading Traditional Chinese Culture 传播中国传统文化

1 写作要求 近日,在公共场所,人们身着汉服拍照,演奏古筝、二胡等传统乐器;校园里,学生吟诵古典诗词,写毛笔字……处处彰显着中国传统文化的魅力。你校英文报正在组织题为Spreading Traditional Chinese Culture 的征文活动,请你选择下表中的一种传统文化的形式,写一篇短…

Rider 报错 Error MSB4216 : 无法运行“GenerateResource”任务

Rider 打开设计器界面报错: rider Error MSB4216 : 无法运行“GenerateResource”任务,..... 打开设置,搜索 ms build另选一个版本试下发现可以了。

在 Rider 中使用 C# 创建 Windows 窗体应用 Winforms

1,创建项目 new solution 创建一个解决方案2,打开设计器 在 Form1.cs 上右键打开设计器认识一下 Rider 的界面参考微软官方的例子,添加如下属性:注:这里 Listbox 的大小设置成 120, 94 失败,默认的是 120, 89。可以将 DrawMode 改为 OwnerDrawVariable,就可以更改大小,…

BurpSuite实操之对比器功能使用

通常是通过一些相关的请求和响应得到两项数据的一个可视化“差异“,此功能主要用于执人行任意两个请求,响应或任何其他形式的数据之间的比较。使用的场合有:枚举用户名的过程,对比分析登录和失败时,服务器端返回结果的区别 使用Intruder进行攻击时,对于不同的服务器端响应…

Jmeter 的常用基础配置,看这一篇就够了 ~

在使用Jmeter工具时,因为一些默认的背景颜色、字体图标大小等,导致操作并不是非常便利,因此需要掌握一些必要的基础配置。📝 博主首页 : 「码上生花」 ,同名公众号 :「伤心的辣条」📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库…

SQL Server性能优化(3)使用SQL Server Profiler查询性能瓶颈

关于SQL Server Profiler的使用,网上已经有很多教程,比如这一篇文章:SQL Server Profiler:使用方法和指标说明。微软官方文档:https://msdn.microsoft.com/zh-cn/library/ms179428(v=sql.105).aspx有更详细的介绍。 经过使用Profiler进行监视,得到监视结果。============…

SQL Server性能优化(2)获取基本信息

以下常用的SQL语句有利于我们分析数据库的基本信息,然后根据查询的结果进行优化。 1. 查看索引碎片无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引…

【floorplan_mesh_project】运行Distributed package doesnt have NCCL built in处理

Distributed package doesnt have NCCL built in报错:修改E:\develop\anaconda3\envs\meshgpt\lib\site-packages\torch\distributed\distributed_c10d.py init_process_group,手动设置后端为gloo(第1116行)

[P3899 [湖南集训] 更为厉害]

P3899 [湖南集训] 更为厉害 [湖南集训] 更为厉害 题目描述 设 \(\text T\) 为一棵有根树,我们做如下的定义:设 \(a\) 和 \(b\) 为 \(\text T\) 中的两个不同节点。如果 \(a\) 是 \(b\) 的祖先,那么称“\(a\) 比 \(b\) 更为厉害”。 设 \(a\) 和 \(b\) 为 \(\text T\) 中的两…

BurpSuite实操之解码器功能使用

解码器是一个进行手动执行或对应用程序数据者智能解码编码的工具。此功能可用于解码数据找回原来的数据形式,或者进行编码和数据加密。由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成.。编码、解码选项,目前支持URL、HTML、Base64、ASCI、十六进制、八进制、二…

sqoop--官方首页

https://sqoop.apache.org/