[ UNet ] 基礎教學 #02 – NetworkBehaviour

標籤: , , , ,

NetworkBehaviour是在UNet中代替MonoBehaviour的基底類別。

要存取物件的網路資訊都必須透過NetworkBehaviour才能達成,因此在撰寫網路物件的新腳本時必須將繼承的MonoBehaviour改為NetworkBehaviour

若要使用UNet相關API,必須先引入UnityEngine.Networking

 

using UnityEngine.Networking;

 

一個空的網路腳本大致上會像這樣

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

using UnityEngine.Networking;

public class Move : NetworkBehaviour {

     // Use this for initialization
     void Start () {
     
     }
     
     // Update is called once per frame
     void Update () {
     
     }
}

 

在開始介紹之前大家必須先有些基本概念:

在多人連線的處理上,「應當」一切遵從於「Server」,也就是說Server必須掌握大權,所有玩家是單純同步於Server處理後的結果,這樣的主從關係是必須的,否則會造成A玩家與B玩家在顯示上或計算上出現差異。

但有時為了讓玩家畫面表現流暢,不會被等待中的封包影響流暢性,會讓Client自行處理一些判斷讓整體更加順暢,例如:Client端發出攻擊指令時自行處理動畫演出與扣血、傷害等等,待伺服器回傳資料後進行校正。

 

NetworkBehaviour中有幾項常用的屬性

 

  • hasAuthority – 玩家是否擁有控制權
    • 可以用於各玩家的角色上,由Client端發出請求讓Server執行動作,如移動、攻擊等等。
  • isServer – 是否是在伺服器端運行
    • 十分常用的屬性,在撰寫遊戲邏輯時都需要以Server為基準
  • isClient – 是否是在客戶端運行
    • 有些腳本只需要Server去處理,Client便可以移除掉以節省效能
  • isLocalPlayer – 是否屬於本地玩家
    • 在連線成功時Server會替玩家創造一個Player物件,在#1的教學中即是PlayerActor,可以透過isLocalPlayer判斷此Player是否屬於自己。
    • 這個屬性和hasAuthority類似,但只有Player物件的isLocalPlayer會返回True,而Player物件亦是唯一的。

 

將上一篇教學中提到的Move程式碼更改成以下

 

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

using UnityEngine.Networking;

public class Move : NetworkBehaviour {
     public float speed = 3;
     // Use this for initialization
     void Start () {
     
     }
     
     // Update is called once per frame
     void Update () {
         if (!isLocalPlayer)
         {
               return;
         }
         float x = Input.GetAxis("Horizontal");
         float y = Input.GetAxis("Vertical");
                  
         transform.Translate(new Vector2(x,y) * Time.deltaTime * speed);
         
     }
}

 

這樣各自玩家就只能操控自己的物件,而不會每個相同的物件都被移動到。

 

順待一提,若物件添加了NetworkTransform,Client端擁有控制權的物件會自動將位置同步至Server而非同步於Server。

 

 

本篇教學到此結束,感謝大家的閱讀!

 

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



相關文章

教學 #08 – 碰撞事件 Unity的碰撞事件與滑鼠點擊事件是差不多的撰寫方式,一樣是在腳本中打上函數名稱就能夠使用事件。 事件主要分成兩大類: OnCollision - 碰撞事件OnTrigger - 觸發事...
遊戲程式入門 #03 印出訊息,Debug Log、print... 在先前的 #00 Unity腳本建立與HelloWorld! 中有提到 Debug.Log 這個函式,這是用來印出除錯訊息的功能 每個語言都會有類似的功能,用來幫助開發者在開發時進行除錯,或是...
捲動視窗 – Scroll View 這次我們介紹的是UGUI的Scroll View,照字面翻譯就是滾動視窗,也能夠應用在APP上做成滑動視窗 可以從這個地方添加到場景上 添加到場景上後畫面會是這樣 ...
教學 #00 – 安裝與事前準備 Unity是目前主流的開發引擎之一,他強大的地方在於免費提供給開發者使用,並且有良好的跨平台發行能力。雖然Unreal 現在也開放免費使用,但Unity先進入市場,使得網路上有大量參考資料,非常適合新...