コンポーネントを同期する
TSMP に送信するオブジェクトにこれらのコンポーネントを追加します。
これらのコンポーネントのいずれかを追加、削除、または移動した後、Apply Setup を実行します。
変換同期
ゲームオブジェクトの位置、回転、スケール、およびオプションの Rigidbody の移動には TSMPNetworkTransformSync を使用します。
次の用途に使用します。
- 小道具の移動。
- 物理オブジェクト。
- 送信者に従う必要がある単純なシーン オブジェクト。
- 連続受信補間のテスト。
重要な設定:
| 設定 | 意味 |
|---|---|
| ターゲット | 同期して変形します。空の場合、デフォルトでコンポーネント変換になります。 |
| ローカルスペースを使用する | ワールド変換の代わりにローカル変換を送信します。 |
| リジッドボディの同期 | Rigidbody が存在する場合は速度と角速度も送信します。 |
| 圧縮モード | 精度を犠牲にしてペイロードサイズを削減します。 |
物理学がオブジェクトを駆動するときに Rigidbody 同期を有効にします。これは、落下物や重力による物体の揺れを回避するのに役立ちます。
Sync Rigidbody は、Rigidbody がある場合に速度と角速度を送受信し、受信した位置・回転も Rigidbody に適用します。受信側で無効にするとローカルの速度と角速度を維持し、Transform の位置・回転・スケールは引き続き同期します。Discrete と Continuous の両方に適用されます。無効化時に保留中の速度補間目標も破棄するため、再有効化後の速度更新は次の受信パケットから再開します。質量・重力・Kinematic はローカル設定で、このコンポーネントでは送信しません。
ヒューマノイドのポーズ同期
人型 Animator リグには TSMPNetworkHumanoidPoseSync を使用します。
次の用途に使用します。
- 人型キャラクターのアニメーションをミラーリングします。
- 選択した人型ボーンを送信します。
- ローカルまたはワールド空間でルート モーションを送信します。
インスペクターには人型リグ セレクターが表示されます。デフォルトの選択から始めて、ペイロード サイズを減らす必要がある場合にのみボーンを削除します。
根元の動きが正しいように見えても、手足が硬くなったり遅れたりする場合は、次のことを確認してください。
- アニメーション化された体のパーツが選択されています。
- レシーバー リグは人型であり、一致するボーンを備えています。
- ペイロード容量を超えていないこと。
- トランスポートはフレームをドロップしていません。
VRChat アバターポーズ同期
ライブ VRChat プレーヤーのポーズ データをミラーリングする場合は、TSMPNetworkVrchatAvatarPoseSync を使用します。
外部 IK パッケージに依存せずにレシーバー リグを完全なヒューマノイドのポーズに従わせたい場合は、フル モードを使用します。受信側のアバター リグに IK ソリューションがある場合にのみ、より小さいトラッキング ポイント セットアップを使用してください。
このコンポーネントは、プールからアバター インスタンスを生成または再利用できます。複数のプレーヤーでテストする前に、アバター プレハブとプール ルートを割り当てます。
フル モードでは、トランスフォームまたはブレンド シェイプ同期よりも多くのペイロード容量が必要です。複数のプレーヤーでテストしているときに、payload と loss を TSMPDebugCanvas で確認してください。
ブレンドシェイプの同期
表情やメッシュ シェイプ キーには TSMPNetworkBlendShapesSync を使用します。
実際に必要なブレンド シェイプを選択します。すべてのブレンド シェイプを送信すると、特に多くのシェイプ キーを持つアバターの場合、すぐにペイロード容量を浪費する可能性があります。
受信機は、選択されたブレンド形状リストをホワイトリストとしても使用します。受信したキーが受信側で選択されていない場合、そのキーは無視されます。
アニメーターの同期
送信者に従う必要がある選択したアニメーター パラメータまたはレイヤー状態には TSMPNetworkAnimatorSync を使用します。
良い候補者:
- ブール値またはトリガーのようなゲームプレイ状態。
- 表示可能なパラメータの小さなセット。
- 正確なタイミングが重要な場合のアニメーター レイヤーの重みまたは正規化された状態。
表示される出力に影響を与えないパラメータの送信は避けてください。
タイムライン同期
TSMPNetworkTimelineSync は PlayableDirector の Timeline 再生状態と時刻を同期します。
受信機が再生/一時停止およびタイムライン時間に従う必要がある場合に使用します。送信者と受信者の間でディレクターのセットアップの一貫性を保ちます。
両側に Timeline アセットを設定した PlayableDirector を指定してください。空欄の場合は同じ GameObject から Director を探します。Timeline の内容、長さ、トラックのバインディング、Wrap Mode、Update Mode は送信されないため、両側で一致させてください。
| Receive Interpolation | 動作 |
|---|---|
None | 受信パケットを無視し、進行中の補正を取り消します。ローカル再生自体は停止しません。 |
Discrete | 再生状態を即座に適用し、時間差が Time Apply Threshold(秒)を超えた場合に位置を合わせます。 |
Continuous | パケット間も Continuous Interpolation Rate に従って再生時刻のずれを滑らかに補正します。ループ境界では短い方向に補正します。 |
最初のパケットと再生状態が変わるパケットでは、閾値に関係なく正確な位置を適用します。一時停止中の位置も即座に適用します。Stop パケットを繰り返し受け取っても Director の graph は再作成しません。Manual Update Mode の場合は受信位置だけを補正し、再生時刻を自動では進めません。Continuous は映像配信の遅延を取り除いたり、Timeline Signal を個別に同期したりする機能ではありません。
通常の Unity では Director の実際の再生状態を読み取ります。一時停止中に時間を変更しても再生中とは判断せず、同じ時間を二度取得しても一時停止とは判断しません。
VRChat では Director を直接呼び出さず、送信側の TSMPNetworkTimelineSync.Play()、Pause()、Resume()、Stop() で制御してください。Udon には Director の再生状態や PlayableGraph を取得する API がないため、playOnAwake を初期状態としてこれらのコマンドを追跡します。外部スクリプトによる直接操作やタイムラインの自動終了は確実には検出できません。シーケンス終了時には意図に応じて Stop() または Pause() を呼び出してください。再生時間は引き続き Director から取得します。
Scripting API の Timeline 制御も参照してください。
ゲームオブジェクトの切り替え
TSMPNetworkGameObjectToggle は、TSMP RPC を切り替える単純な対話可能なオブジェクトとして使用します。
RPCTarget.All を使用したループバック テストの場合、ローカルの切り替えはすぐに発生し、デコードされた切り替えはストリームの遅延後に再度発生する必要があります。
これは、使用するペイロードが非常に少なく、遅延した RPC の動作を簡単に確認できるため、最初の機能テストとして推奨されます。