[2019-04-06 17:17:54 最后更新]
[u3d][原创]Unity3d 中调用 dll 及 char * 参数以及 showmesage 的实现
今天本想调试一下 u3d ,没想到比我想像的要复杂一些. 步骤比较多,因此想用 messagebox.show 来调试下先算了. 不料 u3d (我的版本应该是 4.6 )下并不直接支持,要引入 .net sdk 的 System.Windows.Forms.dll 等等
才行. 据说有网友弄成功了,反正我是没有,心想干脆来个 dll 直接调用原生的好了. 结果很快弄好了,除了 char * 在 c# 中转换有点麻烦外一切都很顺利.
以下是实现方法:
1.生成的 dll 要放到项目的 Assets\Plugins 目录下,没有的话就手工建一个.
2.dll 中的函数默认是 stdcall 的,如果不是要加上 [DllImport("u3d_dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
这样的,而我的如下
[DllImport("u3d_dll")]
public static extern void show_message(ref byte s); //ok //调用方法
3.char * 的传递其实不太容易,有些教程直接用函数声明搞个 string 参数出来,我觉得还是应该使用数据本身的内容,因此花了不少时间去找转换方法,最后使用的就是
ref byte s ,在 c# 脚本中调用的方法类似于
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("ttt中文");
dll_functions.show_message(ref byteArray[0]); //ref s[0]
这里还要注意,u3d 默认传递的是 utf8 的字节流,我转换成 gbk,gb2312 都不行,估计时当时的 u3d 版本功能还不支持的缘故.
//byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ("ttt中文"); //中文不行
//byte[] byteArray = System.Text.Encoding.Default.GetBytes("ttt中文"); //u3d 下这样应该是 utf8
//byte[] byteArray = System.Text.Encoding.GetEncoding("utf-8").GetBytes("ttt中文"); //u3d 下这样应该是 utf8//同 Default
//byte[] byteArray = System.Text.Encoding.GetEncoding("gb2312").GetBytes("ttt中文"); //不行,gbk 也不行
4.我直接用的 delphi 的 showmessage 来实现,是可以阻塞住 update() 函数的.