位置: 编程技术 - 正文

unity的网络通信(unity网络通信插件)

编辑:rootadmin

推荐整理分享unity的网络通信(unity网络通信插件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity网络通信怎么搭建,unity网络通信框架,unity3d网络,unity 通信,unity网络通信怎么搭建,unity网络通讯,unity 网络通信,unity网络通信框架,内容如对您有帮助,希望把文章链接给更多的朋友!

(一)unity network初步

最新消息:在月2日的开发者大会上,我问了一下unity的人,会不会对网络层进行封装和改进,unity的人表示,最晚5.0,最快4.x版本里,就会加入新的网络通信接口,他们已经在测试阶段了。

翻了半天unity的API,也没有发现可以处理Socket的方法。Unity自己封了个网络处理的类Network,主要用于状态同步。 &#;乎是要实现MMO级别的网络应用,只能用C#自己去写了。(Unity不像AS,有直接处理数据包、字节级别的底层函数。至少现在没有。如果您要应用于实际,比如做了个网游,那么您需要用unity自带的C#去写一套自定义通信协议来实现。这个我在后面的文章中会写一个示例。)

我们还是先了解一下Unity,看看用Unity自带的组件,如何编写通信,从最简单的开始。

1,新建项目。新建一个项目里面会有一个摄像机。

2,编写服务器端代码cs:

[csharp] view plaincopyusing UnityEngine; using System.Collections; public class server : MonoBehaviour { int Port = ; //OnGUI方法,所有GUI的绘制都需要在这个方法中实现 void OnGUI(){ //Network.peerType是端类型的状态: //即disconnected, connecting, server 或 client四种 switch(Network.peerType){ //禁止客户端连接运行, 服务器未初始化 case NetworkPeerType.Disconnected: StartServer(); break; //运行于服务器端 case NetworkPeerType.Server: OnServer(); break; //运行于客户端 case NetworkPeerType.Client: break; //正在尝试连接到服务器 case NetworkPeerType.Connecting: break; } } void StartServer(){ //当用户点击按钮的时候为true if (GUILayout.Button("创建服务器")) { //初始化本机服务器端口,第一个参数就是本机接收多少连接 NetworkConnectionError error = Network.InitializeServer(,Port,false); Debug.Log("错误日志"&#;error); } } void OnServer(){ GUILayout.Label("服务端已经运行,等待客户端连接"); //Network.connections是所有连接的玩家, 数组[] //取客户端连接数. int length = Network.connections.Length; //按数组下标输出每个客户端的IP,Port for (int i=0; i<length; i&#;&#;) { GUILayout.Label("客户端"&#;i); GUILayout.Label("客户端ip"&#;Network.connections[i].ipAddress); GUILayout.Label("客户端端口"&#;Network.connections[i].port); } //当用户点击按钮的时候为true if (GUILayout.Button("断开服务器")){ Network.Disconnect(); } } /* 系统提供的方法,该方法只执行一次 */ // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } 3,把这个代码拖拽到摄像机上。

4,运行程序 File---->Build settings---->Build And Run,选择Web Player

5,服务器端建立完毕,保持服务器端的运行状态。

6,这里可以再新建立个项目写客户端。嫌麻烦也可以像我这样,先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

客户端代码如下:

[csharp] view plaincopyusing UnityEngine; using System.Collections; public class client : MonoBehaviour { //要连接的服务器地址 string IP = ".0.0.1"; //要连接的端口 int Port = ; void OnGUI(){ //端类型的状态 switch(Network.peerType){ //禁止客户端连接运行, 服务器未初始化 case NetworkPeerType.Disconnected: StartConnect(); break; //运行于服务器端 case NetworkPeerType.Server: break; //运行于客户端 case NetworkPeerType.Client: break; //正在尝试连接到服务器 case NetworkPeerType.Connecting: break; } } void StartConnect(){ if (GUILayout.Button("连接服务器")){ NetworkConnectionError error = Network.Connect(IP,Port); Debug.Log("连接状态"&#;error); } } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }

7,运行程序 File---->Build settings---->Build And Run,选择Web Player

(二)unity network聊天

在上一个例子基础上,我们构建一个聊天室程序。

1,首先建立一个新项目,文件夹名为chat。

2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

3,服务器端程序:(C# 脚本)

[csharp] view plaincopyusing UnityEngine; using System.Collections; public class server : MonoBehaviour { int Port = ; string Message = ""; //声明一个二维向量 Vector2 Sc; //OnGUI方法,所有GUI的绘制都需要在这个方法中实现 void OnGUI(){ //Network.peerType是端类型的状态: //即disconnected, connecting, server 或 client四种 switch(Network.peerType){ //禁止客户端连接运行, 服务器未初始化 case NetworkPeerType.Disconnected: StartServer(); break; //运行于服务器端 case NetworkPeerType.Server: OnServer(); break; //运行于客户端 case NetworkPeerType.Client: break; //正在尝试连接到服务器 case NetworkPeerType.Connecting: break; } } void StartServer(){ //当用户点击按钮的时候为true if (GUILayout.Button("创建服务器")) { //初始化本机服务器端口,第一个参数就是本机接收多少连接 NetworkConnectionError error = Network.InitializeServer(,Port,false); //连接状态 switch(error){ case NetworkConnectionError.NoError: break; default: Debug.Log("服务端错误"&#;error); break; } } } void OnServer(){ GUILayout.Label("服务端已经运行,等待客户端连接"); //Network.connections是所有连接的玩家, 数组[] //取客户端连接数. int length = Network.connections.Length; //按数组下标输出每个客户端的IP,Port for (int i=0; i<length; i&#;&#;) { GUILayout.Label("客户端"&#;i); GUILayout.Label("客户端ip"&#;Network.connections[i].ipAddress); GUILayout.Label("客户端端口"&#;Network.connections[i].port); GUILayout.Label("-------------------------------"); } //当用户点击按钮的时候为true if (GUILayout.Button("断开服务器")){ Network.Disconnect(); } //创建开始滚动视图 Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(),GUILayout.Height()); //绘制纹理, 显示内容 GUILayout.Box(Message); //结束滚动视图, 注意, 与开始滚动视图成对出现 GUILayout.EndScrollView(); } //接收请求的方法. 注意要在上面添加[RPC] [RPC] void ReciveMessage(string msg, NetworkMessageInfo info){ //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中 Message = "发送端"&#;info.sender &#;"消息"&#;msg; //&#;"时间"&#;info.timestamp &#;"网络视图"&#;info.networkView } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }

4,把脚本拖拽到主摄像机上,绑定。

5,运行程序 File---->Build settings---->Build And Run,选择Web Player

6,服务器端建立完毕,保持服务器端的运行状态。

7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

客户端代码:

[csharp] view plaincopyusing UnityEngine; using System.Collections; public class client : MonoBehaviour { //要连接的服务器地址 string IP = ".0.0.1"; //要连接的端口 int Port = ; //聊天信息 string Message = ""; //声明一个二维向量 Vector2 Sc; void OnGUI(){ //端类型的状态 switch(Network.peerType){ //禁止客户端连接运行, 服务器未初始化 case NetworkPeerType.Disconnected: StartConnect(); break; //运行于服务器端 case NetworkPeerType.Server: break; //运行于客户端 case NetworkPeerType.Client: OnClient(); break; //正在尝试连接到服务器 case NetworkPeerType.Connecting: break; } } void StartConnect(){ if (GUILayout.Button("连接服务器")){ NetworkConnectionError error = Network.Connect(IP,Port); //连接状态 switch(error){ case NetworkConnectionError.NoError: break; default: Debug.Log("客户端错误"&#;error); break; } } } void OnClient(){ //创建开始滚动视图 Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(),GUILayout.Height()); //绘制纹理, 显示内容 GUILayout.Box(Message); //文本框 Message = GUILayout.TextArea(Message); if (GUILayout.Button("发送")){ //发送给接收的函数, 模式为全部, 参数为信息 networkView.RPC("ReciveMessage", RPCMode.All, Message); } //结束滚动视图, 注意, 与开始滚动视图成对出现 GUILayout.EndScrollView(); } //接收请求的方法. 注意要在上面添加[RPC] [RPC] void ReciveMessage(string msg, NetworkMessageInfo info){ //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中 Message = "发送端"&#;info.sender &#;"消息"&#;msg; } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }

服务端运行状态:

unity的网络通信(unity网络通信插件)

客户端运行状态:

(三)unity network物体同步

在上两篇的基础上,这次我们要做物体同步。使两个物体在两个机器上显示同样的移动效果。这里,使用W、S、A、D四个键位实现前后左右的移动。

注意:如果您复制粘贴代码,千万注意文件编码!最好为ANSI,否则会报出各种各样奇怪的错误!

步骤:

1,首先建立一个新工程。

2,添加两个cube,分别重命名为Cube,和Cube。这两个cube就是我们要同步的对象。

3,添加一个平行光源,Directional light。否则你在漆黑的场景中,真的很难找到你的cube。

4,调整摄像机、cube、Directional light 的相对位置,使他们在视野内,可以看着它们运行。

5,create一个C#脚本cube_move,如下:

[csharp] view plaincopyusing UnityEngine; using System.Collections; public class cube_move : MonoBehaviour { string IP = "..1.6"; int Port = ; int moveSpeed = ; GameObject cube = null; GameObject cube = null; GameObject myself = null; GameObject another = null; // Use this for initialization void Start () { cube = GameObject.Find("Cube"); cube = GameObject.Find("Cube"); } //OnGUI方法,所有GUI的绘制都需要在这个方法中实现 void OnGUI(){ //Network.peerType是端类型的状态: //即disconnected, connecting, server 或 client四种 switch(Network.peerType){ //禁止客户端连接运行, 服务器未初始化 case NetworkPeerType.Disconnected: StartServer(); break; //运行于服务器端 case NetworkPeerType.Server: OnServer(); break; //运行于客户端 case NetworkPeerType.Client: break; //正在尝试连接到服务器 case NetworkPeerType.Connecting: break; } } void StartServer(){ GUILayout.Label("同步测试:"); //当用户点击按钮的时候为true if (GUILayout.Button("创建服务器")) { //初始化本机服务器端口,第一个参数就是本机接收多少连接 NetworkConnectionError error = Network.InitializeServer(,Port,false); //连接状态 switch(error){ case NetworkConnectionError.NoError: break; default: Debug.Log("服务端错误"&#;error); break; } } if (GUILayout.Button("连接服务器")){ NetworkConnectionError error = Network.Connect(IP,Port); //连接状态 switch(error){ case NetworkConnectionError.NoError: break; default: Debug.Log("客户端错误"&#;error); break; } } } void OnServer(){ GUILayout.Label("服务端已经运行,等待客户端连接"); //Network.connections是所有连接的玩家, 数组[] //取客户端连接数. int length = Network.connections.Length; //按数组下标输出每个客户端的IP,Port for (int i=0; i<length; i&#;&#;) { GUILayout.Label("客户端"&#;i); GUILayout.Label("客户端ip"&#;Network.connections[i].ipAddress); GUILayout.Label("客户端端口"&#;Network.connections[i].port); GUILayout.Label("-------------------------------"); } //当用户点击按钮的时候为true if (GUILayout.Button("断开服务器")){ Network.Disconnect(); } } //接收请求的方法. 注意要在上面添加[RPC] [RPC] void ProcessMove(string msg, NetworkMessageInfo info){ //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中 string sender = info.sender.ToString(); //看脚本运行在什么状态下 NetworkPeerType status = Network.peerType; if (status == NetworkPeerType.Server) { myself = cube; //假如运行在server状态下, 那么自己就是cube1 another = cube; } else { myself = cube; //假如运行在client状态下, 那么自己就是cube2 another = cube; } //假如是自己发送的信息 if (sender == "-1") { if (msg == "W") { myself.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); } if (msg == "S") { myself.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed); } if (msg == "A") { myself.transform.Translate(Vector3.left * Time.deltaTime * moveSpeed); } if (msg == "D") { myself.transform.Translate(Vector3.right * Time.deltaTime * moveSpeed); } } //假如是别人发送的信息 else { if (msg == "W") { another.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); } if (msg == "S") { another.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed); } if (msg == "A") { another.transform.Translate(Vector3.left * Time.deltaTime * moveSpeed); } if (msg == "D") { another.transform.Translate(Vector3.right * Time.deltaTime * moveSpeed); } } } // Update is called once per frame void Update () { //前移 if (Input.GetKeyDown(KeyCode.W)) { Debug.Log("wwwwwwwww|"); networkView.RPC("ProcessMove", RPCMode.All, "W"); } if (Input.GetKey(KeyCode.W)) { networkView.RPC("ProcessMove", RPCMode.All, "W"); } //后退 if (Input.GetKeyDown(KeyCode.S)) { Debug.Log("sssssssss!"); networkView.RPC("ProcessMove", RPCMode.All, "S"); } if (Input.GetKey(KeyCode.S)) { networkView.RPC("ProcessMove", RPCMode.All, "S"); } //向左移动 if (Input.GetKeyDown(KeyCode.A)) { networkView.RPC("ProcessMove", RPCMode.All, "A"); } if (Input.GetKey(KeyCode.A)) { networkView.RPC("ProcessMove", RPCMode.All, "A"); } //向右移动 if (Input.GetKeyDown(KeyCode.D)) { networkView.RPC("ProcessMove", RPCMode.All, "D"); } if (Input.GetKey(KeyCode.D)) { networkView.RPC("ProcessMove", RPCMode.All, "D"); } } }

6,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的这个脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

7,绑定脚本,把脚本拖拽到摄像机上。

8,编译发布成web的:File---->Build settings---->Build And Run,选择Web Player

9,拷贝编译出来的文件夹,到另一台机器上。

,分别在两台机器上运行服务器端和客户端。

你会看到同步的效果了。

附注:在一台机器上,不太容易看到效果。因为浏览器失焦后,&#;乎无法刷新画面,导致同步效果不明显。

Ps. 这个代码只是unity自带的网络组件示例。在实际应用中,不能直接应用。需要用unity底层支持的C#语言,重新写一套通信框架。我已经写了一套,但是没有时间发博客。改天发出来。

[置顶] unity3d中加密保存本地存档 unity中提供了PlayerPrefs来存储和读取本地的存档,根据unity的文档显示,很容易就能找到这些信息存储的位置而且是明文的,很容易就看懂了也可以修改,如何

扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method 在日常使用Unity3d中,经常碰到一些简单操作但是代码却很长的问题,比如变换一个GameObject的Y位置,会按照下面的写法:transform.localPosition=newVector3(transf

unity多点触控 //用于绑定参照物对象vartarget:Transform;//缩放系数vardistance=.0;//左右滑动移动速度varxSpeed=.0;varySpeed=.0;//缩放限制系数varyMinLimit=-;varyMaxLimit=;//摄像

标签: unity网络通信插件

本文链接地址:https://www.jiuchutong.com/biancheng/377227.html 转载请保留说明!

上一篇:Unity3D - 资源管理(unity资源文件)

下一篇:[置顶] unity3d中加密保存本地存档([置顶]电影名字《收件人不详》)

  • 小规模纳税人享受1%的税率
  • 企业成立多久能注销
  • 税金及附加要计入本年利润吗
  • 企业所得税纳税人
  • 清包工可以有一部分小料吗
  • 递延所得税资产和负债怎么理解
  • 盘亏的设备按正常报废处理是否符合会计制度要求
  • 政府单位临聘人员辞退
  • 保证金可以挪用吗
  • 个税系统如何升级到最新版本
  • 社保缴纳已超标准
  • 固定资产报废废铁收入需要交税吗
  • 航天金税交499
  • 企业外购消费品会计分录
  • 专票上的账号打错了
  • 个人社保部分工资计入哪个科目
  • 闲置资金的利息收益要冲减财务费用
  • 坏账准备年末结账要结清吗
  • 电子银行承兑汇票到期选择线上清算
  • 营改增劳务费增值税率
  • 长期股权投资核算的成本法与权益法的主要差别有哪些
  • 新会计准则下企业合并财务报表问题研究
  • 公户的利息收入账务处理咋处理
  • pvlsvr.exe - pvlsvr是什么进程 有什么用
  • 鸿蒙可以看小电影吗
  • 以产品对外投资需要进项税额转出吗
  • 本地连接没有了怎么恢复
  • 新制度下财政拨款是什么
  • 用应付票据付应付账款
  • 静电现象什么意思
  • php用在哪些方面
  • 人工智能讲解
  • 采购员出差预借差旅费
  • 利用php将图片转为文字
  • 可予税前扣除的合理部分
  • dns管理控制台在哪里
  • 进项发票和销项发票统计
  • 公司目前销售使用的物品
  • 如何填写个人所得税申报表
  • 往来款会计
  • 九步功法
  • 企业所得税营业收入怎么填
  • 企业投资一个小时多少钱
  • 企业内部研发支持方案
  • 减征增值税的会计科目
  • 季节性临时工什么意思
  • 企业所得税视同销售的会计处理是?
  • 转让旧固定资产怎么处理
  • 企业职工福利费使用范围和标准
  • 销售回扣能计入销售费用吗?
  • 开票后收不回来款怎么办
  • 应交税费减免税额在借方还是贷方
  • 外派国外的员工享受国内法定假期吗
  • 转账支票办理收款所要拿的单证
  • 软件开发的知识产权有哪些
  • 月底现金余额
  • 转出投资款计入现金流量表的哪里
  • 其他应付款的核算范围包括应付短期租赁
  • 收到投资款怎么做凭证
  • haozipsvc.exe是什么
  • win7 64位系统如何查看计算机名称为了应付某一操作
  • win8系统打开我的电脑就黑屏
  • xp系统安装流程图
  • linux系统中安装jar包没有
  • centos如何配置ip
  • win7系统笔记本怎么连接wifi
  • 如何提升windows版本
  • Linux mysql如何更改root密码以及忘记root密码的修改方法
  • win8 设置
  • Win10 Mobile RS1预览版14267.1004 修复Lumia 550充电问题
  • 浅谈特殊儿童的融合教育论文
  • opengl快速入门
  • Node.js中的construct
  • unity 3.0
  • python生成docx
  • python操作access数据库
  • 广西电子税务局手机版
  • 股权转让查账重点查什么
  • 小规模纳税人销售货物税率是多少
  • 没工作个人所得税怎么交
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设