Lag Compensation
はじめに
遅延補正は、テンポの速いネットワークゲームにおける基本的な問題(クライアントを信頼できないまま、クライアントにWYSIWYGの体験をさせること)を解決するものである。
問題は、ネットワーク上のどのマシンも、ゲームの中で全く同じ時間にいるわけではないということです。あるクライアントが見ているものや行動の根拠は、そのクライアントにとって100%正しいものでしかありません。典型的な例は、遠くにある物体への正確な射撃を検出する場合です。クライアントは標的を直接狙っていますが、実際には標的はすでに移動しています。
- もし、権威あるサーバーが自分の世界認識のみに基づいて当たり判定を行うならば、誰も意図的に何かに当たることはないでしょう。
- もし、クライアントに権限が与えられ、何に当たったかをサーバーに伝えることができると、ゲームを破壊するような悪意にさらされてしまいます。
ラグ補正により、サーバーは各クライアントの視点から世界を一時的に見て、実際に不可能なはずのショットを打てる位置にいたかどうかを判断することができます。クライアントも、壁の後ろなどの安心な場所に避難しているつもりが打たれてしまったことになりますが、これは比較的目立ちません。
Fusionは、過去にHitBox
が置かれた場所の履歴を保持しており、各クライアントの視界が現在のサーバーの状態と比べてどのくらい遅れているかを把握しています。この履歴を利用して過去にレイキャストすることで、ラグ補正レイキャストを行うことができます。( 注意: クライアントは、自分が入力権限を持っているオブジェクトについてのみ、サーバーよりも先に進みます)
超高精度を実現するために、Fusionはラグ補正をさらに一歩進めました。AAAゲームのフレームレートは、通常、ネットワークのティックレートよりも高くなっています。プレイヤーが実際に画面上で見ているものは、通常、個別の刻みではなく、2つの刻みの間の補間になります。Fusionでは、遅延補正されたレイキャストが2つのティックの間のどのくらいの距離で行われたかを正確に把握しているので、これを利用してサブティック精度のレイキャストを行うことができます。
ラグ補正機能
Fusionを使っているゲーム開発者にとって必要なのは、通常のUnity Collidersの代わりに、あるいはそれに加えて、あらかじめ組み込まれた HitBox
コンポーネントだけです。
HitBox
ネットワーク化されたゲームオブジェクトに遅延補償付きのHitBoxを設定するには、次の2つのステップが必要です。
ゲームオブジェクトの最上位ノードに、
HitBoxRoot
コンポーネントが必要です。HitBoxRoot
は、その子にあるすべてのHitBox
コンポーネントをグループ化するための手段となります。HitBox
ノードは、すべてのダイナミックオブジェクトに対して、通常のUnityのCollider
コンポーネントとは別のレイヤーに置くべきです。これは、レイキャスティングの際に、ダイナミックなColliderとHitboxを分離するための、最速かつ唯一信頼できる方法です。この分離により、ラグ補正されたレイキャストがすべての静的ジオメトリにヒットするようになりますが、その一方で、負荷のかかるHitBox
コンポーネントの追加を避けることができます。同時に、すべての動的なヒットは、HitBox
にのみ依存すべきですが、動的なColliderを完全に取り除くことは、オブジェクトがPhysXとうまく相互作用するために必要であるため、うまくいきません。中間的な方法としては、遅延補正されたレイキャストによって無視できるレイヤーにダイナミックコライダを置いておくことです。
追記: 1つのHitBoxRoot
につき、31個のHitBox
ノードが制限されています。1つのオブジェクトやプレハブにそれ以上の子ノードが必要な場合は、階層を分解して複数のルートに分散させる必要があります。
Hitbox階層の具体的な構造は、特定のゲームのニーズに完全に依存します。
レイキャスト
遅延補正された物理クエリをサーバー上で実行するのは、組み込みのPhysXレイキャストと同様に簡単で、オーバーラップのチェックにも対応しています。ネットワーク上のゲームオブジェクトに、Fusionのビルド済みのHitbox
コンポーネントを追加するだけです。
APIは、ラグ補正されたデータとPhysX内の静的レベルデータの両方を照会するためのものです。
Runner.LagCompensation.Raycast(transform.position, transform.forward, 25, Object.InputAuthority, out var hit);
パラメーター Object.InputAuthority
は Fusion がこのヒットスキャン/発射物をコントロールしていることを示します。レイキャストは、それを制御していた特定のプレイヤークライアントが見ていたタイムフレーム に一致するデータに対して行われます。これらの処理はすべて自動的に行われるので、複雑な計算をする必要はありません。