为了使得Unity3D的程序在IOS下运行,需要做一些SDK接入工作:如访问IOS系统照相机、如调用微信支付、支付宝支付等,故需要先做接入IOS SDK的预研工作,本文整理一下自己的学习心得,总结如下:
Unity3D和IOS SDK交互,主要分2个步骤:
1 在Object C中,封装一个 extern “C”接口
2 然后,在C#通过 dllimport调用即可。
下面通过3个例子,来一一实践:
例子1: 获取最大数字
Object C封装-CWraper.h
extern "C"
{
int GetMax (int left, int right);}
Object C封装-CWraper.mm
int GetMax (int left, int right)
{
return left > right? left:right;
}
Unity3D 封装:
[DllImport ("__Internal")]
private static extern int GetMax (int left, int right);
例子2: 调用IOSAlert对话框
Object C封装:
extern "C"
{
const char* CallIOS_ALert(const char * msg);}
const char* CallIOS_ALert(const char * msg)
{NSString * nsMsg = [NSString stringWithUTF8String: msg];
UIAlertView *alert = [[UIAlertView alloc] init];
[alert setTitle:@"IOS程序世界"];
[alert setMessage:nsMsg];
[alert addButtonWithTitle:@"确定"];
[alert show];
return SafeStringBack("Main Camera");;
}
Unity3D 封装:
[DllImport ("__Internal")]
private static extern string CallIOS_ALert (string msg);
Object C的工具函数: Const Char* 和NSString转换的
//XCode的字符串转换为Unity字符串
const char* SafeStringBack(const char *inputMsg)
{
char* retC = (char*)malloc(strlen(inputMsg) + 1);
strcpy(retC, inputMsg);
return retC;
}const char* SafeStringBack(NSString *inputMsg)
{
return SafeStringBack([inputMsg UTF8String]);
}
例子3:Object C回调Unity3D
这里我们通过 UnitySendMessage来返回数据,稍微注意,字符串需要封装一下。
const char* obj = SafeStringBack("Main Camera");
const char* method = SafeStringBack("ShowXCodeMessage");
const char* varVal = SafeStringBack("this is xcode.");
UnitySendMessage(obj, method, varVal);
Unity3D中,需要有“Main Camera”的对象,以及有一个public的函数"ShowXCodeMessage"。
自此,预研的事情搞定了,则其余的接入IOS SDK,则是看各个官方demo、文档,然后估计工作量的事情了。
归纳:
Unity3D和IOS SDK交互,本质上上C#和Object C(C++)的PInvoke;源码层面的交互,相对Android的Jar包要简单一些—源码在手,了无秘密。
备注:
- Android的Unity3D交互博客链接: 《Unity3D项目实战笔记(4):Unity3D接入Android SDK》
- Object C如果编译不通过,请修改*.m文件为*.mm文件:Object C、C++混合编译方式
- 一般在Unity导出的XCode工程下,写IOS Plugins,代码写完才可以编译ok。