学习Unet的一些过程
毕业设计的项目,需要用到手机作为控制端,这就需要用到Unity的网络模块。
因为只会设计到几个简单的按钮命令,所以不打算做多么复杂的功能,一开始打算用C#的Socket编程,但是考虑到多线程的关系觉得以后跟UI结合起来处理会比较麻烦,机智的我决定使用Unity提供的Unet网络模块。不需要太麻烦,只需要cs之间发送消息就行。
一开始我感觉自己掉进了一个坑,网上关于Unet的例子不要太少,而且很多都是基于多人游戏的。最无语的一点就是里面最牛的Commands和ClientRpc的远程调用命令以及各种变量同步只支持同一对象的不同实例间调用,简单点来说,就是客户端和服务器必须是同一个安装包,他俩只是打开方式不一样。但是我只是想做一个控制器作为客户端而已呀。但是我还是坚信,如此牛x的网络模块,肯定会支持我想要的这种傻x通信的。
我仔细看了Unity所有的关于Network的组件。最后将目标锁定在了NetworkManager上。接下来就是去看NetworkManager的API啦,果然,一拉下来我就知道没有错了

在Public Functions里存在许多On开头的方法,对Unity稍微熟悉一点的都知道以On开头的是Unity提供的回调函数,用于处理事件。同时也找到了StartClient、Host、Server这些方法。找到了常用的操纵方法和回调函数,接下来就是要找发送和接收消息的对象了。但是我没有丝毫头绪。我决定先将客户端和服务器连接成功再说。于是,我先引用到NetworkManager的对象,在手机端调用StartClient方法,在电脑端调用StartSever方法。发现二者能连接成功。
接下来就是处理一些连接事件了,在Scripting API文档里看NetworkManager类的Description。这里用一段简洁的代码清楚的介绍了如何使用这些连接事件

是的,只需要写一个类继承NetworkManager类。就可以很容易的重写回调函数,自定义连接事件了。何止爽歪歪。
然后我将原来添加的NetworkManager组件删掉,新建一个类并继承自NetworkManager。重写了一些需要用到的回调方法。完美搞定。
现在能连接成功,并且也能处理一些连接事件了,接下来就是cs之间收发消息了。根据经验,cs之间收发消息应该是依靠某种对象调用Send方法和Receive方法。继续查阅API发现有这么五个可能会用到的类NetworkServer、NetworkClient、NetworkReader、NetworkWriter、NetworkConnection。因为我在NetworkServer、NetworkClient、NetworkConnection都找到了与send有关的方法;而NetworkReader、NetworkWriter一看就知道是一个读一个写。但是却没有在NetworkServer、NetworkClient、NetworkConnection这三个类找到任何与Receive有关的方法,就觉得很奇怪。按理说有了NetworkReader、NetworkWriter就能实现我想要的功能了,但是我发现回调函数都会传递一个NetworkConnection对象,所以我还是希望直接使用NetworkConnection类,于是抛弃了Reader和Writer,把重点放在了NetworkConnection类。继续看API… 仔细查看了NetworkConnection的所以方法的介绍,发现有这么一个方法public void RegisterHandler(short msgType, Networking.NetworkMessageDelegate handler) 才意识到原来这里使用的是观察者模式。再进NetworkMessageDelegate看看这个委托的声明格式。我只需要自定义一个与NetworkMessageDelegate相同格式的方法。看看NetworkMessageDelegate的声明格式:
public delegate void NetworkMessageDelegate(Networking.NetworkMessage netMsg)。这里又涉及到了一个类: NetworkMessage,依稀中记得NetworkConnection的send方法也需要传递一个NetworkMessage对象。说明我的方向没有错,NetworkConnection的消息传递是通过NetworkMessage类来封装的。过程应该是非常明朗的。先构造一个NetworkMessage对象,将这个对象通过send发送出去,在另一端用注册的方法接收NetworkMessage对象,最后解析成自己需要的信息。那么接下来最后一步--了解NetworkMessage类,继续API…
接下来遇到一个比较棘手的问题—我找不到构造NetworkMessage对象的方法,API里没有提供构造函数,也没有找到任何有用的静态方法。打算将希望寄托到他的父类,在vs里双击选中NetworkMessage,F12转到定义。才发现他没有父类,简直握草了,似乎走进了死胡同。这时只有拿出终极武器了,百度一下… 直接搜索NetworkMessage。在这篇文章中找到了方法。仔细研究了一下,发现和我的思路几乎一样。
好了,最后来总结一下过程,先说服务器端:
1、 写一个Sever类,继承自NetworkManager。把这个类挂在一个空物体上,并在Inspector面板设置好参数
2、 写按钮点击一个事件,调用StartServer方法
3、 使用override关键字重写一些on开头的网络事件方法
4、 写一个sendMsg的方法,在方法体内调用NetworkConnection的send方法
5、 写一个public void XXX(NetworkMessage netMsg)这种声明方式的方法,处理收到的消息
6、 找一个合适的时机,调用NetworkConnection的RegisterHandler方法,将第五步定义的方法注册进来
客户端:
1、 写一个Client类,继承自NetworkManager。把这个类挂在一个空物体上,并在Inspector面板设置好参数(注意,客户端的NetworkAddress应该填写服务器端的IP,注意保持端口一致)
2、 写按钮点击一个事件,调用StartClient方法
3、 使用override关键字重写一些on开头的网络事件方法
4、 写一个sendMsg的方法,在方法体内调用NetworkConnection的send方法
5、 写一个public void XXX(NetworkMessage netMsg)这种声明方式的方法,处理收到的消息
6、 找一个合适的时机,调用NetworkConnection的RegisterHandler方法,将第五步定义的方法注册进来
学习Unet的一些过程的更多相关文章
- 学习 Git的使用过程
原文链接: http://www.cnblogs.com/NickQ/p/8882726.html 学习 Git的使用过程 初次使用 git config --global user.name &qu ...
- linux内核学习之六 进程创建过程学习
一 关于linux进程概念的补充 关于进程的基本概念这里不多说,把自己的学习所得作一些补充: 1. 在linux内核中,系统最多可以有64个进程同时存在. 2.linux进程包含的关键要素:一段可执行 ...
- 强化学习-MDP(马尔可夫决策过程)算法原理
1. 前言 前面的强化学习基础知识介绍了强化学习中的一些基本元素和整体概念.今天讲解强化学习里面最最基础的MDP(马尔可夫决策过程). 2. MDP定义 MDP是当前强化学习理论推导的基石,通过这套框 ...
- go微服务框架go-micro深度学习 rpc方法调用过程详解
摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取serv ...
- 1.1(java学习笔记) 面向过程与面向对象
面向过程思考时,我们会先思考具体的步骤,第一步走什么,第二步做什么. 比如电脑新建文件夹,第一步:打开电脑 第二步:按下鼠标右键. 第三步:找到新建选项 第四步:点击新建选项下的文件夹 c语言是典型的 ...
- 七天从零基础学习android(3)--实现过程
首先这是我对自己编写程序的认识,要实现一个程序,根据之前编写C++的经验,要对所编写的软件有一个模糊的了解. 一个记账本软件,要实现的过程是,添加收支,显示本日,本月或本年的收支状态.然而基于是完全没 ...
- RocketMQ事务消息学习及刨坑过程
一.背景 MQ组件是系统架构里必不可少的一门利器,设计层面可以降低系统耦合度,高并发场景又可以起到削峰填谷的作用,从单体应用到集群部署方案,再到现在的微服务架构,MQ凭借其优秀的性能和高可靠性,得到了 ...
- USB2.0协议学习笔记---USB工作过程(类的方法)
前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...
- 【Spring-web】RestTemplate源码学习——梳理内部实现过程
2016-12-28 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/6228198.html 提示:使用手机浏览时请注意,图多费流量. 本篇 ...
随机推荐
- Tomcat添加SSL安全认证
环境 Tomcat7.阿里SSL证书 server.xml <Connector port="443" protocol="org.apache.coyote.ht ...
- Bulma CSS框架教程
Bulma是一个轻量级的现代CSS框架,基于flex,跟bootstrap不一样纯CSS没有JS,与vuejs.reactjs这样JavaScript框架可以很好地集成. 为降低学习难度,让初学者可以 ...
- category添加属性
category添加属性 面试题 Category的实现原理,以及Category为什么只能加方法不能加属性. Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗 ...
- Linux预习第三章节《重定向与管道符》20200219
- HDU - 5586 Sum(区间增量最大)
题意:将数组A的部分区间值按照函数f(Ai)=(1890*Ai+143)mod10007修改值,区间长度可以为0,问该操作后数组A的最大值. 分析:先求出每个元素的增量,进而求出增量和.通过b[r]- ...
- 电动车智能充电桩温度报警方案:SI24R2F
由于现在电动自行车便捷不少民众的出行都选择这种交通工具出行,随着越来越多人都使用电动自行车,智能电动车充电桩的需求也在慢慢的变多,电动车智能充电桩的安全性也慢慢成为市场的焦点,对此SI24R ...
- 【LeetCode】验证二叉搜索树
[问题]给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是二叉搜 ...
- Win7 node多版本管理gnvm采坑记录
采坑描述:下载新node版本及切换node失败 解决:1.要用管理员权限启动cmd:2.确保node是空闲的 Gnvm下载地址: 32-bit | 64-bit Github 1.下载之后为 得到一个 ...
- php-fpm启动 关闭 重启
http://www.cnblogs.com/GaZeon/p/5421906.html 最近安装了mysqli扩展,重启了nginx后,phpinfo()没有显示出mysqli,后来搞不出原因,直接 ...
- Centos 7.4 DNS域名解析
1.安装部署包 yum -y install bind bind-utils bind-chroot 2.启动服务并设置开机自启动 [root@localhost ~]# systemctl star ...