This document is about: FUSION 2
SWITCH TO

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部分。

Back to top