Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数)

上篇   Unity3d 调用C++ DLL (Win平台)  介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中介绍了。


首先,在C#中是没有函数指针的,我们使用 Delegate 。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

我们来创建 DLL

在上篇的工程中修改。


Calculate.h

# define _DLLExport __declspec (dllexport) //标记为导出函数;

//定义函数指针;
typedef void (__stdcall *CPPCallback)(int tick);

extern "C" void _DLLExport SetCallback(CPPCallback callback);

extern "C" long long _DLLExport dlltest();

Calculate.cpp

#include "Calculate.h"



long long dlltest()
{
		long long a = 1;
		int b = 0;
		while(b<1000000000)
		{
			a=a+b;
			b++;
		}
		return a;
}

void SetCallback(CPPCallback callback)
{
	int tick=1223;
	callback(tick);
}

在DLL中定义函数SetCallback() 来设置回调函数。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

在Unity3d 中使用DLL

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

public class NewBehaviourScript : MonoBehaviour {

	[DllImport ("TestDLL")]
	private static extern long dlltest();

	[DllImport ("TestDLL")]
	private static extern void SetCallback(CSCallback callback);


	public delegate void CSCallback(int tick);
	static CSCallback callback;


	// Use this for initialization
	void Start () {
		callback = CSCallbackFuction;
	}


	static void CSCallbackFuction(int tick)
	{
		Debug.Log ("CSCallbackFuction "+tick.ToString());
	}
	

	void OnGUI()
	{
		if(GUI.Button(new Rect(100,100,200,200),"Test DLL"))
		{
			long before=System.DateTime.Now.Ticks;
			Debug.Log("dlltest="+ dlltest());
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}

		if(GUI.Button(new Rect(100,300,200,200),"SetCallback"))
		{
			long before=System.DateTime.Now.Ticks;
			SetCallback(callback);
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}
		
		if(GUI.Button(new Rect(300,300,200,200),"Test Mono"))
		{
			long before=System.DateTime.Now.Ticks;
			Debug.Log("monotest="+ monotest());
			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
		}
	}

	// Update is called once per frame
	void Update () {
	
	}

	long monotest()
	{
		long a = 1;
		int b = 0;
		while(b<1000000000)
		{
			a=a+b;
			b++;
		}
		return a;
	}
}
转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

运行成功

技术分享

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

示例工程下载:

http://pan.baidu.com/s/1jG499HW


转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。