unity 5以后底层封装了一些network模块。比较有名的是unet 就是unityNetworkmanager,还是很强大的,用来做一些同步,联机小游戏还是很方便的,因为不需要我们自己再去搭建底层,只需挂载一些组件即可完成过同步。

研究unet的时候,意外发现另一套网络架构--networking。这个相比uent虽然需要我们自己去写更多脚本,但是相比之下,uent性能并不十分稳定,延迟也是比较高的。而networking更类似于我们自己对socket的封装,但是这些底层结构unity已经帮我们搭建,我们可以直接调用。不多说,结合例子开始讲解。

首先作为服务器端,我们可以直接打包,或者在unity上直接 开启服务器,更加直观不想之前只能做Windows窗口程序。

//协议类  数据结构
public class UserMsg : MessageBase
{public string SenderIP;public string message;public string type;
}
public class NetworkingMgr
{private  static NetworkingMgr instance = null;public static NetworkingMgr Instance{get{if (instance == null)instance = new NetworkingMgr();return instance;}}public bool connected=false;/// <summary>  /// 用户信息分类  /// </summary>  private const short userMsg = 64;public string Ip; //服务器IP/// <summary>/// 获取本机IP/// </summary>/// <returns></returns>private  static string GetInternalIP(){IPHostEntry host;string localIP = "?";host = Dns.GetHostEntry(Dns.GetHostName());foreach (IPAddress ip in host.AddressList){if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){localIP = ip.ToString();break;}}return localIP;}#region    服务器逻辑//玩家连接个数public int count = 0;private List<NetworkConnection> clients = new List<NetworkConnection>();//记录客户端/// <summary>/// 启动/// </summary>/// <param name="ip"></param>/// <param name="port"></param>public void SeverStart(string ip ,int port){if (!NetworkServer.active){if (ip == ""){ip = GetInternalIP();//默认本机做服务器}if (port == 0)port = 4455;Ip = GetInternalIP ();connected = NetworkServer.Listen(ip, port);Debug.Log("服务器启动状态:" + connected);if (connected)ServerRegisterHandler();}elseDebug.Log("服务器已经开启");}/// <summary>  /// 服务器端注册事件  /// </summary>  private void ServerRegisterHandler(){NetworkServer.RegisterHandler(MsgType.Connect, OnServerConnected);NetworkServer.RegisterHandler(MsgType.Disconnect, OnServerDisconnected);NetworkServer.RegisterHandler(MsgType.Error, OnServerError);NetworkServer.RegisterHandler(userMsg, ServerGet);//接受消息}//服务器接受到客户端信息private void ServerGet(NetworkMessage netMsg){UserMsg Msg = netMsg.ReadMessage<UserMsg>();Debug.Log("收到客户端信息:" + Msg.message);ServerSendAll(Msg);//for (int i = 0; i < clients .Count ; i++)//{//    SeverSendToClient(Msg, netMsg);//}}//服务器错误事件private void OnServerError(NetworkMessage netMsg){}//有客户端断开事件private void OnServerDisconnected(NetworkMessage netMsg){count--;clients.Remove(netMsg.conn);UserMsg msg = new UserMsg(){message = "掉线!",SenderIP = netMsg.conn.address,type = "OutLine",};ServerSendAll(msg);}// 有客户端登入时调用private void OnServerConnected(NetworkMessage msg){count++;clients.Add(msg.conn);Debug.Log("玩家登入:" + msg.conn .address);}//服务器广播public void ServerSendAll(UserMsg um){if (NetworkServer.active){if (NetworkServer.SendToAll(userMsg, um)){Debug.Log("Server send:" + um.message);}}}//发送给指定客户端public void SeverSendToClient(UserMsg um, NetworkMessage netMes){if (NetworkServer.active){Debug.Log("向客户端发送数据:" + um.message + " ---- " + DateTime.Now);NetworkServer.SendToClient(netMes.conn .connectionId  , userMsg, um);}}//停止服务器public void ShutdownServer(){if (NetworkServer.active){ServerUnregisterHandler();NetworkServer.DisconnectAll();NetworkServer.Shutdown();if (!NetworkServer.active){Debug.Log("shut down server");}}}//服务器注销事件private void ServerUnregisterHandler(){NetworkServer.UnregisterHandler(MsgType.Connect);NetworkServer.UnregisterHandler(MsgType.Disconnect);NetworkServer.UnregisterHandler(MsgType.Error);NetworkServer.UnregisterHandler(userMsg);}#endregion
}

以上只是一个简单是服务器端,当然,如果你想要更可视化,可以自己做些酷炫界面的。

然后是客户端

public class NetworkingMgr
{private  static NetworkingMgr instance = null;public static NetworkingMgr Instance{get{if (instance == null)instance = new NetworkingMgr();return instance;}}public bool connected=false;/// <summary>  /// 用户信息分类  /// </summary>  private const short userMsg = 64;public NetworkClient myClient;//本机客户端/// <summary>/// 做客户端 连接服务器/// </summary>/// <param name="ip"></param>/// <param name="port"></param>public void  Connected(string ip, int port,Action callback){if (ip == ""){ip = GetInternalIP();}if (port == 0)port = 4455;myClient = new NetworkClient();myClient.Connect(ip, port);myClient.RegisterHandler(MsgType.Connect, (netMsg) => {Ip = GetInternalIP ();connected = myClient.isConnected;Debug.Log("连接成功!!!");if (callback != null)callback.Invoke();});}//向服务器发送信息public void ClientSend(UserMsg um){if (myClient.isConnected){um.SenderIP = Ip;if (myClient.Send(userMsg, um)){Debug.Log("发送成功!!");}}}// 客户端注册事件  public  void ClientRegisterHandler(){connected = true;//myClient.RegisterHandler(MsgType.Connect, OnClientConnected);myClient.RegisterHandler(MsgType.Disconnect, OnClientDisconnected);myClient.RegisterHandler(MsgType.Error, OnClientError);//myClient.RegisterHandler(userMsg, ClientGet);}//客户端接受到服务器信息//private void ClientGet(NetworkMessage netMsg)//{//    UserMsg Msg = netMsg.ReadMessage<UserMsg>();//    Debug.Log("收到服务器信息:"+Msg.message);//}//客户端错误事件private void OnClientError(NetworkMessage netMsg){}//客户端冲服务器断开事件private void OnClientDisconnected(NetworkMessage netMsg){}//客户端连接到服务器事件//private void OnClientConnected(NetworkMessage netMsg)//{//    connected = myClient.isConnected;//    Debug.Log("连接成功!!!");//}// 停止客户端  public void ShutdownClient(){if (myClient.isConnected){ClientUnregisterHandler();myClient.Disconnect();//NetworkClient.Shutdown()使用后,无法再次连接。  //This should be done when a client is no longer going to be used.  //myClient.Shutdown ();  }}// 客户端注销事件  private void ClientUnregisterHandler(){myClient.UnregisterHandler(MsgType.Connect);myClient.UnregisterHandler(MsgType.Disconnect);myClient.UnregisterHandler(MsgType.Error);myClient.UnregisterHandler(userMsg);}

这些方法接口都是unity封装完成开放的,直接调用就行,启动一个服务器,一个客户端,测试,通过!!

若有问题欢迎咨询指正!!!.

demo下载地址:https://download.csdn.net/download/nt_xs_j/10502072

unity 网络 --NetWorking相关推荐

  1. Unity网络多玩家游戏开发教程第1章Unity自带网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说 ...

  2. Unity网络多玩家游戏开发教程(上册)

    Unity网络多玩家游戏开发教程(上册) 试读文档下载地址:http://pan.baidu.com/s/1jGwwxam Unity作为强大的游戏开发平台,为网络游戏的的开发提供大量的组件和API. ...

  3. Unity网络--HLAPI(2):Unity HLAPI NetworkManager与NetworkBehaviour的回调函数

    虽然当前的Unity游戏服务器模块即将被砍,不过作为当前最主流游戏引擎的一般性通用服务器架构,研究一下还是可以学习学习它的一些思想. Unity HLAPI既High Level API是相对于Low ...

  4. Unity 网络摄像设备 - WebCamDevice

    Unity 网络摄像设备 - WebCamDevice WebCamKind-摄像头类型 源代码 WebCamKind-摄像头类型 设备名称 name 一个可读的设备名称,不同的系统会有所不同 **相 ...

  5. unity网络实战开发(丛林战争)-正式开发阶段(013-游戏服务器端框架搭建)

    使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下游戏服务器端的开发. 01-项目目录结构 ...

  6. Unity网络斗地主 服务端

    Unity网络斗地主  服务端 @by梦想之家2工作室 阿龙 已经做好了服务器框架,并且能实现服务器给客户端分牌的问题! 转载于:https://www.cnblogs.com/alongu3d/p/ ...

  7. Unity 网络斗地主 牌的一些算法

    Unity 网络斗地主  牌的一些算法 在这儿说一下,我的项目是用svn的方式,上传在 https://v2.svnspot.com/18666451713.doudizhu这个svn上,大家可以下载 ...

  8. unity网络开发_介绍Unity开发人员网络

    unity网络开发 演示地址 As part of a larger plan, today we launch the first iteration of the Unity Developer ...

  9. Unity网络(二)-Unity3D中的网络

    正所谓:没有网络是没有灵魂的 欢迎关注公众号:雷潮课堂 Unity3D中的网络 一.WWW 1-1 Get 1-2 Post 1-3 案例(网络下载,本地存储与读取) 二.UnityWebReques ...

最新文章

  1. 源代码解读Cas实现单点登出(single sign out)功能实现原理
  2. Nginx负载均衡+tomcat+session共享
  3. Android开发学习之路-让注解帮你简化代码,彻底抛弃findViewById
  4. 中国学霸们被世界名校集体退学,原因竟然是……
  5. linux__ftp
  6. MongoDB基础使用
  7. C++const的多种用法
  8. Android学习指南
  9. 论文浅尝 | 融合多层次领域知识的分子图对比学习
  10. C++断言与静态断言
  11. Ubuntu学习日记--Lesson4:环境变量详解
  12. 在ASP.NET页面中添加确认对话框的方法
  13. bootstrap datetimepicker日期插件使用方法
  14. 2022年小红书活跃用户画像报告:7大行业核心人群解析
  15. 微信朋友圈评论功能测试
  16. 曲奇云盘资源搜索引擎_曲奇云盘下载-曲奇云盘官网版v3.2.4-sosyes
  17. 水星怎么设置网速最快_水星怎么设置路由器的网速
  18. MySQL初始密码获取
  19. 有哪些国外便宜虚拟主机适合个人建站呢
  20. java excel 插入新行_excel:插入行更新公式

热门文章

  1. VScode安装与python环境搭建
  2. Windows Server2012远程桌面服务配置和授权激活
  3. 自动化测试框架源代码,即可下载
  4. findwindow函数 vb 获取不到句柄_C/C++实战018:获取目录下的指定文件
  5. 机器学习之朴素贝叶斯 1
  6. IP网络存储iSCSI之一iSCS的概念、组成及工作原理
  7. 以太坊开发测试(6) 运行《区块链技术进阶与实战》Score 电子积分系统
  8. Java 8 Update 251 (8u251)
  9. 微信公众号的二次开发(二 自定义菜单的创建)
  10. Get苹果发布会的正确打开方式:外行看热闹,内行看门道!