本節講解,在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。
這樣就實現了,某一個客戶端人物復活後位置會同步到所有客戶端,即所有客戶端都可以看到,效果如下(下面是兩個客戶端運行):