序、uNet概述
uNet和uGUI一样都是Unity自带的模块。
Zhihu:uNet适合小型游戏和局域网游戏。大型多人游戏可以使用Photon服务器。
一、uNet基本组件
【Network Manager组件】
核心管理组件,进行网络连接。
属性:
Spawn Info:
-
Player Prefab:生成的玩家预制体。
-
Auto Create Player:是否自动生成玩家。
-
Player Spawn Method
random(随机)/round robin(轮询).
【Network Manager HUD组件】
显示Network Manager相关的UI。用于和NetworkManager交互和测试。
【Network Identity组件】
有Network Identity组件的GameObject即网络物体。
属性:
-
Server Only:(仅服务器)只在服务端创建。
-
Local Player Authority:(本地玩家授权)在每一个客户端创建。
-
isLocalPlayer:是否属于本地玩家。
【Network Start Position组件】
组件用于标识出生点。在Network Manager中选择Player Spawn Method.
【Network Transform组件】
负责将本地对象的Transform同步到其他客户端。
对于本地玩家授权的网络物体,只能从本地的对象同步到其他客户端,不能将非本地对象同步到其他客户端。
属性:
-
TransformSyncMode:如何同步对象的位置。
(SyncTransform-使用Transform进行同步。)
(SyncRigidBody-使用RigidBody组件进行同步。) -
Movement Threshold:设置 GameObject在没有发送移动同步更新时 能够移动的距离。
-
Snap Threshold:在某个地方设置一个阈值,如果一个移动更新将 GameObject放置到比当前位置更远的地方,那么 GameObject会快速移动到此位置而不是平滑移动。
-
Interpolate Movement Factor 使用它来启动和控制同步移动的插入。数字越大,GameObject插入到目标位置的速度就越快。如果设置为0,GameObject会直接到新的位置。
-
Rotation Axis 定义那个旋转轴应该同步。默认是 XYZ (full 3D)。
-
Interpolate Rotation Factor 使用它来启动和控制同步旋转的插入。数字越大,GameObject插入到目标旋转的速度就越快。设置为0,GameObject会直接到新的旋转。
二、NetworkBehaviour方法
(需要有NetworkIdentity组件)
public override void OnStartLocalPlayer()
:
该方法只在本地角色被创建时调用。可以在方法体中对本地玩家角色进行标识。
public override void OnStartServer()
:
启动服务端时触发。可以用于生成AI角色和网络物体。
三、同步玩家角色
添加NetworkIdentity组件和NetworkTransform组件,设置合适参数。
四、生成/同步其他网络物体
关于生成和同步:
使用[Command]
在服务端生成。
使用NetworkServer.Spawn()
将物体同步到所有客户端。
也需要添加NetworkTransform组件。(有时只需要同步一次即可,例如子弹等只需要在设置速度后同步一次刚体。)
添加到NetworkManager的Registered Spawnable Prefabs列表。
关于销毁:
服务端生成的网络物体,如果在服务端销毁会同步到所有客户端,如果在客户端销毁则不会影响到服务端。
所以建议在服务器销毁物体。
补充:应该在服务端进行重要计算
碰撞检测以及重要的数值计算应该放在服务端进行,防止出现问题。
然后给字段加上[SyncVar]
特性把数值同步到客户端。
注意事项:
对于远程客户端本地玩家授权的对象,服务端无授权,不能直接修改,需要使用远程过程调用。
补充:相关特性
[SyncVar]
:
用于实现变量同步。
可以使用[SyncVar(hook="OnChangedFoo")]
来设置值改变时的回调函数。该函数的参数为变量当前值。
[Command]
:
在客户端调用此方法,会在服务器上运行此方法。(必须以前缀”Cmd”开头)
[ClientRpc]
:
远程过程调用(Remote Process Call)。该方法在客户端调用。(必须以前缀”Rpc“开头)