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