[ 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 卵生



相關文章

遊戲程式入門 #01 Start 與 Update 當我們在 Unity 中新增一個腳本 (Script) 時,程式碼中會待有預設的 Start( ) 與 Update( ) 函數,這兩個函數代表的涵義分別是「開始」與「每次更新」 嘗試加入以下程...
教學 #08 – 碰撞事件 Unity的碰撞事件與滑鼠點擊事件是差不多的撰寫方式,一樣是在腳本中打上函數名稱就能夠使用事件。 事件主要分成兩大類: OnCollision - 碰撞事件OnTrigger - 觸發事...
教學 #03 – 位置、旋轉、縮放 上一篇文提到了Transform以及基本的移動,但是沒有把Transform講清楚 在Transform中有三個最重要的資訊,分別是位置(Position)、旋轉(Rotation)、縮放(S...
教學 #07 – 碰撞器、觸發器、剛體(二)... ---Rigidbody - 剛體--- 想必第一次看到這詞的人一定會問:「剛體是什麼?」這東西不像碰撞器與觸發器那樣可以從字面上來解讀,想知道完整解釋的話可以查查維基百科。 大...