**前言**
这两天在Unity官网学习了一下联网游戏的基础教程,接下来我梳理一下实验心得,以及拎一下注意点。如果有什么不对的地方,欢迎留言提醒。
辅助资料 -----> 官方网络游戏教程 、、、、官方网络手册指南
**实验笔记与心得**
1。首先我们要了解的一点是:一个联网的游戏分为服务器端和客户端。服务器端主要负责游戏数据的互联以及数据的处理,而客户端主要负责接收玩家的输入操作。因此,在unity的脚本编写中要十分注意什么时候在服务器端调用函数,什么时候要在客户端上调用函数。
2。所有的玩家对象都是有客户端同步到服务器端,再由服务器端同步到其他客户端的,只有非玩家的物体在只在服务器上生成并同步到其他客户端上的。事实上我们可以这么来举例:玩家的真身在自己所属的客户端上,他将自己的分身放在服务器端,接收数据的变更;而服务器端就像是一个控制中心把所有接收到的分身映射到其他客户端;而其他客户端玩家打的不过是另一个玩家的映像。但是玩家间的数据是怎么改变的呢?为什么“我”打了“他”,“他”真的掉血?其实,这些数据的交互都是在服务器端处理的,由服务器端统一更新到各个客户端,这样就实现了数据的集中处理。而非玩家物体的真身在服务器端。
3。在建立游戏的一开始,我们要创建一个空物体并命名绑上NetworkManager组件(这个组件是网络游戏的核心,它能让我们配置和控制很多网络相关的事情)
4。为了方便我们调试还要绑上一个NetworkManagerHUD组件(用户UI,这个后期可以自己改掉)。
5。物体要在网络中显示,要先注册network identity身份标识。注册了身份标识的物体要在network Manager中Spawn Info中登记。值得注意的是,如果选择了SERVER ONLY那么物体之后在服务器端生成,并不会传送到客户端。而选择Local Player Authority 则意味着这个物体将拥有本地权限,是玩家可以去操控的。
6。如果有移动必须添加 network Transform组件 。其中的Network Send Rate 表示移动更新频率,如果物体频繁移动的话可以适当调高些,相应调低。这样有助于游戏的良好体验以及性能的优化。
7.状态同步:游戏的数据添加[SyncVar]属性后会向服务器上更新数据信息。[SyncVar(hook = “ yourFunction”)]属性指的是在[SyncVar]数据发上变化时其勾连的函数将在客户端被调用执行,这样达到服务器数据向客户端传递的效果。值得注意的是,勾连函数传入的参数类型应该和[SyncVar]属性数据的类型相同。
8。 远程控制:具有[Command]属性的函数只能在客户端上调用并且在服务器端执行,并不具备向其他客户端更新消息的功能。通常用于向客户端物体施加命令。
9。客户端上任何产生的物体都要NetworkServer.Spawn(object) , 通知到服务器端。
10。远程控制:[ClientRpc]属性的函数只能在服务器端调用客户端上执行,这类似[SyncVar]勾连函数的作用,能够向所有客户端发送执行函数指令,达到所有客户端同步的效果。值得注意的是,在客户端上调用的函数中不能调用[SyncVar]属性的数据因为该数据是只在服务器端更新的。
11。控制本地玩家物体是要加if(!isLocalPlayer) return; 判断。否则所有绑定控制脚本的物体都会被移动。
12. OnStartLocalPlayer() 用于区别处理本地玩家的函数。
13. 删除和创建物体都应该在服务器端执行,不然会出现客户端上已经删除而服务器上还存在的现象。
14. NetworkStartPosition组件 可以给物体创建出生点。改变NetworkManager的Spawn Info 的Spawner Met之后NetworkManager会自动查找拥有NetworkStartPosition组件的物体,视为出生点。