4 - ネットワークプロパティ
概要
この章では、ネットワークプロパティを使用して、プレイヤーの位置以外のデータを同期する方法を説明します。
ネットワークプロパティ
NetworkObject
にNetworkTransform
コンポーネントを追加するとtransform
を同期できますが、それ以外の状態(スクリプトの変数など)は同期されません。この状態をネットワーク上で同期するには、[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
の色を直接変えるのではなく、ネットワークプロパティを更新することで、更新が全てのクライアントに送信されます。各クライアントは、ネットワークプロパティの変更を確認して、それぞれでメッシュの色を調整します。
Fusionでは、これをChangeDetection
によって行います。共有モードで簡単に実装する方法は、OnChangedRender
属性を使用することです。まず、NetworkedColor
が変更された時に呼び出されるメソッドを追加します。
C#
void ColorChanged()
{
MeshRenderer.material.color = NetworkedColor;
}
そして、ネットワークプロパティにOnChangedRender
属性を追加します。
C#
[Networked, OnChangedRender(nameof(ColorChanged))]
public Color NetworkedColor { get; set; }
この属性によって、フレーム間(UnityのUpdate
間)でプロパティの値の変更が検出されるたびにColorChanged
メソッドが呼ばれます。
PlayerCharacter
プレハブにPlayerColor
コンポーネントを追加して、プレイヤーオブジェクトのMeshRenderer
をアタッチします。ゲームを実行してE
キーを押すと、プレイヤーの色が変更されることが確認できます。ここでビルドを作成して、ネットワーク上でも色が正しく同期されているかも確認しましょう。