Network Behaviour
概要
NetworkBehaviour
は、UnityのMonoBehaviour
を継承したクラスで、以下の拡張が含まれています。
Runner
プロパティ(関連するNetworkRunner
の参照)Object
プロパティ(関連するNetworkObject
の参照)- ネットワークプロパティの処理
- RPCの処理
- イベント関数(
Spawned()
、Despawned()
、FixedUpdateNetwork()
、Render()
) - 権限周りのエイリアス(
HasStateAuthority
、HasInputAuthority
、IsProxy
)
ネットワークオブジェクトには、NetworkBehaviour
コンポーネントをいくつでも追加することができます。各NetworkBehaviour
は、ネットワークオブジェクトの「状態(ネットワークプロパティ)」と「シミュレーション(FixedUpdateNetwork()
)」の一部を表します。
NetworkBehaviourId
有効なネットワークオブジェクトの全てのNetworkBehaviour
コンポーネントは、ユニークな識別子を持ちます。この識別子は、ネットワークプロパティやRPCを持つNetworkBehaviour
の参照として、ネットワーク上で同期されます。
ネットワークプロパティ(状態)
ネットワークプロパティは、NetworkBehaviour
で[Networked]
属性から定義されるプロパティです。これらのプロパティは、ネットワークオブジェクトの状態を表し、その値は状態権限者からその他全ての関心を持つピアに複製されます。ホストモードでは、サーバーが常に状態権限を持ちます。共有モードでは、各プレイヤーに状態権限が割り当てられます。
ネットワークプロパティの定義は、自動実装プロパティ(空の{ get; set; }
)を記述するのみです。
NetworkBehaviour
でSpawned()
が呼び出されるまで、ネットワークプロパティにアクセスすることはできません。
イベント関数
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.IsInSimulation
がtrue
なら、そのオブジェクトの全ての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; }
}