iOS与Unity3d的交互实现
最近在公司写的项目是基于iOS与Unity3d的,之前也写了不少的iOS与Unity的项目,但是这次将两者结合开发还是第一次。项目的第一条功能需求就是:实现从iOS原生界面到Unity的跳转。
看似简单,但是却不知道怎么下手,修改Unity导出到iOS的封装好的代码是肯定的,但是至于改哪里,怎么改却是比较难。和一般的coding一样,一上来先是各种找解决方案和样例,不管是国内大神雨松momo的博客,还是墙外的社区都是搜刮了一番,运气挺好,在某岛国的博客中有人写了一种解决方案。链接戳这里:
https://github.com/mythosMatheWG/unityIntoIOSSample
这里提供的解决方案并没有给出完整的解释,原博主也只是一步步教你在哪里改代码,虽然能运行,但是却不知所以然。而且,这套解决方案有Bug,后来才知道:如果没有处理好ViewController与Unity之间的关系,会导致跳转到Unity之后出现如下错误:
opengles-error-0x0502
然后你的Unity界面内容就糊掉了==!
——继续找,在另外一篇帖子里面看到了比较完整的另外一种解决方案,链接戳这里:
http://game.ceeger.com/forum/read.php?tid=20533
这篇博客的教程就是在这两种解决方案的基础上进行的。旨在提供一套”你跟着做了就能够实现”的较为完整的解决方案。当然,前提是我们假设你会Unity,iOS的一些基础知识
开发环境
- xcode 7.2
- Unity4.6.3 (这个无所谓,因为build出来的OC代码没有太大变化)
开发语言
- OC
正餐
先让了解一下Unity build出来的iOS工程项目的整个框架以及运行流程
Main.mm作为整个项目的入口主要做了如下的事情
const char* AppControllerClassName = "UnityAppController";
int main(int argc, char* argv[])
{
NSAutoreleasePool* pool = [NSAutoreleasePool new];
UnityInitTrampoline();
if(!UnityParseCommandLine(argc, argv))
return -1;
#if INIT_SCRIPTING_BACKEND
InitializeScriptingBackend();
#endif
RegisterMonoModules();
NSLog(@"-> registered mono modules %p\n", &constsection);
RegisterFeatures();
// iOS terminates open sockets when an application enters background mode.
// The next write to any of such socket causes SIGPIPE signal being raised,
// even if the requ