4 - ネットワークプロパティ
概要
このセクションでは、ネットワーク上で、レイヤーの位置に加えて、Networked Properties
を使用し追加データを同期する方法についてご紹介しています。
ネットワークプロパティ
Fusionでは、NetworkObjects
のTransformに、NetworkTransform
コンポーネントを追加する際、同期を行います。 スクリプト内の変数などその他のステートは、ネットワーク上では同期されません。 ネットワーク上でステートを同期するには、[Networked]
プロパティが必要になります。 ネットワークプロパティは、StateAuthority
からのステートをその他すべてのクライアントへ同期します。
全てのクライアント上でネットワークプロパティをアップデートしたい場合は、StateAuthority
でのみのアップデートにするようにしてください。
シンプルなネットワークプロパティの事例としてプレイヤーの色があります。 まず、新しくスクリプトを作成して、 PlayerColor
と名前を付けます。 オブジェクトの MeshRender
リファレンスにプロパティとパブリックフィールドを追加します。
using Fusion;
using UnityEngine;
public class Player : NetworkBehaviour
{
public MeshRenderer MeshRenderer;
[Networked]
public Color NetworkedColor { get; set; }
}
ネットワークプロパティは、{get; set;}
などのプロパティ形式にする必要があり、通常のフィールドには対応していない点にご注意ください。
次に、アップデートでStateAuthority
が色を変更できるようにするコードを追加します。
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
//クライアントがボタンを押したときに実行されるコードであり、全てのクライアントで反映されるものではないので、ここでマテリアルの色を直接変更しても、効果がありません。
NetworkedColor = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
}
}
ボタンが押されても、 MeshRender
の色は即座に変更されません。 その代わりに、ネットワークプロパティがアップデートされます。 そして、全てのクライアントで色の変更が複製されます。 あとは、各クライアントでネットワークプロパティへの変更を確認し、それぞれに応じてメッシュカラーを調整します。
Fusionでは、 ChangeDector
によってこれが行われます。 スクリプトにChangeDector
を新しく追加して、Spawned
で初期化します。以下を参照ください。
private ChangeDetector _changeDetector;
public override void Spawned()
{
_changeDetector = GetChangeDetector(ChangeDetector.Source.SimulationState);
}
それから、Update
関数の最後で以下を行います。
foreach (var change in _changeDetector.DetectChanges(this))
{
switch (change)
{
case nameof(NetworkedColor):
MeshRenderer.material.color = NetworkedColor;
break;
}
}
このコードで、最後の呼び出しからChangeDetector
へNetworked Properties
に生じた全ての変更がイテレートされます。 今回のケースでは、最後のUpdate
からということになります。 クライアント上で色の値に加えられた変更が検知されると、MeshRenderer
がアップデートされます。
プレイヤーオブジェクトにPlayerColor
コンポーネントを追加して、プレイヤー上でMeshRender
をリンクします。 再生モードを入力して、E
を押します。 編集ビューで色を変更しているプレイヤーを確認できます。 ここで、ビルドを作成してネットワーク上で適切に色が同期されていることを検証することもできます。