unity 网络 --NetWorking
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相关推荐
- Unity网络多玩家游戏开发教程第1章Unity自带网络功能
Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说 ...
- Unity网络多玩家游戏开发教程(上册)
Unity网络多玩家游戏开发教程(上册) 试读文档下载地址:http://pan.baidu.com/s/1jGwwxam Unity作为强大的游戏开发平台,为网络游戏的的开发提供大量的组件和API. ...
- Unity网络--HLAPI(2):Unity HLAPI NetworkManager与NetworkBehaviour的回调函数
虽然当前的Unity游戏服务器模块即将被砍,不过作为当前最主流游戏引擎的一般性通用服务器架构,研究一下还是可以学习学习它的一些思想. Unity HLAPI既High Level API是相对于Low ...
- Unity 网络摄像设备 - WebCamDevice
Unity 网络摄像设备 - WebCamDevice WebCamKind-摄像头类型 源代码 WebCamKind-摄像头类型 设备名称 name 一个可读的设备名称,不同的系统会有所不同 **相 ...
- unity网络实战开发(丛林战争)-正式开发阶段(013-游戏服务器端框架搭建)
使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下游戏服务器端的开发. 01-项目目录结构 ...
- Unity网络斗地主 服务端
Unity网络斗地主 服务端 @by梦想之家2工作室 阿龙 已经做好了服务器框架,并且能实现服务器给客户端分牌的问题! 转载于:https://www.cnblogs.com/alongu3d/p/ ...
- Unity 网络斗地主 牌的一些算法
Unity 网络斗地主 牌的一些算法 在这儿说一下,我的项目是用svn的方式,上传在 https://v2.svnspot.com/18666451713.doudizhu这个svn上,大家可以下载 ...
- unity网络开发_介绍Unity开发人员网络
unity网络开发 演示地址 As part of a larger plan, today we launch the first iteration of the Unity Developer ...
- Unity网络(二)-Unity3D中的网络
正所谓:没有网络是没有灵魂的 欢迎关注公众号:雷潮课堂 Unity3D中的网络 一.WWW 1-1 Get 1-2 Post 1-3 案例(网络下载,本地存储与读取) 二.UnityWebReques ...
最新文章
- 源代码解读Cas实现单点登出(single sign out)功能实现原理
- Nginx负载均衡+tomcat+session共享
- Android开发学习之路-让注解帮你简化代码,彻底抛弃findViewById
- 中国学霸们被世界名校集体退学,原因竟然是……
- linux__ftp
- MongoDB基础使用
- C++const的多种用法
- Android学习指南
- 论文浅尝 | 融合多层次领域知识的分子图对比学习
- C++断言与静态断言
- Ubuntu学习日记--Lesson4:环境变量详解
- 在ASP.NET页面中添加确认对话框的方法
- bootstrap datetimepicker日期插件使用方法
- 2022年小红书活跃用户画像报告:7大行业核心人群解析
- 微信朋友圈评论功能测试
- 曲奇云盘资源搜索引擎_曲奇云盘下载-曲奇云盘官网版v3.2.4-sosyes
- 水星怎么设置网速最快_水星怎么设置路由器的网速
- MySQL初始密码获取
- 有哪些国外便宜虚拟主机适合个人建站呢
- java excel 插入新行_excel:插入行更新公式
热门文章
- VScode安装与python环境搭建
- Windows Server2012远程桌面服务配置和授权激活
- 自动化测试框架源代码,即可下载
- findwindow函数 vb 获取不到句柄_C/C++实战018:获取目录下的指定文件
- 机器学习之朴素贝叶斯 1
- IP网络存储iSCSI之一iSCS的概念、组成及工作原理
- 以太坊开发测试(6) 运行《区块链技术进阶与实战》Score 电子积分系统
- Java 8 Update 251 (8u251)
- 微信公众号的二次开发(二 自定义菜单的创建)
- Get苹果发布会的正确打开方式:外行看热闹,内行看门道!