Change Detection
概述
使用已連網屬性時,一個常見的用例是在已連網屬性的值發生變化時執行程式碼。
Fusion提供了多種更改檢測方法:
渲染中的更改檢測: 檢測到更改時運行的程式碼通常不會影響遊戲模擬,而是僅用於視覺效果目的。示例包括每當health
已連網屬性發生變化時更新UI健康條,或者每當color
已連網屬性變化時更新玩家網格渲染器的顏色。
FixedUpdateNetwork中的更改檢測: 在主機/伺服器模式下,當使用更改檢測來影響遊戲時,需要使用此功能。例如,只要stamina
已連網屬性低於50,玩家的移動速度就會降低50%。在這些情況下,在FixedUpdateNetwork中運行更改檢測,可確保客戶端預測與伺服器的模擬相匹配,並允許正確的復原。
自訂更改檢測: 更改檢測可以按自訂間隔手動運行。除非在進階用例中,否則很少需要這樣做。降低運行更改檢測的頻率可以略微提高CPU效能。
在 共享模式 中,對於大多數用例,使用基於渲染的更改檢測就足夠了。
OnChangedRender
OnChangedRender
屬性是處理基於Render
的更改檢測的最簡單方法。
為了檢測已連網屬性上的更改,請向其新增OnChangedRender
屬性。該屬性使用方法名稱。使用的方法需要是同一NetworkBehaviour
上的空函數。
重要: 當物件首次在客戶端上生成時,不會調用OnChangedRender
。為了初始化物件,請使用override Spawned
函數,並從那裡調用更改後的函數或手動初始化物件。
示例:
C#
public class Example : NetworkBehaviour
{
[Networked, OnChangedRender(nameof(OnColorChanged))]
public Color NetworkedColor { get; set; }
public Material material;
public void OnColorChanged()
{
material.color = NetworkedColor;
}
}
nameof(OnColorChanged)
用於為屬性提供方法名稱字串,而不是對名稱進行硬編碼。這確保了在重構函數名稱時,屬性會自動以新名稱更新。先前值
可以存取更改發生之前的值。
C#
[Networked]
[OnChangedRender(nameof(CounterChanged))]
public int Counter { get; set; }
void CounterChanged(NetworkBehaviourBuffer previous)
{
var prevValue = GetPropertyReader<int>(nameof(Counter)).Read(previous);
Log.Info($"counter changed: {Counter}, prev: {prevValue}");
}
調用GetPropertyReader<T>
時的類型需要與已連網屬性的類型相匹配。
更改檢測器
ChangeDetector
提供了比OnChangedRender
屬性更大的靈活性。這允許在FixedUpdateNetwork
中或以手動間隔進行ChangeDetection
。
ChangeDectors
用於進階用例。有關ChangeDectors
的文檔,請參閱進階操作手冊中網路緩衝頁面的ChangeDetector
部分。