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

Core Sync Components

以下は、シーンにドロップすることができ、ほとんどの状況で動作する既製のコンポーネントです。 すべての Syncコンポーネントは Sync Objectベースクラス、または状態バッファ処理を含むSyncObjectTFrameベースクラスから派生しています。

目次

SyncObject

これはすべてのSyncコンポーネントのベースクラスです。 このベースクラスをSimple システム全体に結びつける必要はありませんが、コンポーネントを作るための良い出発点になります。

トップに戻る

Common Fields

SyncTransformSyncStateSyncAnimatorなどのコンポーネントはすべてSyncObjectクラスから派生しています。 これらのオブジェクトは NetMaster のコールバックタイミングシステムに自己登録します。

同期コンポーネント間で共有されているフィールドは以下の通りです。:

トップに戻る

Apply Order

変更しないことをお勧めします。

ほとんどの SyncObject はこの値を内部的に定数で設定しており調整できません。 ネットワークオブジェクト上のコンポーネントが実行される順番で、低いものからです。 コンポーネントの順番に関係なく、特定のことが常に最初に起こるようにします。 トランスフォームやアニメーターの設定によっては、どちらか一方を先に実行したい場合もあります。 コンポーネントが同じ Apply Order値を持っている場合は、ゲームオブジェクト階層内の順序が使用されます。

トップに戻る

Keyframe Rate

Keyframe Rate Slider

これらのSyncObject コンポーネントは、単一方向のブロードキャスト (Owner -> Others) を使用します。 そのため、キーフレームを使ってデータを減らすことができます。 同期されたオブジェクトの要素に変更が発生しなかった場合、更新のたびに同じデータを送信するのではなく、内容がないことを示す1ビットのfalseフラグを送信します。 遅れて参加したプレイヤー(PUN2の場合には)は少しの間、古い値を受信する可能性があります。 デルタフレームを使用する際、キーフレームにより最終的に一貫性が保証します。 値が大きいほどデータの節約になりますが、パケットロスが発生したときの正常でない動作が起こる可能性も高くなります。

帯域幅に注意する必要がない場合はこの値を1に設定するとすべてのアップデートに完全な圧縮状態が含まれます。 キーフレームを0に設定すると、値が変更された際にのみデータが送信され、すべてのコンポーネントに対して送信されるティックアップデート全体が強制的にリライアブルなものになります。

トップに戻る

Always Ready

これを有効にすると、このSyncObjectは完全な更新を待たずに自身をReadyとマークします。 無効にすると、この SyncObjectはnot-readyと報告し、NetObjectはINetObjectReadyコールバックで自身を Readyと報告することができなくなります。 Ready は、オブジェクトがユーザに表示されるのに十分同期されていることを示します。

トップに戻る

SyncObject<TFrame>

SyncObjectから派生したものです。ステートバッファのデフォルト処理が追加されます。 TFrame型はSyncObjectのステートのフィールドを定義することができるFrameBaseクラスから派生したものである必要があります。

トップに戻る

SyncState コンポーネント

State Sync コンポーネント

このコンポーネントは、NetObjectのステート情報の取り扱いを標準化し、同期化します。以下に例を示します。:

  • 可視性
  • 他のNetObjectマウントへの添付
  • 所有者の変更
  • デスポーン/リスポーン

SyncStateは必須のコンポーネントではありませんが、SyncSpawnTimerのような他のコンポーネントがSyncStateフィールドを具体的に利用している場合は必要になるかもしれません。

SyncStateSyncTransformおよびSyncOwnerとインタラクトして、適切なテレポート処理で親/マウント/所有者の変更を同期します。

開発者は、以下のメソッドを使用してSyncStateとインタラクトします。

  • QueueStateChange() - 状態変更をキューに入れ、次のCaptureCurrentStateのタイミングまで適用を延期します。 これは、より良い決定論的な順序を保証するため、一般的に推奨される方法です。
    • ChangeState() - ローカルで即座にステート変更を適用しますが、次のネットティックまではキャプチャ・同期されません。

トップに戻る

SyncSpawnTimer コンポーネント

Sync Spawn Timerコンポーネント

OnStateChangeイベントに応答するSyncStateのヘルパーコンポーネントで、自動的にスポーン・リスポーン・デスポーンのタイマーをトリガーします。

トップに戻る

OnStateChangeToggle コンポーネント

On State Change Toggleコンポーネント

トップに戻る

SyncTransformコンポーネント

PhotonTransformViewのSimple版です。Transform TRS値のステート同期に使用します。

Sync Transformコンポーネント

トップに戻る

Interpolation(内挿)

  • None - オブジェクトは、ラープを行わずに、ネットワーク状態にスナップします。
  • Linear - 基本的な Lerp/Slerp は、ネットワーク化されたフレーム間の内挿に使用されます。 通常はこれを使用します。
  • Catmull Rom - (実験的) 基本的なラープよりも自然にカーブした正確なパスを生成します。3点を使用するより複雑なラープです。

トップに戻る

Extrapolate Ratio(外挿率)

Extrapolation occurs when the tick advances but no frame info has arrived yet on clients for this object. The synced object now has to guess what the next frame's values are. Extrapolation uses the last two values to extrapolate the new frame. The Ratio is the t value used by LerpUnclamped and acts as a dampener of extrapolation. So for sequential missing frames the extrapolation gets reduced on a curve.

  • 0.0 = no extrapolation - object will not move on empty buffer.
  • 0.5 = evenly dampened - object will lerp less with each tick.
  • 1.0 = full extrapolation - no damping, will extrapolate until a frame arrives or object is destroyed (disconnect).

トップに戻る

Teleport Threshold(テレポートしきい値)

テレポートのトリガーとなるフレームアップデート間の距離を単位で指定します。 これは、他のトランスフォーム同期ツールとの互換性を保つために存在します。 テレポートはゲームによって異なる意味を持つことがあるので、テレポート処理を自分でコーディングするのが理想的にはでしょう。

トップに戻る

Teleport Reliable

テレポートの発生時、このクライアントの全体的な送信ティックがリライアブルになるように強制します。

トップに戻る

Transform Crusher

TransformCrusherをご覧ください。

TRSデータ(位置、回転、スケール)はTransform Crusherライブラリで圧縮されます。これについては専用ドキュメントがあります。

Element Crusher の詳細は Transform Crusher documentationをご確認ください。

トップに戻る

IOnTeleport.OnTeleport()

SyncTransformは、IOnTeleport コールバックインターフェースを使用しています。これによりSyncStateなどのコンポーネントはオブジェクトがテレポートされたことを SyncTransformに通知することができます。 オブジェクトをテレポートしたいときは、手動で OnTeleport() を呼び出すことができます。

テレポートを行うと、内挿やツイーン処理が一時的に無効になり、オブジェクトをラープなしで1ティックで長距離移動させることができるようになります。 これを行うには、オブジェクトを新しい位置に移動する前に OnTeleport() を呼び出してください。

GetComponent<SimpleSyncTransform>().OnTeleport();

すでにトランスフォーム同期コンポーネントへの参照がキャッシュされている場合:

cachedSyncTransform.OnTeleport();

SyncTransformは現在のトランスフォーム状態をキャプチャし、次の送信状態をテレポートとフラグを立てることでこれに応答します。 その送信フレームには、テレポート前の値とテレポート後の値の2つのトランスフォーム状態が含まれます。 両方の値を持つことで、テレポートが発生したときにオブジェクトが1ティックの間フリーズすることなく、正しく補間を行うことができます。

テレポートされているオブジェクトを移動する前に呼び出してください。

トップに戻る

SyncAnimatorコンポーネント

PhotonAnimatorViewの主要な代替コンポーネント。

Sync Animatorコンポーネント

トップに戻る

Index Animatior Names

このコンポーネントの主要な圧縮方法の一つは、すべてのステートとトリガー名のインデックス化です。更新のたびに 32 ビットのハッシュ値を送信するのではなく、はるかに小さい (1-5 ビット) インデックスが送信されます。

インデックス作成は裏で自動的に行われますが、常に実行されるとは限りません(ビルドプロセス中に強制することができないため)。 このボタンを押すように促す警告がログに表示されることがあります。 特にAnimator Controllerに変更を加えた後は、このボタンを押しておくことをお勧めします。

実行時にインデックスが見つからなかった場合は、32ビットハッシュを全て送信することに戻ります。 これでも動作しますが、ネットワークの使用量は増加します。

トップに戻る

Sync Pass Thru Methods

このコンポーネントを介して SetTrigger()、Play()、CrossFadeInFixedTime() などを呼び出すと、これらの呼び出しをネットワーク化して、ローカルでアニメーターにコマンドを渡します。 これにより、比較的低いネットワーク負荷(通常は1バイト以下)で、最良の同期結果が得られることがあります。

トップに戻る

Sync States

アニメーターの「スナップショット」ステートを同期させ、これを有効にするとクライアントとの合意を確実にするのに便利です。 通常、パススルーメソッドやパラメータを使用している場合は必要ありません。

トップに戻る

Sync Layers

レイヤーを同期させたい場合は、オンにしてください。 データを保存しない場合は無効にしてください。

トップに戻る

Sync Layer Weights

レイヤーのウェイトをアニメーション化している場合、これを有効にしてください。 アニメーション化を行わない場合は、データと処理時間を節約するために必ずオフにしてください。

トップに戻る

Sync Parameters

同期するパラメータをグローバルまたは選択的に設定することができます。 内挿、外挿、デフォルト値を設定することができますが、通常はデフォルトのままにしておきましょう。

トップに戻る

Compress NormalizedTime/LayerWeights

正規化された値が使われている場所(normalizedTime と layerWeights)では、これらを圧縮幅に応じたオプションが用意されています。 Half 16がフェイルセーフです。 これより低い値で設定して、アーチファクト前に最低値を確認できます。

トップに戻る

SyncAnimatorの詳細パラメータ設定

(上級/プロ/超上級ユーザー向け)

Sync Animator Advanced

Use Global Settings*disabled*に設定されている場合、各パラメータに独自の圧縮設定を設定することができます。

Sync Animator Advanced Individual

パラメータごとの設定は見栄えが良くありませんが、どのパラメータが同期されるかを具体的に知ることができ、どのように内挿、外挿されているか、デフォルト値は何か(内挿/外挿設定に必要な場合)を示すことができます。

利用可能な場合、IntとFloatの基本的な圧縮設定オプションは2行目に表示されます。設定オプションは以下の通りです。:

トップに戻る

Int圧縮

  • Pack Signed - 値がゼロに近いが、実際にどのくらいの高さや低さになるかわからない場合に便利です。 これはデフォルトのコーデックで、常に動作します。
    • Pack Unsigned - 数値が正数のみだとわかっている場合、符号ビットのZigZag演算をスキップするため、PackSignedよりも優れています。
    • Range - intの範囲がわかっている場合、ベストな圧縮になります。 最小値と最大値を指定するだけで、残りの値はコンプレッサが処理します。 指定された範囲外の値はクランプされます。

トップに戻る

Float圧縮

  • Full 32 - 圧縮なし。 これは使用しないでください。
  • Half 16 - float32に比べて精度が大幅に低下しますが、ほとんどの場合はこれで十分です。 これはデフォルトの floatコーデックです。

    • Range - floatの範囲が分かっている場合、ベストな圧縮になります。 最小値と最大値、圧縮を制限したいビット数を指定してください。 指定した範囲外の値はクランプされます。 BitsXの設定を変えて、良い結果が得られる最小値を見つけてください。 将来的に、精度を示すためにコンテキスト情報を追加するかもしれません。
    • Accurate Center toggle - ビットの性質上、圧縮には常に偶数の量子化ステップが存在します。 Accurate Centerを有効にすると、圧縮範囲を1減らして奇数のステップ数を作成します。これにより、ロスの多い圧縮後にminとmaxの間の値を正確に再現できるようにします。

    デフォルトでは、トリガーはパラメータとして同期されません。 これらは完全性を確保するためだけに含まれています。

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