[ UNet ] 基礎教學 #05 – ClientRpc 遠端呼叫客戶端

ClientRpc是與Command相對的功能,是由「Server」去要求「Client」執行,兩者的撰寫方式是差不多的,只需要在函式前加上[ClientRpc],不過函式名稱必須是「Rpc」開頭。

首先我先用粒子系統做了個簡單的特效,當作「扣血」的特效

在腳本中添加以下程式碼

public GameObject[] effectList;

並把剛剛的特效設定到effectList當中。

接下來撰寫以下程式

[ClientRpc]
void RpcPlayEffect(int index){
  //建立新物件並在五秒後刪除
  Destroy(Instantiate(effectList[index],transform.position,Quaternion.identity),5);
}

加在上一篇文章的Unit之下,完整的程式碼會像這樣:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Networking;
using UnityEngine.UI;

public class Unit : NetworkBehaviour {
  public float maxHP = 50;

  public GameObject[] effectList;
  public Text uiText;
  [SyncVar]
  private float hp;
  
  // Use this for initialization
  void Start () {
    hp = maxHP;
  }
  
  // Update is called once per frame
  void Update () {
    if (isServer)
    {
      if (hp < maxHP)
      {
        hp += Time.deltaTime * 5;
      }else{
        hp = maxHP;
      }
    }

    uiText.text = "HP:" + ((int)hp).ToString();
  }

  void OnMouseDown(){
    CmdSetHp(0);
  }
  [Command]
  void CmdSetHp(float newHp){
    hp = newHp;
    RpcPlayEffect(0);
  }

  [ClientRpc]
  void RpcPlayEffect(int index){
    Destroy(Instantiate(effectList[index],transform.position,Quaternion.identity),5);
  }
}

 

實際執行的畫面如下:

 

使用RPC要求客戶端執行有很多實用的地方,例如這個「撥放特效」,很多項目不需要Server自己一一去清點他全部都做到同步,特效、音效等等的只需要發送簡單的訊息讓Client端知道,Client端自己去執行就可以了。

 

[ UNet ] 基礎教學 #06 – Spawn 卵生

Leave a Comment