This document is about: FUSION 2
SWITCH TO

Network Behaviour

概要

NetworkBehaviourは、UnityのMonoBehaviourを継承したクラスで、以下の拡張が含まれています。

  • Runnerプロパティ(関連するNetworkRunnerの参照)
  • Objectプロパティ(関連するNetworkObjectの参照)
  • ネットワークプロパティの処理
  • RPCの処理
  • イベント関数(Spawned()Despawned()FixedUpdateNetwork()Render()
  • 権限周りのエイリアス(HasStateAuthorityHasInputAuthorityIsProxy

ネットワークオブジェクトには、NetworkBehaviourコンポーネントをいくつでも追加することができます。各NetworkBehaviourは、ネットワークオブジェクトの「状態(ネットワークプロパティ)」と「シミュレーション(FixedUpdateNetwork())」の一部を表します。

NetworkBehaviourId

有効なネットワークオブジェクトの全てのNetworkBehaviourコンポーネントは、ユニークな識別子を持ちます。この識別子は、ネットワークプロパティやRPCを持つNetworkBehaviourの参照として、ネットワーク上で同期されます。

ネットワークプロパティ(状態)

ネットワークプロパティは、NetworkBehaviour[Networked]属性から定義されるプロパティです。これらのプロパティは、ネットワークオブジェクトの状態を表し、その値は状態権限者からその他全ての関心を持つピアに複製されます。ホストモードでは、サーバーが常に状態権限を持ちます。共有モードでは、各プレイヤーに状態権限が割り当てられます。

ネットワークプロパティの定義は、自動実装プロパティ(空の{ get; set; })を記述するのみです。

NetworkBehaviourSpawned()が呼び出されるまで、ネットワークプロパティにアクセスすることはできません。

イベント関数

NetworkBehaviourは、いくつかのライフサイクルを管理するイベント関数を持ち、オーバーライドすることで実装を追加できます。

関数 説明
FixedUpdateNetwork() 固定周期のタイムステップで実行されるFusionのコールバックで、ティックごとに呼び出されます。主にゲームロジックのシミュレーションに使用されます。
UnityのFixedUpdate()のかわりに使用してください。
Spawned() ネットワークオブジェクトがNetworkRunnerに紐付けられた後に呼び出されます。ネットワークオブジェクトが初期化された後に呼び出されるため、ネットワークプロパティやRPCを使用可能です。
Start()のかわりに使用してください。
Despawned(NetworkRunner runner, bool hasState) ネットワークオブジェクトがデスポーンする前に呼び出されます。
OnDestroy()のかわりに使用してください。
---
NetworkRunner runner:ネットワークオブジェクトが属するNetworkRunner
bool hasState:NetworkBehaviourの状態にまだアクセス可能かどうか
Render() シミュレーション後にフレームごとに呼び出されるレンダリング用のコールバックで、全てのシミュレーション(FixedUpdateNetwork)が完了した後に実行されます。
Updateのかわりに使用してください。

FixedUpdateNetwork() (シミュレーション)

FixedUpdateNetwork()は、開発者が独自のシミュレーションのコードを実装する場所です。ここにプレイヤーの入力を使用して現在の状態を変更するコードを追加します。NetworkObject.IsInSimulationtrueなら、そのオブジェクトの全てのNetworkBehaviourで、FixedUpdateNetwork()が毎ティック呼び出されます。全てのFixedUpdateNetwork()が実行された後に、全てのNetworkBehaviourの結果をまとめた状態が、そのティックでのオブジェクトのスナップショットになります。

次のサンプルコードで、基本的なスクリプトを示します。Healthは状態を定義するネットワークプロパティで、FixedUpdateNetwork()内のコードはシミュレーションを構成します。

C#

using Fusion;

public class Health : NetworkBehaviour
{
  // NetworkInput is collected elsewhere and is not covered by this section.
  public struct MyNetworkInput : INetworkInput
  {
    public bool DrinkPotion;
  }

  // Networked Properties represent Object State.
  [Networked]
  public int Health { get; set; }

  // FixedUpdateNetwork() is your Simulation code.
  // This is where you apply inputs to a previous Tick State,
  // to produce a new Tick State result.
  public override void FixedUpdateNetwork()
  {
    // GetInput will return true on the StateAuthority and the InputAuthority.
    // Check to see if the player drank.
    if (GetInput<MyNetworkInput>(out var input))
    {
      // If the player input indicates they drank this tick,
      // then simulate drinking. Changes to the health value
      // on the State Authority will automatically replicate.
      if (input.DrinkPotion)
      {
        Health += 25;
      }
    }
  }
}

Render() (補間)

Fusionは固定周期でティックベースシミュレーションを実行するネットワークエンジンです。Unityの物理エンジンのFixedUpdate()と同様で、シミュレーションの結果(スナップショット)は一定間隔で生成されます。これらのスナップショットをUnityのUpdate()ごとにレンダリングする際に、最新のスナップショットを単に表示するだけでは、表示がガタガタして見えてしまいます。なぜなら、同じスナップショットが数フレームに渡ってレンダリングされたり、逆に一部のスナップショットがスキップされてレンダリングされることがあるからです。スムーズなレンダリング結果を得るためには、常にスナップショット間を線形補間してレンダリングします。

コールバックインターフェース

Spawned()FixedUpdateNetwork()Render()に加えて、他の特定タイミングのイベントを実装できるインターフェースも用意されています。

  • IAfterSpawned
  • IBeforeTick
  • IBeforeAllTicks
  • IAfterTick
  • IAfterAllTicks
  • IStateAuthorityChanged
  • IPlayerJoined
  • IPlayerLeft

リモートプロシージャコール(RPC)

NetworkBehaviourは、リモートプロシージャコール(RPC)と呼ばれるメッセージハンドラーの、宣言・実装ができます。静的ではないRPCでは、NetworkBehaviourがメッセージの対象となります。

ジェネリクス

NetworkBehaviourを継承したジェネリッククラスを作成することが可能です。ネットワークプロパティとRPCは、ジェネリック基底クラスやその派生クラスでも、ネットワークプロパティとRPCを定義・実装することができます。

C#

// This is VALID
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
    [Networked] public int Prop { get; set; }
}

ただし、ジェネリック型<T>のネットワークプロパティを持つことはできません。

C#

// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
    [Networked] public T Prop { get; set; }
}
Back to top