[Unity] unity可以编译出Dll吗?

查看:601 |回复:8 | 2021-4-9 09:01:44

您需要 登录 才可以下载或查看,没有账号?注册

x
unity可以编译出Dll吗?没有dll的化,很多功能无法实现,这比较尴尬了!
2021-4-9 09:01:44  
 赞 赞 0

使用道具 登录

8个回答,把该问题分享到群,邀请大神一起回答。
2#
unity可以引用任何C++和C#的dll库,但是你要说把自己写的脚本灌成dll这操作就有点奇葩,毕竟脚本总体在生成的时候,会灌在项目的CSharp.dll里面,当然独立编译某个模块是可以,但是总觉得这需求怪怪的
回复 收起回复
2021-4-9 09:12:32   回复
 赞 赞 5

使用道具 登录

3#
不能吧。
百度到这个https://zhuanlan.zhihu.com/p/37597928
回复 收起回复
Rushot : 你这个例子反而是证明了可以里面最后都说删掉了就可以用vs编译了~编译出来就是单独dll,直接在项目里引用了
2021-4-9 16:23 回复
qq_LXY_eeb : 好吧,反正也不太懂,我还以为底下图片是错误对比呢。。。。如果行,就当成参考学习吧
2021-4-9 16:25 回复
2021-4-9 14:59:13   回复
 赞 赞 3

使用道具 登录

4#
一,下载OpenCV并配置VS2017环境
网上很多教程,此处主要不是研究这个

二,创建DLL动态库
1、本文用的是vs2017,建立新项目”Dll1.dll”

2、在VS2017开发界面中,右键单击“解决方案”里面“Dll1”项目下的“头文件”目录,新建头文件“dll1.h”


3、Windows中,定义在dll中的变量、函数和类,如果希望让别的程序能够访问。必须通过manifest文件指定导出目标(变量、函数或类)或者通过_declspec(dllimport)关键字指定需要导出的目标,然后在使用dll的程序中通过_declspec(dllimport)关键字指定导入的目标。

本文使用_declspec()定义导出/导入目标是最方便的做法,因此,可以继续向“dll1项目”中添加一个头文件 “export.h”,然后添加自适应导出/导入目标的宏。

#pragma once

#ifndef EXPORT_H
#define EXPORT_H
#ifndef EXPORT_DLL
#define EXPORT_API __declspec(dllimport)
#else
#define EXPORT_API __declspec(dllexport)
#endif // !EXPORT_DLL
#endif // !EXPORT_H
4、鼠标选中DLL1项目右键“属性”,打开Dll1项目的属性页窗口;





在“预处理器定义”右侧的属性值中增加“EXPORT_DLL”。



5、打开 “dll1.h”文件,使用#include包含“export.h”头文件,然后使用EXPORT_API声明一个名为高斯模糊Gauss()的DLL导出函数。



#pragma once
#ifndef DLL1_H
#define DLL_H
#include "export.h"
//声明一个在控制台中输出的函数
extern        "C" EXPORT_API void Gauss();//高斯模糊
//EXPORT_API void Gauss();
#endif // !DLL1_H


这个地方要注意前面的extern“c”,如果没有就会导致后面在unity调用dll动态库的时候找不到文件入口,这是因为C++源代码中的函数在编译成DLL后,函数的名称就发生了改变,会在函数的前后产生一些字符,所以找不到方法的入口点。

还有一个叫EXESCOPE的反编译软件来查看C++编译后的函数名称是什么,但是这个软件英文版的在网上不太好找,中文版的还不行。所以采用extern“c”的方法。

6、最后是打开dll1.cpp文件,这里就是实现高斯模糊GaussianBlur的函数本体。

// Dll1.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
#include "dll1.h"
#include<opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include"opencv2/imgproc/imgproc.hpp"  
#include <stdio.h>
using namespace cv;
void Gauss()//引用的高斯模糊函数
{
        Mat src, dst;//初始化一个操作对象
        src = imread("C:/Users/JAY/Desktop/Others/tang.jpg");//读入图像

        namedWindow("加载的图片", WINDOW_AUTOSIZE);//原图窗口
        imshow("加载的图片", src);//""内命名一致,才能显示在一个窗口

        GaussianBlur(src, dst, Size(7, 7), 0, 0);//高斯模糊
        imshow("高斯模糊后的图片", dst);//显示结果

        waitKey(0);
}


7、生成解决方案,等待全部编译通过

三,创建控制台程序
由于DLL项目是无法独立运行的,所以为了测试DLL,需要创建控制台程序调用DLL。

1、右键单击左侧列表中“解决方案”,然后在弹出菜单中选择“添加 > 新建项目”,向解决方案中添加一个新的控制台项目。

2、将控制台项目设置为启动项目,这样每当运行程序时,启动的就是这个新创建的控制台项目

3、编写主函数main的内容,调用高斯模糊函数。

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include "pch.h"
//#include "stdafx.h"
//#include <stelib.h>
#include <iostream>
#include "F:\OneDrive\cs\Dll1\Dll1\dll1.h"//注意文件位置

int main()
{
        Gauss();//调用高斯模糊函数

        system("pause");
        return 0;
}


四,配置动态库
1、设置控制台项目ConsoleApplication1依赖Dll1项目。这样可以保证每次编译ConsoleApplication1时,编译器总会自动先编译Dll1项目,保证Dll1总是最新的。




2、打开控制台项目的属性页,在“附加库目录中”添加“$(OutDir)”


3、在“附加依赖项”中填入“dll1.lib”。告诉编译器需要链接dll1.lib,进而加载我们需要的“Dll1.dll”。



符号链接库“Dll1.lib”和动态链接库“Dll1.dll”。在另一个项目中加载“Dll1.dll”文件,那么通过链接“Dll1.lib”是最简便的方式。


4、生成解决方案,运行程序成功。



五,unity调用DLL动态库
1、新建unity项目,在Assets文件夹下新建插件文件夹“Plugins”,并将四.3文件夹下的动态链接库“Dll1.dll”导入。

2、在Assets文件夹下新建C#脚本“CsDll”。


using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CsDll : MonoBehaviour//注意和文件名命名一致
{

    [DllImport("Dll1")]//使用[DllImport("Dll名字")]指明要引用的DLL,然后声明要使用的DLL中的方法。
    private static extern void Gauss();

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void OnGUI()//按钮
    {
        if (GUILayout.Button("cs c++ dll"))
        {
            Gauss();
            Debug.Log("dll");
        }
    }
}
3、unity中的脚本文件必须要将脚本附着在某个物体上才能执行。点击脚本拖到MainCamera的Inspector下。



4、执行程序,显示结果。




回复 收起回复
2021-4-9 21:07:53   回复
 赞 赞 7

使用道具 登录

5#
这个做不到把
回复 收起回复
2021-4-22 11:04:42   回复
 赞 赞 1

使用道具 登录

6#
这个做不到把
回复 收起回复
2021-5-10 12:13:43   回复
 赞 赞 7

使用道具 登录

7#
应该不能吧,当然真大神说不定有办法
回复 收起回复
2021-5-11 22:18:35   回复
 赞 赞 7

使用道具 登录

8#
不是很懂 如果没有满意答案  建议去悬赏那边发布吧  应该很多人回答
回复 收起回复
2021-12-23 10:01:04   回复
 赞 赞 2

使用道具 登录

9#
元素是个好家园,加油啊
回复 收起回复
2022-11-3 18:20:50   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

求助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表