詐欺師に対処し、すべてのコードを書き換えない方法





数年前、War Robotsというゲームのプロトタイプが登場しました(当時はWar Robotsとも呼ばれていました)。 これは、戦術的なPvPジャンルでの最初のPixonicの経験でした。そのため、当初は将来の多くの問題がコードに記載されていました。 しかし、多くの困難(プロジェクトの人気が急速に高まっていたため、小さなチームが短時間でゲームのアーキテクチャを完全に変更することはできませんでした)にもかかわらず、最終的に不正行為者の数を最小限に抑え、元のコードのその他の欠点も修正することができました。 もう少しお話しします



WRの最初の実装では、権威主義サーバーを使用しませんでした。各クライアントは、独自にヘルスインジケーターを制御し、ネットワーク経由で他のプレーヤーに変更を送信しました。 リモートプロシージャコール(RPC)を使用してメッセージを転送しました。









Photon Cloud Serverを介してダメージを受け、それを他のプレイヤーに配信するときにRPCを使用して新しいヘルス値を送信する概略図。



このアプローチは、サーバー上のロジックを必要とせず、計算はクライアントで実行されたため、アーキテクチャーの観点から実装するのが簡単でした。 その結果、チームはゲームのパイロットバージョンをすばやく入手し、視聴者の興味を評価することができました。



もちろん、最終的には、フェアプレーの問題は深刻になりました。 クライアントが実際にすべての損害を記録するかどうかを直接制御することはできません。 そして、聴衆の成長に伴い、この問題はますます関連するようになりました。



「殺害」



「不滅の」プレーヤーの問題は、次の3つの状況で条件付きで説明できます。



  1. プレーヤーにネットワークへの接続に問題があります。 その結果、彼は単に怪我を「見ない」だけで、最新の状態を送信しません。 ゲームの残りの参加者にとっては、ターゲットへのヒットがいつでも遅延、不完全、または完全に欠落したかのように見えます。
  2. プレーヤーはインターネット接続を意図的に切断し(たとえば、アプリケーションを非アクティブモードにする)、着信による損傷を無視します。
  3. プレイヤーは別の方法でチートし、不滅になります。






この問題を解決するにはいくつかの方法があります。



  1. 不正行為者を探し出して禁止したり、さまざまな基準(戦闘の平均ダメージなど)で検索を自動化したりできます。 これを行うには、包括的なソフトウェア防御を構築する必要があります。これは、プレーヤーの行動や試合の他の側面に基づいて、不正なゲームを認識することができます。



    しかし、これはかなり時間のかかるオプションです。各プレイヤーのゲームプレイを監視するだけでなく、不正行為者が群衆から目立つようになる一連のルールを作成してテストする必要があるからです。
  2. 別の一般的なソリューションは、独裁的なサーバーです。 この場合、試合のロジック全体がサーバー上で動作し、射撃とダメージを完全に制御します。



    このアプローチを実装するさまざまな方法を考え、batchmodでUnityを起動するオプションも検討しましたが、プロジェクトでクライアントとサーバーのやり取りを完全にやり直す必要があったため、結局アイデアを放棄しました。


その後、問題を最小化する状況から別の方法を探し始めました。



何に来たの?



民主主義







既にプロトタイプに存在していたものと同じベースを使用しましたが、重要な点を1つ変更しました。サーバーの状態は、受信するすべてのデータに基づいてサーバーによって制御されるようになりました。



各クライアントは、自身だけでなく他のプレーヤーでもサーバーに損傷インジケータを送信しました。 次に、サーバーは顧客の現在の健康状態について決定を下し、定足数の証言を得て、それをプレイヤーに送信しました。 したがって、ローカルダメージカウントと権威主義サーバーの間には混合がありました。



すぐにこの方法の制限に注意する価値があります。 1対1のゲームでは機能しません。 2人のプレイヤーが証言に違いがある場合、どちらが真実を伝えているかは明確ではありません。



主なプラス-ネットワークコードをグローバルに書き換える必要がなく、同時に不正行為者の問題を解決することができたため、比較的「安価な」ソリューションでした。



アルゴリズム









実際、損傷アルゴリズムは条件付きで3つの部分に分割できます。



  1. すべてのプレイヤーの各クライアントによる損害の登録とこれらの測定値のサーバーへの送信。
  2. 被害指標の収集、集計、被害者の現在の健康状態の計算、および試合の全参加者への最終的な価値の分布。
  3. サーバーから現在の状態を取得します。


より詳細には、これは次のように発生します。各クライアントは各プレーヤーのヒットを追跡し、この損傷をサーバーに登録します。 フォームにヒットに関する情報を含むRPCメッセージがサーバーに送信されます。



メッセージには、被害者のID、損害のID、ショットのID、および損害自体が含まれます。 War Robotsでは、各シェルにクライアント間で同期される特定の識別子があることに注意してください。



次のステップは、サーバー上の損傷インジケーターの集約です。 サイズNのクォーラムが取得された後、クライアントの損傷インジケーターが集計されます。 最終ダメージがターゲットに適用され、新しい健康状態が戦闘のすべての参加者に送信されます。 概略的には、次のようになります。







したがって、これは権威主義的なサーバーではなく、各プレーヤーの単純なローカルダメージカウントでもありません。 その結果、1人でシステム全体を「ドロップ」することはできません。 もちろん、彼は損害を修正しようとするかもしれませんが、完全にそれを回避することはできません。



もちろん、このソリューションは理想的ではありません。 主な問題は、各ショットのIDを同期する必要があることです(これは別の問題です)。 しかし、新しいダメージ計算システムを導入した後、不正行為について不平を言っているプレイヤーに起こったことは次のとおりです。





青いグラフ-不正行為に対するプレーヤーの苦情の数



もちろん、WRの作業は継続されますが、このストーリーから学んだ主なことは、教科書の既製の回答に常に依存するべきではないということです。 プロトタイプの作成から既存のプレーヤーのベースの維持まで、各段階で、現在のタスクとニーズから進めました。



数年前にすべてが「すぐに」すぐに行われた場合、いくつかの間違いを回避できたかもしれませんが、ゲーム自体は単に起動しなかった可能性があり、リソースが消費されていました。



All Articles