ネットワークの挙動
概要
NetworkBehaviour
は、同じノードまたは親ノード上の NetworkObject
を必要とします。
NetworkBehaviour
は SimulationBehaviour
と同様に機能しますが、同期された状態を保持することができる点が追加されました。このため、関連する 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 はこれらのタグ付けされたプロパティを独自の高性能データバッファーとデルタ圧縮に自動的に接続します。 プロパティのセッターとゲッターは、コンパイル時にカスタムコードに置き換えられ、メモリ割り当てのオーバーヘッドを排除し、最適なパフォーマンスを提供します。
C#
public class PlayerBehaviour : NetworkedBehaviour
{
[Networked] public float Health { get; set; }
}
コンパイル時に、Fusionは空のget/setスタブを実際のネットワーク状態データにアクセスするコードに置き換えます。直接アクセスすることで、メモリ割り当てのオーバーヘッドをなくし、最適なパフォーマンスを実現します。手動で実装しないでください。
このように状態バッファに直接アクセスすることで、変更があるとすぐに状態に反映されます。
ネットワーク状態に影響するロジックを書くには、FixedUpdateNetwork()
をオー バーライドして実装してください。
C#
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
- Enums
- 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 (
NetworkId
とNetworkBehaviour
インデックスとして直列化) - PlayerRef (
PlayerRef.PlayerId
として直列化)
- NetworkObject (
- 最大長を
[Capacity]
属性で指定した (デフォルトは 1 です)NetworkArray<T>
-[Capacity]
を使って、最大Count
を設定した [NetworkDictionary<K, V>] (~~~/manual/network-collections#networkdictionary_lt_k__v_gt_) 。 - [Capacity]属性を使用して最大
Count
を設定したNetworkLinkedList<T> - NetworkString<_size>
デフォルト値の設定
[Networked]
プロパティにデフォルト値を設定することができます。
共通の型
ほとんどの一般的なタイプでは、単純な割り当てで十分です。
C#
public class PlayerBehaviour : NetworkedBehaviour
{
[Networked] public float Health { get; set; } = 100;
[Networked] public NetworkObject DefaultNetworkObject { get; set; } = GameObject.FindGameObjectWithTag("Foo").GetComponent<NetworkObject>();
}
コレクション
NetworkArray<T> , NetworkDictionary<K, V> , NetworkLinkedList<T> and NetworkString<_size> などの Network Collections は特別な構文が必要になります。詳しくは、同名のページを参照してください。
RefとPtr
適切なコンストラクタを使用することで、参照とポインタにデフォルト値を設定することができま す。
C#
[Networked] public ref Byte Prop => ref MakeRef<Byte>(123);
[Networked] public Byte* Prop => MakePtr<Byte>(123);
追加属性
[Networked]
属性は、他のいくつかの属性と組み合わせることで、ネットワークの状態をどのように扱うかをより具体的に定義することができます。
精度
[Accuracy]
属性を使うことで、個々の数値型プロパティの精度を制御することができます。
C#
public class PlayerBehaviour : NetworkedBehaviour
{
[Networked, Accuracy(0.001)]
public float Health { get; set; }
}
容量
[Capacity]
は NetworkArray
、 NetworkDictionary
、 NetworkLinkedList
、 NetworkString
、および文字列の最大サイズを定義するために使用されます。
C#
public class MyNetworkBehaviour : NetworkedBehaviour
{
[Networked, Capacity(14)]
string MyString { get; set; }
[Networked, Capacity(8)]
NetworkArray<byte> MyArray { get; }
}
ネットワークコレクションの取り扱いについては、ネットワークコレクションのページを参照してください。
OnChanged
2 つのレンダーフレーム間でネットワークプロパティに変更が検出されると、 ゲームコードがトリガーされることがあります。リアクティブなコードを書くには、[Networked]
属性の (OnChanged)
パラメータを使用します。
C#
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>
パラメータは変更前と変更後のビヘイビアのすべてのプロパティにアクセスすることができます - LoadOld
と LoadNew
を使って切り替えてください。
C#
private static void OnXyzChanged(Changed<Powerup> changed)
{
var new_value = changed.Behaviour.Xyz;
changed.LoadOld();
var old_value = changed.Behaviour.Xyz;
}
ジェネリック
NetworkBehaviour
から派生した、テンプレート化されたクラスを作成することができます。これらのクラスは [Networked]
プロパティを含むことができます。
C#
// This is VALID
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
[Networked] public int Prop { get; set; }
}
しかし、一般的な [Networked]
型のプロパティとして <T> を持つことは不可能です。
C#
// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
[Networked] public T Prop { get; set; }
}
Back to top