This document is about: FUSION 2
SWITCH TO

変更検知

概要

ネットワークプロパティの値が変更された場合に、任意のコードを実行したいケースがよくあります。

Fusionは、複数の変更検知(Change Detection)方法を提供しています。

Render内での変更検知: 変更を検知をした際に、ビジュアルを更新する(ゲームプレイのシミュレーションには影響を与えない)コードを実行したいことがあります。例えば、ネットワークプロパティhealthの変更に合わせたヘルスゲージUIの更新、ネットワークプロパティcolorの変更に合わせたプレイヤーのモデルの色の更新などです。

FixedUpdateNetwork内での変更検知: ホスト(サーバー)モードでは、ゲームプレイに影響を与える変更検知を使用する必要があります。例えば、ネットワークプロパティstaminaが50を切ったらプレイヤーの移動速度を半分にするなどです。FixedUpdateNetwork内で変更を検知することで、クライアントサイド予測やロールバックが正しく機能することを保証できます。

独自の変更検知: 変更検知は、任意の間隔で手動実行できます。これが必要になるケースはほとんどありませんが、変更検知を低頻度で実行することで、わずかにCPUパフォーマンスを向上できます。

共有モードのほとんどのケースでは、Renderベースの変更検知で十分です。

OnChangedRender

OnChangedRender属性は、最も簡単にRenderベースの変更検知を処理する方法です。

ネットワークプロパティにOnChangedRender属性を追加すると、変更が検知できるようになります。属性にはメソッド名を渡しますが、メソッドはNetworkBehaiourのvoidを返す関数である必要があります。

重要: クライアント上でオブジェクトが最初にスポーンした時には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

ChangeDetectorは、OnChangedRender属性より柔軟性が高く、FixedUpdateNetwork内や手動で変更を検知することが可能です。

ChangeDetectorは実践的な用途向けです。ChangeDetectorについては、ドキュメントの高度なトピックにあるネットワークバッファのChangeDetectorセクションをご覧ください。

Back to top