[ UNet ] 基礎教學 #03 – SyncVar 資料同步

標籤: , , , , ,

SyncVar是UNet中處理資料同步非常好用的功能,他的概念是「自動將Server變動的值同步至Client」,有了這個簡潔的功能我們才能快速建立起多人連線遊戲。

首先可以參考這段程式碼:

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

using UnityEngine.Networking;
using UnityEngine.UI;

public class Unit : NetworkBehaviour {
  public float maxHP = 50;
  public Text uiText;
  [SyncVar]
  private float hp;
  
  void Start () {
    hp = maxHP;
  }
  
  void Update () {
    if (isServer)
    {
      if (hp < maxHP)
      {
        hp += Time.deltaTime * 5;
      }else{
        hp = maxHP;
      }
    }

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

  void OnMouseDown(){
    hp = 0;
  }
}

 

這段程式的功能是:當hp小於最大值時,每秒回復5點hp,並顯示在UI上

而當玩家用滑鼠點擊角色 時,hp會直接歸0

 

大家可以參考一下圖片,就不詳細說明了

在輸出後運行會是這個樣子

 

實際在Server端與Client端用滑鼠點擊角色,會發現一個狀況

「Server」HP歸0後兩邊畫面顯示的一樣

「Client」HP歸0後不會增加,另一邊數值也沒變

先說明一下Client端為什麼歸0後不會增加,這是因為在計算HP時加上了if ( isServer ) 讓遊戲邏輯只會在Server端做運算。

 

然而點擊後Server端不會歸0,是由於SyncVar只會將「Server」的值同步至「Clinet」(Server ->Client)

如果想要讓Client端做出的反應可以在Server顯現,必須透過「Command」命令Server處理函式,這部分留在下一篇在做介紹。

 

雖然SyncVar方便但他也不是萬能的,能夠自動同步的資料型態只有以下幾種

  • 基本類型(string , int , bool , float …等)
  • Unity運算類型(Vector3 , Vector2 , Quaternion …等)
  • 包含上述類型的Struct

 

如果想將複雜的Class做同步處理,SyncVar是沒辦法處理的,必須透過序列化與反序列化來達成資料傳送,這比較複雜的內容就留在未來有機會的時後再做介紹

 

在這邊附上遊戲執行檔,大家可以試試看效果

DometiLessonUNet

 

[ UNet ] 基礎教學 #04 – Command 命令



相關文章

基礎教學 #02 – NetworkBehaviour NetworkBehaviour是在UNet中代替MonoBehaviour的基底類別。 要存取物件的網路資訊都必須透過NetworkBehaviour才能達成,因此在撰寫網路物件的新腳本時必須...
教學 #09 – 獲取Component(組件)資訊 每個GameObject都帶有數個Component組件,而我們自定義的腳本中常有一些需要抓取的資訊,例如角色的血量、速度等等的,就必須抓取物件Component中的一些參數。 Get...
遊戲程式入門 #02 變數宣告與資料型態 何謂變數?變數是在程式語言中的基本概念之一,從字面上解釋就是「可變動的數」,用來作為存放資料的一個載體,存放資料的類型則是依據「資料型態」來定義。   宣告變數的程式碼如下: ...
都是初始化,Awake、Start的差異 當我們要在 Unity 中處理初始化的部分時,大多都是寫在「Start」的函式中,但若寫在「Awake」也能有差不多的效果。 那 Start 跟 Awake 差在哪邊呢? 首先要先看一下Unit...