本节讲解,在network里主角死亡之后复活,且同步到所有客户端的功能。
本文还是接着前几篇的network系列的文字来讲。所以代码也接着上一篇博文。
代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Networking;
public class health : NetworkBehaviour {
public const int maxhealth = 100;
[SyncVar (hook ="changevalue")]//同步变量,改变currenthealth的值。一直会调用changevalue方法。
public int currenthealth = maxhealth;
public Slider healthslider;
/// <summary>
///在Server端运行
/// </summary>
/// <param name="damage"></param>
public void Takedamage(int damage)
{
if (isServer == false)
{
return;
}
currenthealth -= damage;
if (currenthealth<=0)
{
currenthealth = maxhealth;
Rpcspawnnew();//满血复活到原点
}
}
/// <summary>
/// 该方法里需要定义一个参数,传入的参数就是上面定义的同步的currenthealth的值
/// </summary>
/// <param name="healthvalue"></param>
void changevalue(int healthvalue)
{
healthslider.value = healthvalue / (float)maxhealth;
}
/// <summary>
/// 所有客户端同步执行该方法
/// </summary>
[ClientRpc]
void Rpcspawnnew()
{
if (isLocalPlayer == false)
{
return;
}
transform.position = Vector3.zero;
}
}
此次代码所有修改的地方就是在当任务血量为零时,人物血量值变为最大(满血复活),又添加了一个Rpcspawnnew()方法。该方法是为了设置人物满血复活后的位置。
因为掉血代码是在服务器上执行,所以调用的Rpcspawnnew方法也只会在服务器端生效。
因此我们使用了[ClientRpc]标记,这个标记的作用就是让所有客户端执行该方法。语法规定:被[ClientRpc]标记的方法必须要以Rpc开头来命名方法,因此方法名为Rpcspawnnew。
这样就实现了,某一个客户端人物复活后位置会同步到所有客户端,即所有客户端都可以看到,效果如下(下面是两个客户端运行):