(Unity)多くの移動オブジェクト用に最適化されたネットワーキングソリューション


8

私は現在、かなり野心的なプロジェクトに取り組んでいます。要するに、それはバクテリアの力学を持つリアルタイムのマルチプレイヤー戦略ゲームです。

基本的に、私は環境内に2人のリモートプレイヤーがいて、彼らはバクテリアのようなユニットをスポーンさせて、お互いに攻撃して増殖し、リソース制限に達するまで自分自身を複製することができます。これにより、約200以上のゲームオブジェクトが画面にレンダリングされ、それぞれに独自の状態と動きがあります。これは悪いように聞こえますが、ボットに対するローカルのゲームプレイは実際には非常に優れており、私はそれを非常に高性能にすることができました。

ただし、このゲームをネットワーク化しようとすると問題が発生します。私はすでにこのガイドに従ってこの機能を実装しようとしました:http : //www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

これにより、最高のレイテンシであっても、非常に遅く、不快なゲーム体験が生成されます。これはおそらく、数百のユニットの移動データを送信する必要があるために発生します。

私が提起している質問:

2つのクライアント間の多くの移動ユニットのネットワークと同期を最適化するにはどうすればよいですか?

これを行う方法の1つはすでに考えました。ユニットをスポーンした後、何かに当たるまで一方向にのみ移動します-おそらく、ユニットがスポーンされたときと、別のオブジェクトと相互作用したときにのみ同期できますか?これには多くのメリットがありますか?これを実装する理想的な方法は何ですか?

回答ありがとうございます!


ロックステップモデルは私が必要としているものでしょうか?clintonbrennan.com/2013/12/lockstep-implementation-in-unity3d
レイチェルキャボット

私はファイアウォールの背後にいて、リンクした例にアクセスできませんが、各フレームのオブジェクトID、位置、速度ベクトルのみをシリアル化してみましたか?シリアライゼーションアルゴリズムをどの程度うまく利用できるかによって、状態情報をオブジェクトあたり7バイトに減らすことができます。クライアントが更新からの欠落IDを死と見なし、新しいIDをスポーンと見なすようにした場合、問題は発生しません。
Stephan

回答:


1

200以上の移動オブジェクトの場合、ゲームのロックステップを確実に作成する必要があります。ロックステップでは確定性が必要になりますが、バクテリアにとっては難しくありません(これは、円と円の衝突でシミュレートできます)。

私の恥知らずなセルフプラグインを気にせず、ロックステップゲームのネットワーキングとシミュレーションロジックの例が必要な場合は、このアセットを無料でチェックしてくださいhttps : //www.assetstore.unity3d.com/en/#!/ content / 36206。残念ながら、そのバージョンにはすべてのソースコードが含まれているわけではありませんが、私の祝福で自由にハッキングできます;)DPhysicsの初期テストのビデオは次のとおりです:https : //www.youtube.com/watch?v= NEzOghxfMdU 。

ロックステップの要点は、出力ではなく入力を同期することです。これは、同期シミュレーションでは、すべてのクライアントが知らない唯一のことは他のクライアントの入力であるためです。コメントでリンクした記事は、それをかなりよく説明しています。ロックステップについてどの程度詳細に説明してほしいかわからないので、ここでは省略して、他にご不明な点がありましたら、この回答を展開します。

更新:サーバーがゲームの状態ではなく入力を送信することを除いて、それを正式なサーバーと考えてください。すべてのプレーヤーが入力から自分のゲーム状態を生成できるため、サーバーがゲーム状態を配布する必要はありません。


1
このアプローチは、共有されている入力間のレイテンシのために、すべてが確定的である場合でも、非同期化につながる可能性があります。例として、プレイヤーが壁を配置することによってオブジェクトの動きをブロックしようとするゲームを考えてみましょう。1人のプレーヤーの画面で、彼は配置のタイミングを正しく設定している可能性があり、オブジェクトはブロックされています。しかし、それを他のクライアントに複製することは遅れて到着する可能性があり、壁が配置されると、オブジェクトはすでにその場所を通過しています。ゲームの仕組みによっては、「全体像」の更新を定期的にクライアントに再同期する必要があります。
Acidictadpole 2015

いい視点ね。これが正しく行われた場合、非同期化の可能性はありません。パケットが失われたり非常に遅くなったりした場合、クライアントは次のフレームに進むことができません。現在のフレームを実行するには、パケットが到着するまで待機する必要があります。フレームは整数で表すことができます。サーバーは、フレームごとに整数でマークされたパケットを配信します。
JPtheK9 2015

ネットワーキングとフレームロジックを自分で確認してください。
JPtheK9 2015

1
@ JPtheK9「現在のフレームを実行するには、パケットが到着するまで待つ必要があります」そして、パケットが来ない場合はどうなりますか?
Stephan

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