このページは編集中です。更新が保留になっている可能性があります。

ネットワークの挙動

概要

NetworkBehaviour は、同じノードまたは親ノード上の NetworkObject を必要とします。

NetworkBehaviourSimulationBehaviour と同様に機能しますが、同期された状態を保持することができる点が追加されました。このため、関連する NetworkObject を持たなければなりません。

トップに戻る

オーバーライド可能なメソッド

NetworkObject には、ライフサイクルを管理するためのメソッドがいくつか用意されています。

機能 説明
FixedUpdateNetwork() Fusionの固定時間ステップのコールバックです。コアなゲームロジックに使用されます。
Spawned() スポーン後のコールバック。
Despawned(bool hasState) ネットワークオブジェクトがデスポーンする前に呼び出されます。
---
bool hasState: 挙動の状態がまだアクセス可能である場合。
Render() シミュレーション後のフレームレンダリングコールバック。すべてのシミュレーションが終了した後に実行されます。FusionがPhysicsを扱う場合、UnityのUpdateの代わりに使用します。

トップに戻る

ネットワークの状態

内部的には、Fusion は各 tick のネットワーク状態全体を Snapshot と呼ばれる一つのメモリバ ッファーとして保存しています。Networked Properties は、NetworkedBehaviourのどの変数がその Networked State に含まれるかを定義します。

ネットワーク化されたプロパティ

Networked Property を定義するには、[Networked] 属性を使用します。Fusion はこれらのタグ付けされたプロパティを独自の高性能データバッファーとデルタ圧縮に自動的に接続します。 プロパティのセッターとゲッターは、コンパイル時にカスタムコードに置き換えられ、メモリ割り当てのオーバーヘッドを排除し、最適なパフォーマンスを提供します。

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked] public float Health { get; set; }
}

コンパイル時に、Fusionは空のget/setスタブを実際のネットワーク状態データにアクセスするコードに置き換えます。直接アクセスすることで、メモリ割り当てのオーバーヘッドをなくし、最適なパフォーマンスを実現します。手動で実装しないでください

このように状態バッファに直接アクセスすることで、変更があるとすぐに状態に反映されます。

ネットワーク状態に影響するロジックを書くには、FixedUpdateNetwork()をオー バーライドして実装してください。

public override void FixedUpdateNetwork()
{
    Health += Runner.DeltaTime * HealthRegen;
}

トップに戻る

許可されたタイプ

Fusionは以下のタイプをサポートしており、[Networked]とすることができます。

  • プリミティブ
    • byte, sbyte
    • Int16, Int32, Int64
    • UInt16, UInt32, UInt64
    • float
    • double
    • float
    • double
    • bool (convereted to int)
    • 最大長を [Capacity] 属性で設定した文字列 (デフォルトは 16)
    • Unity 構造体タイプ (ILWeaver.cs で定義)
    • Vector2, Vector3, Vector4
    • Quaternion
    • Matrix4x4
    • Vector2Int, Vector3Int
    • BoundingSphere
    • Bounds
    • Rect
    • BoundsInt
    • RectInt
    • Color, Color32
  • System.Guid
  • ユーザー定義INetworkStructs
  • Fusion 定義 INetworkStructs
    • NetworkString<
    • IFixedStorage>
    • NetworkBool
    • Ptr
    • Angle
    • BitSet64, BitSet128, BitSet192, BitSet256
    • PlayerRefSet
    • NetworkId
    • NetworkButtons
    • NetworkRNG
    • NetworkObjectGuid
    • NetworkPrefabRef
    • NetworkObjectHeader
    • NetworkPrefabId
    • SceneRef
    • TickTimer
    • IFixedStorage (_2, _4, _8, _16, _32, _64, _128, _256, _512) -Fusion タイプ
      • NetworkObject (NetworkId としてシリアライズ)
      • NetworkBehaviour (NetworkIdNetworkBehaviour インデックスとして直列化)
      • PlayerRef (PlayerRef.PlayerId として直列化)
  • 最大長を [Capacity] 属性で指定した (デフォルトは 1 です)NetworkArray<T> -[Capacity] を使って、最大 Count を設定した [NetworkDictionary<K, V>] (~~~/manual/network-collections#networkdictionaryltk_vgt_) 。
  • [Capacity]属性を使用して最大 Count を設定したNetworkLinkedList<T>
  • NetworkString<_size&gt

トップに戻る

デフォルト値の設定

[Networked]プロパティにデフォルト値を設定することができます。

トップに戻る

共通の型

ほとんどの一般的なタイプでは、単純な割り当てで十分です。

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked] public float Health { get; set; } = 100;
  [Networked] public NetworkObject DefaultNetworkObject { get; set; } = GameObject.FindGameObjectWithTag("Foo").GetComponent<NetworkObject>();
}

トップに戻る

コレクション

NetworkArray<T&gt , NetworkDictionary<K, V&gt , NetworkLinkedList<T&gt and NetworkString<_size&gt などの Network Collections は特別な構文が必要になります。詳しくは、同名のページを参照してください。

トップに戻る

RefとPtr

適切なコンストラクタを使用することで、参照とポインタにデフォルト値を設定することができま す。

[Networked] public ref Byte Prop => ref MakeRef<Byte>(123);
[Networked] public Byte* Prop => MakePtr<Byte>(123);

トップに戻る

追加属性

[Networked]属性は、他のいくつかの属性と組み合わせることで、ネットワークの状態をどのように扱うかをより具体的に定義することができます。

精度

[Accuracy] 属性を使うことで、個々の数値型プロパティの精度を制御することができます。

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked, Accuracy(0.001)]
  public float Health { get; set; }
}

トップに戻る

容量

[Capacity]NetworkArrayNetworkDictionaryNetworkLinkedListNetworkString 、および文字列の最大サイズを定義するために使用されます。

public class MyNetworkBehaviour : NetworkedBehaviour
{
  [Networked, Capacity(14)]
  string MyString { get; set; }

  [Networked, Capacity(8)]
  NetworkArray<byte> MyArray { get; }
}

ネットワークコレクションの取り扱いについては、ネットワークコレクションのページを参照してください。

トップに戻る

OnChanged

2 つのレンダーフレーム間でネットワークプロパティに変更が検出されると、 ゲームコードがトリガーされることがあります。リアクティブなコードを書くには、[Networked] 属性の (OnChanged) パラメータを使用します。

public class Powerup : NetworkBehaviour
{
    [Networked(OnChanged = nameof(OnXyzChanged))] public TypeOfProperty Xyz { get; set; }

    // Has to be public static void
    public static void OnXyzChanged(Changed<Powerup> changed)
    {
        changed.Behaviour.OnXyzChanged();
    }

    private void OnXyzChanged()
    {
        // Some logic reacting to the value change of the "Xyz" property
    }
}

コールバック名の指定に加えて、どのマシンでコールバックが実行されるかを制御することが可能です。

-OnChangedLocal (default false): trueに設定すると、プロパティを変更したマシン上でもイベントフックが呼ばれるようになります。 -OnChangedRemote (default true): false に設定すると、プロパティを変更したマシンからイベントフックが呼ばれるようになります。

OnChanged コールバックは、2つの Unity Update 呼び出しの間で変更が検出されたときに呼び出されることに注意してください。つまり、これらのコールバックはtick-alignedではなく、2つのレンダーフレームの間に発生した変更のみを検出します。OnChange` コールバックの主な用途は、視覚効果やオーディオ効果、特にプロキシをトリガーすることです。

Changed<T> パラメータは変更前と変更後のビヘイビアのすべてのプロパティにアクセスすることができます - LoadOldLoadNew を使って切り替えてください。

private static void OnXyzChanged(Changed<Powerup> changed)
{
  var new_value = changed.Behaviour.Xyz;
  changed.LoadOld();
  var old_value = changed.Behaviour.Xyz;
}

トップに戻る

ジェネリック

NetworkBehaviour から派生した、テンプレート化されたクラスを作成することができます。これらのクラスは [Networked] プロパティを含むことができます。

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

しかし、一般的な [Networked] 型のプロパティとして &ltT&gt を持つことは不可能です。

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


ドキュメントのトップへ戻る