4 - Network Properties
概述
這個章節展示了如何使用Networked Properties
以透過網路來同步玩家的位置之外的額外的資訊。
網路屬性
Fusion同步NetworkObjects
的轉換,在您新增NetworkTransform
元件到它們的時候。其他狀態,比如在您的指令碼中的變數,不會透過網路被同步。為了讓狀態透過網路被同步,需要一個[Networked]
屬性。已連網屬性從StateAuthority
同步它們的狀態到所有其他客戶端。
如果一個客戶端更改一個它沒有StateAuthority
的物件上的已連網屬性,則該更改不會透過網路同步,而是作為一個本機預測,並且可以在未來被來自StateAuthority
的更改所覆寫。請小心地只更新在StateAuthority
上的已連網屬性,如果您希望它在每個客戶端上更新的話。
針對網路屬性的一個簡單的示例是一個玩家的顏色。首先建立一個新的指令碼並且命名它為PlayerColor
。新增一個已連網屬性以及一個公共欄位,以參照物件的MeshRender
到它。
C#
using Fusion;
using UnityEngine;
public class PlayerColor : NetworkBehaviour
{
public MeshRenderer MeshRenderer;
[Networked]
public Color NetworkedColor { get; set; }
}
請注意,已連網屬性必須是屬性({get; set;}
),不支援常規欄位。
更新的下一步是新增程式碼,其允許StateAuthority
來更改顏色:
C#
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// Changing the material color here directly does not work since this code is only executed on the client pressing the button and not on every client.
NetworkedColor = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
}
}
當按下按鈕時,MeshRender
的顏色不會立即改變。取而代之地,更新已連網屬性。這樣做的話,顏色的更改將被複製到所有客戶端上。針對各個客戶端的剩下的事情是檢查對於已連網屬性的更改,並且相應地調整網格顏色。
在Fusion中,這是透過OnChanged
回調來完成。首先建立一個將在已連網屬性改變時被調用的函數:
C#
private static void NetworkColorChanged(Changed<PlayerColor> changed)
{
changed.Behaviour.MeshRenderer.material.color = changed.Behaviour.NetworkedColor;
}
需要被改變的參數,其提供您存取到NetworkBehaviour
執行個體,這是被更改到取得/設定屬性的執行個體。請注意,該類型是Changed<PlayerColor>
,其為NetworkBehaviour
的類型,並且不僅僅是已連網顏色已連網屬性的類型。
最後,為了將回調掛鉤到屬性,請以以下內容替換[Networked]
屬性:
C#
[Networked(OnChanged = nameof(NetworkColorChanged))]
public Color NetworkedColor { get; set; }
新增PlayerColor
元件到玩家物件,並且從內插補點目標來鏈接MeshRender
。輸入遊玩模式並且按下E
。您可以在編輯檢視中檢查到,玩家正在更改顏色。在這個時候,您也可以建立一個組件,來驗證顏色在網路上被正確地同步。
下一章是共享模式基礎5 - 遠端程序調用
Back to top