gameunity 3.0 (supersocket + lidgren + unity )
不知不觉 2.0版本 已经 用了3年多了,记得 当初开发这套框架 目的就是为了 更方便的 做unity ui 事件以及 服务器通信事件。
这次推出 3.0 版本,主要增加了 强链接 功能,因为我发现 现在的游戏 实时通信 非常重要,而tcp 通信虽然稳定,但 时差还是有半秒左右。改进后 ,利用udp方式 发送,时差在50毫秒左右。
很早就听说 udp 丢包问题,所以这次 集成了lidgren框架,该框架的主要特色就是 不丢包,而且还有组播功能,p2p功能 以及 upnp。简直就是 通信大全!
我们可以在 4g 手机上 任意 内网链接,不要担心 对称型 穿透问题,我们也可以 通过服务器转发。下面先看下截图
启动服务器 有2个,一个是 supersocket,一个是 lidgrenwin.
有人问,既然 lidgren这么好,为什么不直接用他。我的理解是,tcp 的好处就是 发送 大数据包,比如ui数据。
而 战斗中的实时数据 就用lidgren 来处理,这样 不至于 ui 数据并发多,而影响 了 战斗是 时效性。2个服务器可以两台电脑单独处理。
接下来 简单的 说下 代码,由于2.0 版本supersocket以及说了,这里只说明 lidgren的 前后台。
在unity中,多了一个 udpmodel类
void Update() { //通过队列,获得socket服务器数据 if (GameModel.getInstance().socketModel.JsonList.Count > 0) { JsonData mes = GameModel.getInstance().socketModel.JsonList.Dequeue(); // print("拿到数据"+mes.ToJson()); ;//拿到数据,处理 ,并删除队列 switch (mes.jsons["type"].ToString()) { case "1": OnDelegateEvent().callbackEvent(Protocol.TcpClientActionHandle, mes); break; case "2": OnDelegateEvent().callbackEvent(Protocol.ReceiveActionHandle, mes); break; case "3": OnDelegateEvent().callbackEvent(Protocol.TcpCloseActionHandle, mes); break; case "4": OnDelegateEvent().callbackEvent(Protocol.ErrorActionHandle, mes); break; default: break; } } // //通过队列,获得udp服务器数据 if (GameModel.getInstance().udpModel.JsonList.Count > 0) { JsonData message = GameModel.getInstance().udpModel.JsonList.Dequeue(); switch (message.jsons["type"].ToString()) { case "1": OnDelegateEvent().callbackEvent(Protocol.OrganizationAction, message);//组织 break; default: print(message.jsons["msg"].ToString()); break; } } }
和 之前的一样,添加 udp 接受到 消息的 事件处理。
//关闭 private void OnConnnetOnClick(GameObject obj) { GameModel.getInstance().udpModel.Shutdown(); } //服务器1发送 private void OnUdpbtnOnClick(GameObject obj) { GameModel.getInstance().udpModel.OnSendMessageUdp(1,msg.text); }
发送数据 和关闭 通信 也很方便
后台 主要关注这个类就好
class Classification { public void OnClassification(JsonData jsontext, NetServer s_server, NetIncomingMessage msg) { Output(jsontext.jsons["type"].ToString() + "-----" + jsontext.jsons["msg"].ToString() + ""); string type = jsontext.jsons["type"].ToString(); switch (type) { case "1": NetOutgoingMessage om = s_server.CreateMessage(); string json = JsonConvert.SerializeObject(jsontext); om.Write(json); s_server.SendMessage(om, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 0); break; default: break; } }
他目的是 收到事件 分配处理,内部 断线或链接等处理我都 处理好了,你只要 处理 消息来 的逻辑就可,你也可以在这里 再创建 几个类,事件多,这个类写的会太长。
好了,更多详细的 实例就不一一发了,再更新几天,3.1之后,我会给发链接,大家 试用吧