raknet for unity3d手机版的编译方法

在很久以前本人就发现了RAKNET,对比了几款开源网络库,发现RAKNET是一个不错的选择。RAKNET更适用于做游戏开发,但在我的手机点对点视频聊天项目里还是用了RAKNET.使用RAKNET做为中介服务器,手机P2P成功后还是使用RAKNET通讯。效果不错,视频语音不会丢包,很清晰流畅。当然在网络条件不好的情况下,可以设置RAKNET允许丢包,仍然能有不错的效果。
raknet的缺点是不支持组播,在视频更专业的librtp支持组播,但librtp的缺点也很明显,它不支持UDT,而且如果用RAKNET做服务器,在用librtp通讯,它们之间的接口也很占用时间。
废话已经说完,本人从业游戏开发已有四年,根据市场风向,几人合伙打算做一个手机版即时对战的游戏。重用raknet的机会来了。官网上看到raknet支持swig C#,也隐约在网上搜到说是支持unity3d的。这是真的吗?非也,官网上的raknet 它只能转换成windows下的C#接口使用,只要能转到C#,那它肯定就可以在windows下的UNITY使用。但如果换到ios、android、mac下就不能用了,为什么呢,因为它不支持。

还有,unity所说的它自带raknet,经过证实,MasterServer的底层是用raknet实现的,可以用C++ raknet开一个服务器,用MasterServer连接是能收到正确回应的,但MasterServer的底层用的raknet,它只封装提供给我瘊几个简单的接口,然后呢,想使用raknet办法还是有的,那就需要自己修改。

首先了解一下swig是什么,swig是一个代码生成工具,我们需要按照swig格式配置数据就可以生成我们想要的语言代码。

第一步,首先用raknet官网的方法生成C#代码,这个代码就是在windows 下unity直接可用的。可以确信的是raknet C# 所有的接口都是通过RakNet_wrap.cpp暴露出来。然后所有C#对raknet的调用,全部通过RakNetPINVOKE.cs来调用。可以查看RakNet_wrap文件,里面都是按照一种标准封装起来给外面调用,我们可以说这个标准就是swig的标准。对于这个标准,我们不需要知道它是什么,我们只要会按照这个标准修改RakNet_wrap里面的代码就可以。
我来解释在windows上C#使用raknet的过程:首先swig成生一个RakNet_wrap C++文件,然后用编译器把这个文件生成了动态库。然后C# 直接就可以调用这个动态库了。

既然有了源代码,所有问题都好说了,unity ios下调用C++的最简单的一种配置方法就是把C++源码直接拷到Plugins\IOS下,剩下的工作就是unity会生成xcode项目文件,然后我们在编译项目文件就可生成程序。

需要注意,我们要修改RakNet_wrap文件跟对应的RakNetPINVOKE.cs文件,所以用源码作插件的方式更利于我们修改。修改的时候我们直接在xocde上编译,xcode会有相应错误提示,然后我们修正提示,在编译。

直接指出,IOSC# 调用动态库与其它有所不同,必须改成  [DllImport("__Internal", EntryPoint="funname")],而安卓MAC需要 [DllImport("RakNet", EntryPoint="funname")],还有EntryPoint的名称必须要跟直接引用的名称相同,不然也会不能正常调用。

还有一个对unity工具的要求,unity必须是正版,或者破解正版,试用版是不支持插件的,所以也会有问题。

主要问题就这些,接下来我们可以根据提示,修改小小的问题。

下面附上代码地址。

https://git.oschina.net/no_this/client


//注意,这个问题本人花了好多时间研究解决,国内外都没有这样的解决方案,转载请注明出处。
//by 王小帅

猜你喜欢

转载自blog.csdn.net/no_this/article/details/39479421