APP联合Unity3D实战
内容提要
该文章介绍了在Unity中与iOS和Android进行代码交互的流程。首先,下载Unity无黑Logo版别和相关东西。然后,通过UnitySendMessage方法实现iOS和Unity之间的代码交互。接下来,介绍了在Unity工程中的代码实现和在原生Xcode工程中的代码实现。最后,讲解了在iOS和Android中集成Unity工程的步骤。
延伸解读
UnitySendMessage的线程限制与替代方案
文章指出UnitySendMessage方法要求目标类必须挂载在GameObject上,且原生回调可能不在Unity主线程,需手动切换线程。因此作者拒绝使用此方法,转而采用C#同名方法反射,通过DllImport导入外部函数,实现更灵活的交互。这种方案避免了线程问题,但需要确保C#与原生方法名一致。
iOS集成中的字符串内存管理要点
在Unity与iOS原生代码交互时,字符串传递需特别注意内存管理。文章强调,从原生返回C字符串给Unity时,必须使用strdup分配内存,否则可能导致闪退;而传入NSString时,需用stringWithUTF8String转换,直接传NSString会崩溃。这些细节是保证稳定交互的关键。
Android集成后的启动图标重复问题
将Unity库集成到原生Android项目后,应用可能出现两个启动图标。这是因为unityLibrary模块的AndroidManifest.xml中定义了额外的启动器入口。文章建议移除该入口,仅保留原生应用的启动配置,以确保应用只显示一个图标。这是集成后常见的配置修正步骤。
自动化脚本在iOS集成中的应用
文章提供了通过Ruby脚本自动化修改Xcode工程配置的方法,包括调整Data文件夹的target membership、将NativeCallProxy.h设为公开、以及添加UnityFramework到主工程并设置Embed & Sign。这些脚本能减少手动操作错误,提高集成效率,尤其适合需要频繁集成的场景。
Q&A
如何在Unity中与iOS进行代码交互?
可以使用UnitySendMessage方法实现iOS与Unity之间的代码交互,但需注意该方法的类必须挂载在一个game object上。
在Unity中如何实现与原生代码的交互?
通过C#同名方法反射和DllImport导入外部函数来实现与原生代码的交互。
如何将Unity工程集成到iOS项目中?
可以手动将Unity打包文件移动到iOS项目的unity3d目录下,并修正相关配置。
在Android中如何集成Unity项目?
需要下载和解压项目,生成Android渠道的Gradle项目,并将Unity Library模块增加到原生Android项目中。
使用UnitySendMessage方法时需要注意什么?
需要确保发送消息的类挂载在一个game object上,并注意线程问题,可能需要告知Unity主线程执行回调。
如何确保应用程序只显示一个启动图标?
需要去掉unityLibrary的AndroidManifest.xml中多余的入口定义,只保留原生Android应用所需的部分。