PackObjects (SyncVars)
[PackObject] Attribute 自動フィールド同期に含めるクラスや構造体にタグを付けることができるようになります。 PackObjectAttributeを設定してすべてのパブリックフィールドをシリアライズするか、クラス/構造体内のすべての [SyncVar] Attributes を探すことができます。 これらは基本的に他のプラットフォームの SyncVarsと同じですが、主な違いはフィールドが以下を行うことです。
- Simpleのすべてと同じシミュレーションに基づいたティックのタイミングでキャプチャ・シリアライズ・デシリアライズ・適用を行います。 これらのオブジェクトに加えられた変更(理想的にはOnPreSimulateのタイミングセグメントで変更)が所有者とすべてのクライアントで実行順に決定論的に行われ、SyncObjectsと同じ遅延タイミングメカニズムを使用することが保証されます。
- **PackAttribute 派生クラスで定義して、カスタム圧縮メソッドでシリアライズ・デシリアライズを行うことができます。**ビットパッキングなどの圧縮、frameIdベースのキーフレーム/デルタフレーム、自動補間/抽出などを可能にします。
使用例:
[PackObject(
defaultKeyRate = DefaultKeyRate.Every,
defaultInclusion = DefaultPackInclusion.Explicit,
postApplyCallback = "",
postSnapCallback = "",
syncAs = SyncAs.State
)]
public class TestPackObj : NetComponent
{
[SyncHalfFloat(
applyCallback = "SyncAngleHook",
setValueTiming = SetValueTiming.BeforeCallback,
interpolate = true,
keyRate = KeyRate.Every
)]
public float syncedAngle = 45;
// Hooks are methods associated with a syncvar. They are called
// whenever the networked value changes.
public void SyncAngleHook(float newVal, float oldVal)
{
// Do something here with the newVal value
// This gets called on all clients when the networked
// value changes.
}
// This is the default SyncVarAttribute, which uses simple
// compression for the types it supports.
[SyncVar]
public Vector3 syncedV3;
// SyncRangedInt bitpacks ints by dropping unused upper bits.
// Supply the min and max allowed values and it will come up
// with the best compression values automatically.
[SyncRangedInt(-1, 2)]
public int syncedInt;
}
Pack Objects (SyncVars)
PackObjectAttribute
[PackObject] は、コード生成システムにクラス/構造体にシリアライズ拡張機能を作成する必要があることを伝えます。 コード生成エンジンは、クラス/構造体のフィールド上のすべての **[SyncVar]** Attributesを探し、NetMasterとNetObjectに自動的に結びつく自動同期化拡張機能を作成します。
DefaultKeyRate defaultKeyRate
値が変更されたか同課に関わらず、全アップデートが送信されるレートです。 ここを0に設定すると、キーフレームなしになり、値が変更されるとリライアブルで送信される必要があります。DefaultPackInclusion defaultPackInclusion
全てのフィールド、または明示的にSyncVarBaseAttributeを伴うフィールドのみをシリアライズ化するう必要があります。string postApplyCallback
このクラス・構造体内のコールバックメソッドです。全てのフィールドにアップデートが適用された後に呼び出されます。string postSnapCallback
このクラス・構造体内のコールバックメソッドです。全ての値が消費され新しいティックに適用された後に呼び出されます。SyncAs syncAs このクラス・構造体が全ての値をトリガーとして取扱う必要があることを示します。
- SyncAs.State: 通常の挙動。値は変更の際及びキーフレーム上にある場合に個別で同期されます。
- SyncAs.Trigger: 値が変更されると、このティックへの送信をトリガーし、後から全ての値がデフォルトにリセットされます。
SyncVarBaseAttribute
SyncVarBaseAttribute (および発生する属性)が、コード生成に、シリアライズ化・同期でPackObjectのどのフィールドを含むべきか伝達します。
int keyRate
キーフレームを送信する頻度。 キーフレームは、値が変更されたかどうかに関わらず、全アップデートを送信します。 これらのアップデートの間には、値が変更された場合にのみデータが送信されます。string snapshotCallback
新しいフレームがフレームバッファから取得され、前のスナップショット値が現在のステート(フィールド値)として適用された後に呼び出されるPackObject内部のメソッドの名前です。 snap (スナップショット) と targ (ターゲット)の値は新しい内挿の開始値・終了値です。 これは、新しいSnapshot値が適用される直前、applyCallbackが呼び出される前に発生します。 各ティックには snap 値が適用され、前の targ 値と置き換わり新しい targ 値がFrameバッファから取得されます。string applyCallback
値がリモートで変更され、その変更を反映した更新がローカルで適用される場合に呼び出されるPackObject内部の関数の名前。 setValueTimingは、このコールバックの前後でスナップショットの値がsyncvarに適用されるか、それとも自動的に設定されるかを示します。SyncAs syncAs
SyncVarの扱い方を示しています。- SyncAs.State 変更されるまで所有者の値を管理します。
- SyncAs.Trigger 値が所有者によりキャプチャされ送信されるタイミングをしまします。new()の操作でデフォルトにリセットされる必要があります。
SetValueTiming setValueTiming
applyCallbackとの関連で、スナップショット値をPack syncvarに適用するタイミングを示します。bool interpolate
Indicates if the SyncVar value should be lerped every update automatically when the value changes. Pack syncvarの値が変更されたときに、更新のたびに自動的に更新するべきかを示します。int bitCount
圧縮メソッドがビットカウント設定に対応している場合、ここで設定を行えます。これにより、このように多くのビットを使用する値をビットパックし、カウントから漏れた全てのビットを無効にします。
対応しているType
- byte, sbyte, short, ushort, int, uint, long, ulong, float, double, char
- string, StringBuilder
- Vector2, Vector3, Vector2Int, Vector3Int
- 上記のtypeのリスト<>(まだ実験段階です)