1. 程式人生 > >Unity3D中使用C#呼叫C++編寫的DLL

Unity3D中使用C#呼叫C++編寫的DLL

前言

Unity3D是一款非常優秀的遊戲引擎,可以使用C#作為指令碼語言進行程式設計。但是有的時候我們需要執行一些第三方的程式,例如C++實現的一些演算法。我們需要將C++的程式碼以DLL的形式嵌入到Unity3D的程式中。這時候就要用到C#呼叫C++ DLL的方法。本文給出一個最簡單的呼叫方式,實現了一些簡單資料型別的傳遞。

1  C++中DLL的生成

在Windows平臺上,首先使用VisualStudio2013來建立一個C++的Win32控制檯應用程式。工程名設定為TestDLL。


在應用程式設定嚮導中,選擇應用程式型別為DLL。


由於我們使用的Unity3D分32位和64位,所以我們需要在配置管理器中設定與Unity一致的位數。我的Unity3D是64位的,所以我做了如下設定。


然後將下面的程式碼貼上到TestDll.cpp中。

#include "stdafx.h"

extern "C"_declspec(dllexport) void  fun0(int &a)
{
	a = 111;
}
extern "C"_declspec(dllexport) void  fun1(int *b)
{
	*b = 222;
}

extern "C"_declspec(dllexport) void  fun2(int c[])
{
	c[0] = 333;
}

extern "C"_declspec(dllexport) void  fun3(char *d)
{
	*d = 'B';
}


然後點選生成解決方案,就可以在“工程根目錄\x64\Release”路徑下看到生成的TestDll.dll。

2  在Unity3D中呼叫C++的DLL

建立一個新工程和一個新場景,並建立一個指令碼UseDll.cs。指令碼的內容如下:

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

public class UseDll : MonoBehaviour {

    [DllImport("TestDll")]
    private static extern void fun0(ref int a);
    [DllImport("TestDll")]
    private static extern void fun1(ref int b);
    [DllImport("TestDll")]
    private static extern void fun2(int[] c);
    [DllImport("TestDll")]
    private static extern void fun3(ref char d);

	void Start () {

        //初始化a、b、c、d 幾個資料
        int a = 0;
        int b = 0;
        int[] c=new int[5];
        for(int i=0;i<5;i++)
        {
            c[i] = -1;
        }
        char d = 'A';
        

        //呼叫dll中的函式,對資料進行修改
        fun0(ref a);
        Debug.Log(a);
        fun1(ref b);
        Debug.Log(b);
        fun2(c);
        Debug.Log(c[0]);
        fun3( ref d);
        Debug.Log(d);
	
	}

	void Update () {
	
	}
}


將這個指令碼繫結到攝像機上,並且要把上一步中生成的TestDll.dll拷貝一份放到“Unity工程根目錄\Assets\Plugins”目錄下。預設的時候Assets下是沒有Plugins資料夾的,需要自己建立。一切就緒後,可以執行程式,在控制檯顯示如下資訊,表示C#中初始化的資料已經在C++的DLL中被修改,即C#成功呼叫了C++的DLL。