4 - Network Properties
概述
本章節介紹如何使用Networked Properties
來透過網路同步玩家位置之外的其他資料。
網路屬性
當您向NetworkObjects
的轉換新增一個NetworkTransform
元件時,Fusion會同步該轉換。您的指令碼中的變數等其他狀態不會透過網路同步。若要透過網路同步狀態,需要[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 (HasStateAuthority && 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中,這是透過ChangeDetection
完成的。在共享模式中,最簡單的方法是使用OnChangedRender
屬性。首先新增一個函數,該函數將在NetworkedColor
更改時執行。
C#
void ColorChanged()
{
MeshRenderer.material.color = NetworkedColor;
}
然後使用OnChangedRender
屬性調整已連網屬性:
C#
[Networked, OnChangedRender(nameof(ColorChanged))]
public Color NetworkedColor { get; set; }
在各個轉譯幀(Unity更新)期間檢測到屬性發生更改時,這個屬性都會調用ColorChanged
函數。
將PlayerColor
元件新增到PlayerCharacter
預製件中,並連結玩家上的MeshRender
。進入遊玩模式,然後按E
。您可以在編輯檢視中檢查玩家是否正在更改顏色。此時,您還可以建立一個組建,以驗證顏色是否在網路上正確同步。
下一章是 共享模式基礎5 - 遠端程序調用
Back to top