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



相關文章

教學 #01 – 物件建立與Hello World! 上一篇文章中提到安裝與版面配置,這一篇文章中我們來撰寫第一行程式碼 目前我們的畫面應該是長這樣的 Hierarchy中有一個Main Camera 在上一篇文章中我們有提...
多人連線遊戲概述 多人連線連線,無論是大型的MMORPG,或著單機遊戲附加的多人連線功能,只要把任意一款遊戲加上多人連線,感覺就比原本厲害了許多。 我想這對每位夢想開發遊戲的人或多或少都想過要製作這類遊戲,但卻不...
教學 #02 – 基本的移動 在Unity中,所有與位置、旋轉、縮放相關的功能都由Transform這個組件控制 而transform這個屬性便是用來抓取遊戲物件(GameObject)上的Transform組件 以...
遊戲程式入門 #00 Unity腳本建立與HelloWorld!... 此為 Unity C# 遊戲程式入門系列教學文章,適合對遊戲程式設計或遊戲開發有興趣但對程式沒有基礎的人 前言 在筆者以前的自學過程中,常常出現「我很想學某件事,但我該如何開始呢?...