最近在做的游戏中涉及到了网络同步,尽管同步比较简单,仅仅有两个玩家同步,但是对于我这种第一次写网络同步的小白来说也是全新的一块东西啦。一开始我是用的Unity中自带的Network类,这里参考了https://blog.csdn.net/sumkee911/article/details/54908292这一篇文章,在网络多线程这一块写的感觉真的很不错了,可是在中期答辩的时候被助教指出TCP网络在游戏开发的网络同步中并没有较好的表现,具体主要就是因为连接慢,报头太大等等一系列的原因,反正我感觉就是不够快hahaha(具体请参考我写的另一篇博客喽)。所以助教老师推荐了我LiteNetLib这个开源库,说是可以提供可靠的UDP传输。所以我就下载来试了一试,结果自己找了半天也没找到教程,自己上Udemy花了70多买了一个小时的课hhhh,终于算是入门了,在这里记录一下自己的使用心得吧。(其实我感觉这个库用起来比Network类顺手很多,并且游戏跑起来确使不会出现卡死的情况,可是重写一遍真的还是很心塞滴hhhh)
首先请在git中下载这个库,我下载的是0.7.7.2,连接:https://github.com/RevenantX/LiteNetLib
下载了以后把这个安装包里边的LiteNetLib文件夹直接拖到Unity项目里边就行了,然后在脚本里边就可以直接using LiteNetLib就行了
要使用这个库,首先要实现一下一些运行中必须的接口,所以我们要先继承这个接口INetEventListener,然后显式实现他们就好啦
OnPeerDisconnected:当有peer断开连接的时候调用
OnPeerConnected:当有peer连接的时候调用
OnNetworkReceive:当接收到数据包的时候(很重要)
OnNetworkError:报错的时候
首先开启端口:
服务端: _serverNetManager = new NetManager(this, 10, "");
需要说明服务端最多可以连接多少个客户端,这里是10个
然后调用_serverNetManager.Start(_port)函数,就开启了服务端了
客户端:_clientNetManager = new NetManager(this, "");
简单粗暴,没有10就行了
同理调用_clientNetManager.Start()
然后客户端需要选择一个ip地址和端口号进行连接,就是自己的目标服务端的ip地址和端口号了:
_clientNetManager.Connect(_ip, _port);
然后应该就可以成功连上了
(本机127.0.0.1,这个学了计网肯定都知道)
还有一个要注意的是,需要在FixedUpdate里边每一帧调用_networkManager.PollEvents()函数,这样上边显式实现的接口才会被调用哦。
然后就是发送数据包了,我们可以在fixedupdate里边发送数据包,就是每一帧发送一次,我们首先需要定义一个NetDataWriter类型的dataWriter,这个东西会保存我们要发送的byte数组,首先调一下Reset函数_dataWriter.Reset();,重置一下这个NetDataWriter,然后我们就可以往里边放自己想要发送的东西了,可以是值类型的,比如int,float等等,或者也可以序列化一下想要发送的对象,然后都是调用_dataWriter.Put(***)函数,把自己要发送的东西put到这个NetDataWriter里边然后我们调用NetManager中的Send函数就可以发送了: _serverPeer.Send(_dataWriter, SendOptions.Sequenced);
接收数据包是在OnNetworkReceive函数里边,NetDataWriter里边封装了很多get函数,根据自己的需要在受到的reader里边get自己所需要的类型就行了
基本就是这么一个流程