変更検知
概要
ネットワークプロパティの値が変更された場合に、任意のコードを実行したいケースがよくあります。
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セクションをご覧ください。