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之前的相互调用充分解耦,而且克服了原始方法只能传递一个参数的弊端。

posted on 2013-02-04 18:16  皮西博维  阅读(530)  评论(0编辑  收藏  举报