4 - ネットワークプロパティ
概要
この章では、ネットワークプロパティを使用して、プレイヤーの位置以外のデータを同期する方法を説明します。
ネットワークプロパティ
NetworkObject
のtransform
は、NetworkTransoform
コンポーネントを追加することで同期できますが、その他の値(ライフ・スタミナ・オブジェクトの色など)はどうでしょう?
Fusionは、スクリプトのプロパティを同期することができます。単純にC#の自動実装プロパティを使用して、Fusionの[Networked]
属性を追加すると、「ネットワークプロパティ」としてネットワーク上の状態の一部になります。
状態権限を持たないクライアントがネットワークプロパティを変更しても、変更はネットワーク上で同期されません。その変更はローカル上の予測として適用され、状態権限者の変更によって上書きされます。ネットワークプロパティの値を全てのクライアント間で同期したい場合は、状態権限者がネットワークプロパティを変更する必要があることに注意してください。
シンプルな例として、ネットワークプロパティでプレイヤーの色を同期してみましょう。新規スクリプトを作成し、名前をPlayerColor
にします。スクリプトには、ネットワークプロパティと、オブジェクトのMaterial
の参照を追加します。
C#
using Fusion;
using UnityEngine;
public class PlayerColor : NetworkBehaviour
{
public MeshRenderer MeshRenderer;
[Networked]
public Color NetworkedColor { get; set; }
}
ネットワークプロパティは({get; set;}
スタブの)自動実装プロパティである必要があります。通常のフィールドには対応していません。
次に、Update
で状態権限を持つクライアントが色を変更できるように、コードを追加します。
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);
}
}
ボタンを押した際、MeshRenderer.material.color
を直接変えるのではなく、ネットワークプロパティを更新することで、更新が全てのクライアントに送信されます。
Update()
メソッドでマテリアルの色を毎フレーム設定して、すべてのクライアントでオブジェクトの色を決定することもでますが、これは比較的コストが高く、「変更検知」というより良い方法が存在します。
OnChangeRender - 変更検知
各クライアントで行うべきことは、ネットワークプロパティの変更をチェックして、その値に従ってメッシュの色を調整することです。
Fusionでは、これをネットワークプロパティのOnChangedRender
属性で行います。これは変更時にメソッドをフックするために使用されます。
このチュートリアルでは、NetworkedColor
が変更された時に実行される関数を追加します。ここがマテリアルを更新する最適な場所だからです。
C#
void ColorChanged()
{
MeshRenderer.material.color = NetworkedColor;
}
そして、NetworkedColor
にOnChangedRender
属性を追加します。
C#
[Networked, OnChangedRender(nameof(ColorChanged))]
public Color NetworkedColor { get; set; }
この属性によって、フレーム間(UnityのUpdate
間)でプロパティの値の変更が検出されるたびにColorChanged
メソッドが呼ばれます。
PlayerCharacter
プレハブにPlayerColor
コンポーネントを追加して、プレイヤーオブジェクトのMeshRenderer
をアタッチします。ゲームを実行してE
キーを押すと、プレイヤーの色が変更されることが確認できます。ここでビルドを作成して、ネットワーク上でも色が正しく同期されているかも確認しましょう。