2人のレーシングプレーヤーの同期を保つにはどうすればよいですか?


8

私は、テンプルランのマルチプレイヤーバージョンのように、Unityモバイルゲームに取り組んでいます。モバイルプラットフォームが原因で、ネットワークのレイテンシが変動している(通常は200〜500ミリ秒)ように見えます。

2人のプレイヤーキャラクターは同じパスに沿って走っているように示され、障害物を通過するために単純なアクション(ジャンプ、スライド、パワーアップなど)を実行する必要があります。

メッセージが遅れると、ゲームはリモートプレイヤー障害物を通過したと見なします。これは通常はうまく機能しますが、プレイヤーが障害物によって殺された場合、リモートプレイヤーがローカルプレイヤーと同じ障害物/位置で死んでいるように見せたいです。レイテンシが原因で、リモートプレーヤーは、死を告げるメッセージが届く前に障害物を越えたように見えます。

プレーヤーの同期を維持するにはどうすればよいですか?


死のメッセージが届いたらすぐにリモートプレーヤーをローカルプレーヤーの死の位置に戻してみました。視覚的に不自然に見え、他の同期の問題が発生する可能性があります。

回答:


10

問題分析

高遅延接続を介したリアルタイム通信は明らかに不可能です。

もちろん、錯覚を試すこともできます(まだ知られていないときに、リモートプレーヤーが障害物を通過したように見せることによって行います)。その錯覚が失敗すると(リモートプレイヤーが実際に障害物を通過せず、代わりに死亡したときのように)、もう何もできません。

問題

錯覚の失敗が本当に悪いように見える場合(ここなど)は、事実を受け入れ、実際の状況を表現するために最善を尽くす方が簡単かもしれません。

可能な解決策

彼らの決定が伝播するのに時間がかかっている場合、文字通り他のプレイヤーの速度を落とすのはどうですか?

解決策

各プレイヤーには他のプレイヤーの画像が表示されますが、決定メッセージがまだ空中にある障害物に近づくと、その画像の速度が低下します。メッセージが受信されると、障害物を通過または失敗したように見えます。障害の後で、画像は追いつくために再び加速し、必要に応じて次の画像のために再び減速します。

低レイテンシ接続では、決定はすぐに届き、速度の低下と速度の向上は無視できます。高レイテンシの接続では、これはなり、他のプレイヤーが遅れているように見える作る、しかし確実に、より重要な「この障害物を通過した」のゲームの状態は、両方のプレイヤーのために一貫しています。


お返事をありがとうございます。私たちはすでにあなたが提案した潜在的な解決策を試しましたが、次の理由によりそれが実現可能であるとは思いませんでした:1.最初の理由は私のゲームの高速です。200ミリ秒のウィンドウをカバーするには、リモートプレーヤーを1/4の速度に減速する必要があります。これにより、プレーヤーが並んで走っている場合に、非常に不快で目に見える視覚異常が発生します。2.遅延が変動するため、障害物を通過する前にメッセージが到着することを保証するリモートプレーヤーの速度低下を計算することは非常に困難です。
Zohaib Javed 2014

2
@ZahaibJaved多くの場合、唯一の実際の解決策は、アニメーションを通じてレイテンシを隠すことです。障害物に近づくにつれて速度を落とすのではなく、端で完全に停止し、再生に1秒かかる「ジャンプの準備」アニメーションを実行することを検討してください。「彼らはそれを作った」パケットが到着したら、実際のジャンプを実行し、実際の位置に転送します。
BlueRaja-ダニーPflughoeft 14

返信が遅れて申し訳ありません。したがって、私が実装したソリューションは、最初のカットシーンにあり、すべてのプレーヤーが見える場所で再生されます。ローカルプレーヤーは常に1位です。カットシーン終了後。すべてのリモートプレーヤーを十分に後ろに移動するだけで、ローカルプレーヤーが特定の障害物で死亡した、またはパス上をスライドまたは正しくジャンプしたという情報を受け取る時間を確保できます。そして最終的には、プレーヤーを再び同期する直線的なパスがあります。その結果は正しく表示されます。
Zohaib Javed 2014

4

Ankoの答えを補足するために、障害のに障害の障害の結果を追加することにより、ゲームデザインを少し変更できます。たとえば、ジャンプの失敗は泥の水たまりに着陸し、プレイヤーを失格とします。このようにして、他のプレーヤーは泥の中の他の落下を見て失敗に気づきますが、失敗したプレーヤーはすぐにそれを見ます。

ここに、この問題についての素晴らしいブログ投稿があります(最近ではありませんが、非常に興味深いものです):Darrin WestのTime Management and Synchronization


1

ローカルプレーヤーがリモートプレーヤーの死の正確な位置を知ることは重要ですか?リモートプレーヤーが障害物の1つを飛び越えられなかったために死亡したとします。

死んだプレーヤーはすぐに彼らの死を確認し、事故の場所から継続します。ここには魔法のようなものはありません。

ローカルプレーヤー(まだ生きていて蹴っているプレーヤー)は、リモートプレーヤーが障害物を無事に通過するのを見ます。死の通知が届きます。リモートプレーヤーは、足でつまずき、落下し、ゆっくりと消えていきます。次にリモートプレーヤーの位置がわかると、プレーヤーはその正確な位置にフェードインし、通常どおり実行されます。このような設定では、プレイヤーはレイテンシを認識しますが、レイテンシはぎくしゃくと現れたり消えたりするプレイヤーではなく、ゲーム要素(つまずき)として表されます。

2人のプレーヤーの速度が一定で、走行軌跡が事前定義されており、落下からの回復にかかる時間がわかっている場合は、フェージング/消失の部分を完全になくすことができます。リモートプレーヤーが障害物の1つで死んでいるところを想像してみてください。通知が届いたとき、そのローカル表現はまだ実行中です。プレーヤーはすぐにつまずきます。彼らが立ち上がって再び走り始めるには時間がかかります。実際には、彼らが障害物で死にかけているのが見られたのと同じくらいの時間がかかります。したがって、それらが再び稼働すると、ローカル位置とリモート位置の両方が同期されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.