unity官方内置网络unet的实例教程(六)

客户端需要从服务取得数据来同步玩家的生命值和血条状态,这称为:Server Authority(服务器权限)为了实现本例的生命值同步我们需要引入同步变量[SyncVar] 。

打开Health脚本,引入UnityEngine.Networking命名空间,将继承关系改为:NetworkBehaviour,将currentHealth作为[SyncVar],具体脚本如下:


unity官方内置网络unet的实例教程(六)

保存脚本。回到Unity保存,重新生成游戏,进行测试,发现还同步还是有问题。现在是让SyncVar hook出场了,它可以将SyncVar与方法绑定,当SyncVar变化时,绑定的这些方法会在服务端和客户端进行同步。打开Health脚本,创建void OnChangeHealth (int currentHealth)函数,具体代码如下:


unity官方内置网络unet的实例教程(六)
health

现在当currentHealth的值发生变化时,OnChangeHealth (int currentHealth)方法将会在所有服务端和客户端进行更新。

保存脚本,回到Unity,重新生成并运行游戏进行测试。终于实现了生命值和血条的同步。下面进行这项改进:当玩家当前的生命值为为0的时候,玩家将被传送回到起始位置。这也将引入[ClientRpc],该属性是状态同步的方式之一。它在服务端上被调用,在客户端上执行,与Commands相反。

要将使用ClientRpc的方法调用,需要将“Rpc”添加为方法名的前缀。当在服务器上调用该方法时,此方法将在客户端上运行。它的参数将自动作为ClientRpc调用的一部分传递给客户端。

在Health脚本中创建一个newRespawn函数,并在玩家的当前生命值达到0时调用,最终脚本时这样的:


unity官方内置网络unet的实例教程(六)

在我们的教程里,客户端控制本地Player 的位置。这是因为Player享有对客户端的本地权限。服务器发送给所有的客户端将Client Player作为ClientRpc调用并移动到开始位置。因为Player具有NetworkTransform组件,所有客户端都会同步此位置。

保存脚本,回到Unity,保存,重新生成,进行测试,当一个角色的生命值为0时,这个角色在0,0,0点重生了,而且是满血。