Xcode&U3d相互通信类库的使用说明
最近两天实现了U3D和Xcode之前通过消息传递的代码,记录如下。
U3D 前期准备:
脚本文件:BaseGameEntity,EntityManager,NotificationCenter,NotificationCenterUpdateHelper
MessageHandle,XcodeMessager
JSON插件:在工程目录的Assets中新建Plugins目录,拷贝LitJson.dll到该目录
场景设置:在主场景中新建2个空GameObject,其中一个取名“MessageHandle”挂脚本“MessageHandle”
另一个随意取名,挂脚本“ NotificationCenterUpdateHelper”
接收Xcode消息:
1.脚本继承自BaseGameEntity,在Start或适合初始化的位置添加
NotificationCenter.DefaultCenter.AddOberver(this,"ChangeLevel");
2.重写基类的HandleMessage方法
例子代码:
public override bool HandleMessage (Telegram msg)
{
if(msg.Msg == "ChangeLevel")
{
Dictionary<string,object> dic = (Dictionary<string,object>)msg.ExtraInfo;
tmp = string.Format("name:{0},number:{1},bool:{2},array:{3}",dic["name"],dic["number"],dic["bool"],dic["array"]);
}
return base.HandleMessage (msg);
}
ChangeLevel是要订阅的Xcode发来的消息名字,对象销毁时在OnDestroy方法中执行DestroyEntity(),移除游戏对象管理器中的引用。
由Xcode发来消息所携带的参数保存在msg.ExtraInfo中,为一个Dictionary字典,参数名字和对应的值以键值对的形式存在。
参数支持的类型有:int,double,string,bool,Dictionary<string,object>(NSDictionary),ArrayList(NSArray)
发送消息到Xcode:
public void PostMessage(stringmessageName,params object[] args)
例子代码:
XcodeMessager.defaultMessager.PostMessage((string)dic["U3DMessageName"],"name",dic["name"],"number",dic["number"],"bool",dic["bool"],"array",dic["array"]);
第一个参数是消息的名字,之后的参数是消息所要传送参数名字和对应值的键值对
==========================================================================
XCode工程前期准备:
U3D导出XCode项目工程
加入类库:UnityMessageHandle.h/m, UnityMessager.h/m, UnityMessageSendHelper.h/m
Json工具类:JSONKit.h/m
在AppController中的OpenEAGL_UnityCallback方法中初始化类库:
[UnityMessageHandledefaultMessageHandle];//用于接收U3D发来的消息
[UnityMessageSendHelperdefaultHelper];//发送消息给U3D的辅助类
发送消息给U3D:
[[UnityMessagerdefautMessager]postMessageWithName:@"ChangeLevel"keysAndValues:@"name",@"andylee",@"number",[NSNumbernumberWithInt:100],@"bool",[NSNumbernumberWithBool:YES],@"array",array, nil];
接收U3D消息:
同一般的IOS通知中心使用方法
先订阅消息:
[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(messageHandle:) name:@"ChangeLevel"object:nil];
消息处理方法例子:
- (void)messageHandle:(NSNotification*)notification
{
NSDictionary* dic = (NSDictionary*)notification.object;//获取参数字典
NSString* str = [NSStringstringWithFormat:@"name:%@,number:%@,bool:%@,array:%@",[dic objectForKey:@"name"],[dic objectForKey:@"number"],[dic objectForKey:@"bool"],[dic objectForKey:@"array"]];
}
====================================================================================
小结:
通过使用IOS自带的通知中心和前段自己实现的在U3D下的简易通知中心,配合JSON的序列化功能,将U3D和XCDOE之前的相互调用充分解耦,而且克服了原始方法只能传递一个参数的弊端。