开发概览:非托管插件开发(Native/Unmanaged Plugin)
Unity是基于Microsoft .Net Framework开发的游戏引擎2,它采用了开源的.NET Platform,并依赖此框架来实现跨硬件设备和运行时(操作系统)的目标,也是所谓的”Write once, run anywhere”。在语言方面,Unity选择C#作为主要的脚本编程语言,虽然.NET平台本身支持的语言有很多种。
进一步,Unity支持Mono和ILC2PP两种脚本框架(Scripting Backends)。特别的,Unity Editor采用的是Mono脚本框架。
一般的,游戏类库开发者可以选择直接用C#语言开发,目标类库可以实现基于.NETFramework基础功能之上的高级功能,这类插件称之为ManagedPlugin(托管插件)。由于环信IM核心SDK已经基于C++开发,因此我们选择另一种NativePlugin(本地插件)的方式,正是它把我们引向了迷宫之旅。两种类型的Plugin介绍,参见3。
不幸的是,Unity网站上关于NativePlugin的相关介绍少只又少,想要了解它的具体细节还要去参考MicrosoftMSDN文档。作为中规中矩的文档介绍,微软的文档是合格的,但是,当你真正上手编程时就会发现,这些远远不够:下面记录的一些坑点就很难在相应的文档中得到直接的提示;而要通过Google大法,结合其他程序员留下的蛛丝马迹,再加上自己不断的调试来最终确认。
在微软文档上下文中,Unity Native Plugin有个另外的名字:Unmanaged Plugin,即非托管插件。简单来讲,Managed Plugin生存在.NET Framework的运行时环境(类似于Java的JVM),而Unmanaged Plugin则生存在这个运行时环境之外,也即和运行时环境是兄弟的关系。如果你原本的类库实现满足微软的COM(Component Object Model)规范,那自然最好是使用COM Interop4的互操作方式;而环信IM SDK本身是纯C++实现,因此采用了Platform Invoke5(简称P/Invoke)方式,本文剩下的内容均是基于P/Invoke。