Object-c小知识:
在接入sdk过程中会遇到需要调用sdk方法
在oc语法中 分为+(void) 和-(void)两种方式
+(void)为类函数,可以直接调用,使用方法为:[类名 方法名:参数];
-(void)为成员函数,用C#的语法来说就是需要实例化类才能调用,使用方式为:
类名 * 定义名=[[类名 alloc] init];
[定义名 方法名:参数];
unity发送消息给ios:
在unity脚本中引用using System.Runtime.InteropServices;
需要使用到DllImport,其作用是提供从非托管DLL导出的函数的必要调用信息
写法格式为:
static:静态方法。(静态方法:不属于类的实例,而是属于类本身
extern:支持在外部实现方法。
[DllImport("__Internal")]
private static extern void _Method();
public void Method(){ _Method(); }
void Start ()
{
Method();
}
然后在ios使用object-c编写与unity交互,在头文件.h中 声明
@interface UnityMessage : NSObject
@end
然后把.m源文件后缀名更换为.mm文件,这样做的意义是让源文件可以包含c++格式的代码,在.mm源文件中书写格式为:
@implementation UnityMessage
extern "C"
{
void _Method()
{
NSLog(@"调用ios");
//TODO
}
}
@end
以上,在游戏运行时就会调用到在.mm源代码文件里的_Mehod()方法了
ios发送消息给unity:
在这里直接使用提供好的api就可以了UnitySendMessage,采用上面的例子
@implementation UnityMessage
extern "C"
{
void _Method()
{
NSLog(@"调用ios");
//TODO
UnitySendMessage("GameObject","test1","Value");
}
}
@end
参数一:是需要提供脚本挂载的物体名称,如果挂载在主摄像机上,那这里就填”Main Camera“。
参数二:这里需要注意,填写的是方法名,而不是类名,unity提供的这个SendMessage方法机制是根据提供的挂载体遍历需要调用的方法,保证方法名是唯一就行,这种方式在效率肯定是不怎么样的,不过好像传递消息只能通过这样·····
参数三:这是需要传递的参数,如果不需要传值就用”“就行。
其他:
unity传string类型参数,ios方面表现void _Method(char * s)
然后[NSString stringWithUTF8String:s]转化成object-c语法里的NSString类型。
字符串拼接传递:
NSString* User= [[NSString alloc]initWithFormat:@"%@,%@",userID,account];
UnitySendMessage("Object","GetUserMessage",[User UTF8String]);