Network Behaviour
概述
NetworkBehaviour衍生自並擴展了Unity的MonoBehaviour類別以包含:
- 以‘Runner’屬性參照到關聯的NetworkRunner。
- 以Object屬性參照到關聯的NetworkObject。
- 處理已連網屬性
- 處理遠端程序調用
- 虛擬事件回調,用於Spawned()、Despawned(NetworkRunner runner, bool hasState)、FixedUpdateNetwork(),及Render()。
- 用於流程控制的授權別名。HasStateAuthority、HasInputAuthority,及IsProxy。
任何數量的NetworkBehaviour元件都可以新增到網路物件及其下層轉換中。網路物件上的每個NetworkBehaviour執行個體都代表該網路物件的狀態(網路屬性)和模擬(FixedUpdateNetwork())的一部分。
網路行為ID
已附加的網路物件上的每個NetworkBehaviour元件都有一個唯一的網路識別符。此識別符本身可以連網,以參照具有網路屬性或遠端程序調用的NetworkBehaviour。請參見進階網路屬性。
已連網屬性(狀態)
已連網屬性 是在具有[Networked]屬性的網路行為中定義的屬性。這些屬性表示網路物件的狀態,它們的值從狀態授權同儕節點複製到所有其他感興趣的同儕節點。在伺服器模式下,伺服器始終是推定的狀態授權。在共享模式下,玩家被指派為狀態授權。
這些屬性是在沒有執行方式的情況下定義的,只是一個自動執行的屬性(只是一個空的{ get; set; })。IL編譯器在已編譯的IL中的您看不到的這些新增了網路處理。
在網路行為已經讓Spawned()被調用之前,無法存取已連網屬性,因為已編織的網路程式碼參照的記憶體緩衝區僅在網路物件附加到運行器後才存在。
事件函數
NetworkBehaviour具有許多虛擬生命週期事件函數,所有這些函數都可以被覆寫以新增執行方式。
| 函數 | 說明 | 
|---|---|
| FixedUpdateNetwork() | Fusion的固定時間步驟回調。每個模擬刷新調用一次。用於模擬核心遊戲邏輯。 代替Unity的FixedUpdate()。 | 
| Spawned() | 在將網路物件附加到`NetworkRunner`後,會調用Spawned。在網路物件初始化後調用,可以使用網路屬性和RPC。 代替Start() | 
| Despawned(NetworkRunner運行器,布林值hasState) | 在網路物件取消生成之前調用。 代替OnDestroy() --- NetworkRunner運行器:這個網路物件所屬的NetworkRunner。 布林值hasState:如果行為狀態仍然可以存取。 | 
| Render() | 模擬後幀渲染回調。在所有模擬步驟(FixedUpdateNetwork)完成後運行。 代替Update()。 | 
FixedUpdateNetwork()(模擬)
FixedUpdateNetwork()是執行自訂模擬程式碼的地方。您可以在此處新增使用玩家輸入來更改當前狀態的程式碼。如果NetworkObject.IsInSimulation為true,則FixedUpdateNetwork()將在每一個刷新在該物件的所有網路行為上被調用。在調用所有FixedUpdateNetwork()方法後,將捕捉所有網路行為的結果狀態,這將成為該刷新的物件的快照。
此範例程式碼展示了一個基本的Health指令碼。Heath是一個定義狀態的已連網屬性,FixedUpdateNetwork()中的程式碼構成了該狀態的模擬。
C#
using Fusion;
public class Health : NetworkBehaviour
{
  // NetworkInput is collected elsewhere and is not covered by this section.
  public struct MyNetworkInput : INetworkInput
  {
    public bool DrinkPotion;
  }
  // Networked Properties represent Object State.
  [Networked]
  public int Health { get; set; }
  // FixedUpdateNetwork() is your Simulation code.
  // This is where you apply inputs to a previous Tick State,
  // to produce a new Tick State result.
  public override void FixedUpdateNetwork()
  {
    // GetInput will return true on the StateAuthority and the InputAuthority.
    // Check to see if the player drank.
    if (GetInput<MyNetworkInput>(out var input))
    {
      // If the player input indicates they drank this tick,
      // then simulate drinking. Changes to the health value
      // on the State Authority will automatically replicate.
      if (input.DrinkPotion)
      {
        Health += 25;
      }
    }
  }
}
Render()(內插補點)
因為Fusion是一個基於固定刷新的網路引擎,它以固定的時間間隔產生模擬結果(狀態快照),類似於Unity的FixedUpdate()與物理結合運作的方式。然而,如果這些快照結果是透過在每個Unity的Update()中只顯示最新的快照結果來呈現的,那麼結果將非常麻煩——因為快照有時會連續呈現多個更新而不更改,有些快照會被跳過而從未顯示。內插補點透過始終在兩個先前模擬的快照之間進行調整,產生平滑的渲染結果。
(這裡有Gif動畫會很不錯)
回調介面
除了主要的Spawned()、FixedUpdateNetwork()和Render()覆寫方法外,還有更具體的介面可以為其他特定的定時事件來執行。
- IAfterSpawned
- IBeforeTick
- IBeforeAllTicks
- IAfterTick
- IAfterAllTicks
- IStateAuthorityChanged
- IPlayerJoined
- IPlayerLeft
遠端程序調用(RPC)
NetworkBehaviour元件可以聲明和執行稱為遠端程序調用(RPC)的訊息傳送處理程式。對於非靜態RPC,網路行為作為訊息的目標。有關RPC的更多資訊…
泛型
可以建立從NetworkBehaviour衍生的泛型類別。[Networked]屬性和遠端程序調用可以在泛型基礎類別或從其衍生的任何類別中定義和執行。
C#
// This is VALID
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
    [Networked] public int Prop { get; set; }
}
但是,不可能有
C#
// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
    [Networked] public T Prop { get; set; }
}