3D-network
将巡逻兵小游戏改编成网络游戏
主要的任务是将之前的士兵追捕的游戏加上unity的网络部份。
原本是只有一个士兵和九个抓捕人,现在添加一个玩家士兵在里面,通过网络端口在同一个场景里面活动,分别逃脱追捕并显示玩家自己的状态
下面是未改动之前的动画效果:
修改方法:
布置好networkmanager等之后,运行build&run会得到下面的界面,一个士兵是host的,一个士兵是client的。
由于还没有网络同步所以两个士兵还是同步运动的,下面修改同步状态。
在userGUI类上修改,如下:
- 更新脚本以仅移动本地播放器
- 添加 “Using UnityEngine.Networking”
- 将 “MonoBehaviour” 更改为 “NetworkBehaviour”
- 在Update函数中添加一个 “isLocalPlayer” 检测,以便只有本地程序处理输入
上面将两个士兵加载了出来,两个端口可以分别控制对应的巡逻兵移动。
但是发现巡逻士兵不见了,于是在每个需要出现的游戏对象上面加上networkIdentity的属性,并且将其注册到 NetworkManager (用于服务器 Spawn)
![]()
![]()
上面将巡逻兵注册到了对应的networkmanager之后,按照教程将networkTransform添加到对应的prefabs里面并且在NetworkTransform 组件上将发送速率设置为零。子弹在射击后不会改变方向或速度,因此不需要发送移动更新。
![]()
加上之后效果如下:
整体的项目结构如下:
下面运行host以及client端,两个端口分别控制一个士兵,最终效果如下:
不足与反思
显然修改之前的项目并且加入网络服务并没有想象中的那么容易,由于之前的项目完全没有考虑到会有网络连接的问题,所以一些细节使得这一次的修改一波三折。
- 网络编程的要点是你首先了解当前代码在服务器上运行还是在本地运行,并远程调用。
- [Command] :本地玩家对象执行的代码,调用服务器执行的函数
- [ClientRpc] :服务器执行的代码,调用所有客户端执行函数
[SyncVar]:服务器授权变量,Spwan 自动同步到客户端
例如使用cmd的函数返回值需要时void,因为这是调用服务器来执行,因此不能够有其他返回值。
例如玩家状态以及得分需要用SyncVar来同步保持一致性
例如用[ClientRpc]确保对应函数在本地客户端执行回到本次的具体项目,对应的分析为:
- 生成巡逻兵需要在服务器上运行
- 场景构建在本地运行
- 玩家的移动也是在本地运行
- 而玩家状态与各自的得分则需要利用SyncVar来同步