私は、一般的な発射体の発射とゲームネットワーキングの同期に関する一般的な問題のある種の解決策を見つけようとしていますが、何が最適かはわかりません。
これは、いくつかの発射体(インスタントヒット武器なし)を備えた2Dアクションサイドスクローラーであり、すでに多くのフレームワーク(C#XNAフレームワークおよびLidgrenライブラリ)が配置されています。
現時点では、アーキテクチャは半減期のソースエンジンと同様にモデル化されると思います。クライアントは、過去に約100msまたは約3フレーム(固定ステップ30fps)で、クライアント側の予測を使用してリモートエンティティを補間します。サーバーにはシミュレーションに対する権限があります。動きを使って実装をコーディングすることを考えるのは問題ないようですが、発射物に関しては、すべてのプレーヤーに最高のゲームプレイを提供するためにどのように最適に機能するかわかりません。
問題の例:
クライアントA
クライアントB
サーバー
- クライアントAとBは向かい合って立っています。
- クライアントBはAに向かって発砲し始め、通常どおりサーバーに入力を送信します。サーバーは火災入力を検出し、イベントをクライアントAに中継している間、シミュレーションで武器の発射を開始します。
- クライアントAはメッセージを受信しますが、過去にクライアントBを補間しています(その間、発射体はサーバーとクライアントBのマシンでAに向かっています)。
- クライアントAのレンダリングは、最終的にBが発射物を発射するポイントに到達し、レンダリングを開始します。
- クライアントAはそれを見てジャンプし、画面上で簡単にクリアします。ただし、発射体はサーバーとクライアントBの観点から彼に命中します。
これも2D横スクロールなので、すべてが表示されます。
ネットワーク遅延がなくても固有の補間遅延があるため、これは補間を使用することの基本的な副作用のようです(これは必須だと思いますが、提案を受け入れます)。
質問:
完璧ではないかもしれませんが、これを難読化または改善して見栄えを良くしたり、シームレスに見せたりするために実装できる方法は他にありますか、それとも明らかなものが欠けていますか?武器の発射には、発射物が実際に発射されるまでのアニメーション時間が短いので、その時間を使用して待ち時間の一部を隠すことができますが、武器は即時発射ではなく、どのように見ても常にあります発射物をかわそうとしているクライアントや、発射物がそれらに当たるのを見る他のクライアントとのこの大きなギャップになります。
プレイヤーが動いている場合にサーバーでラグ補正を使用できますが、それがこの状況に役立つとは思いませんか?
発射物のヒットによってクライアントAの位置が変更された場合は、クライアントAを巻き戻して新しいデータで入力を再生する必要があります。そうでない場合は、発射物を空中から削除する必要があります(おそらくそれらは死にます)。どちらにしても :(。