[ 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 命令

Leave a Comment