This document is about: FUSION 2
SWITCH TO

4 - ネットワークプロパティ

概要

この章では、ネットワークプロパティを使用して、プレイヤーの位置以外のデータを同期する方法を説明します。

ネットワークプロパティ

NetworkObjectNetworkTransformコンポーネントを追加すると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間)でプロパティの値の変更が検出されるたびにOnColorChangedメソッドが呼ばれます。

PlayerCharacterプレハブにPlayerColorコンポーネントを追加して、プレイヤーオブジェクトのMeshRendererをアタッチします。ゲームを実行してEキーを押すと、プレイヤーの色が変更されることが確認できます。ここでビルドを作成して、ネットワーク上でも色が正しく同期されているかも確認しましょう。

次は 共有モード入門 5 - RPC

Back to top