Unity を検索

事実か、虚構か。ネットコードに関する 3 つの誤解を解く

2021年12月1日 カテゴリ: ゲーム | 11 分 で読めます
netcode unity gaming services
netcode unity gaming services
シェア

Is this article helpful for you?

Thank you for your feedback!

マルチプレイヤーゲームの制作と出荷は簡単ではなく、シングルプレイヤーゲームに比べて多くのパーツが必要となります。すべてのパーツを他のプレイヤーと同期させて、1 つの一貫した共有現実を作り出す必要があるからです。 

マルチプレイヤー開発の中核となるのが、ネットコードです。ネットコードとは、ゲームプレイヤーとサーバー間の通信において、「どのように」「何を」行うかを処理するコードの部分です。 

しかし、「ネットコード」という言葉には悪いイメージがつきまといます。ネットコードは、遅延やマルチプレイヤーの不具合の原因とされることが多いのです。 

今日は、よくある誤解を解き、ネットコードの事実と虚構を切り分け、皆さんに自信を持って次のマルチプレイヤーゲームのネットワークを構築できるようになっていただきたいと思います。

ネットコードとは何か

ネットコードとは、マルチプレイヤーゲームの開発における「作る」部分のことで、クライアントとサーバー間のネットワークや同期を処理する部分を総称する用語です。 

マルチプレイヤーゲームでは、サーバーとクライアントは、ネットワーク上でパケットを送信することによって相互に通信します。離れた場所にいるプレイヤーの間の共有現実を作るとき、キャラクターの移動やオブジェクトの生成などのゲームプレイのイベントは、データパケットを他のクライアントに送信することで同期されます。ネットワーク上でパケットの送受信を行う部分は、トランスポートと呼ばれるものです。

トランスポートの送信関数を直接呼び出してパケットを手動で送信することも可能ですが、このパターンはマルチプレイヤーの経験が少ないプログラマーにとってはすぐに手に負えないものになってしまいます。 

ネットコードライブラリは、ネットワーク変数や RPC(リモートプロシージャコール)などの機能により、パケットの送信をゲームプレイコードから抽象化します。 

Unity には、Netcode for GameObjects(プレリリース版)と Netcode for Entities(実験的機能)という 2 つのネットコードパッケージがあります。

chart showing netcode libraries

よくある 3 つのネットコードにまつわる俗説とその真相

1. 「後からでもマルチプレイに対応できる」

🚫虚構:ゲームの開発サイクルの中で、マルチプレイヤーを開発の後の段階で追加することができる。 

事実:マルチプレイヤーを実装することは難しい。プレイヤーにマルチプレイ体験を楽しんでもらうためには、ゲームの設計、開発の初期段階で、マルチプレイについて考慮する必要がある。 

理由:マルチプレイヤーは、ゲームプレイのほぼすべての側面に影響を与えるため、ゲーム開発にも影響を与えるのは当然のことだから。たとえば、シングルプレイ用のゲームでインベントリシステムを導入している場合、マルチプレイヤーゲームではインベントリアイテムをサーバーに同期させる必要がある。

また、シングルプレイ用のゲームでは簡単に実装できることでも、マルチプレイヤーゲームでは実装に頭を悩ませることになることが多々あります。

ほとんどのマルチプレイヤーゲームでキネマティックなキャラクターコントローラーが使われ、物理的なインタラクションが非常に少ないことを不思議に思ったことはありませんか。このようにしたのは、ゲームを遊んでいる人同士で共有され、物理を予測する物理シミュレーションの実装は、経験豊富な開発者であっても頭を悩ませる問題だからです。

一般的なアドバイスとしては、自分のゲームの特徴がマルチプレイヤーに対応しているかどうかを早めにチェックすることです。特に、他のゲームではあまり使われていないユニークな仕組みを持つゲームの場合はなおさらです。

Soaring Pixels Games の『Breakwaters』をご覧ください。最初からマルチプレイヤーを意識して実装を行った事例を通じて、小規模な協力型ゲームタイトルでもなぜそのような意識を持つことが重要なのかを説明しています。

 

2. 「低遅延は常に良い」

🚫虚構:マルチプレイヤーゲームでは常に低遅延の方が良い。ラグが少なければ少ないほど、ゲームプレイの質は向上する。 

事実:プレイヤーにスムーズな体験を提供するためには遅延を低く抑えることは重要だが、安定した体験を提供することも同様に重要である。1 つの共有現実を作るために、全体的な経験の中でプレイヤーには観察できないわずかな時間を使って状態を同期させることが必要かもしれない。 

理由:すべてのプレイヤーにスムーズで一貫した体験を提供するために必要なことが、常に遅延を最も低く抑えることだとは限らないから。  

ゲームのスムーズさや一貫性を向上させるために最もよく使われる手法がバッファリングです。

ネットワークから入ってきたデータパケットをすぐに処理するのではなく、パケットを待ち行列に入れます。各ティック(ゲームシミュレーションの 1 回の更新)の間に、クライアントは(理想的には)キューから 1 つのアイテムを取り、キュー内にバッファされた要素を一定のサイズに保つようにします。

これにより、サーバーが 1 ティックで 1 つのパケットを送信した場合、クライアントも 1 回のティックで常に 1 つのパケットを処理することが保証されます。 

しかし、なぜそれが必要なのでしょうか。クライアントも、受信したパケットをすぐに処理すれば、1 ティックで 1 つのパケットを受け取るだけではないのでしょうか。完璧なネットワーク環境であればその通りですが、ネットワーク上を移動するパケットはすべてバラバラな伝送遅延がかかる可能性があります。 

このようなパケットごとの RTT(ラウンドトリップタイム)の変動を「ジッター」と呼びます。バッファリングは、遅延を増加させる代わりにジッターを減少させる技術であり、一貫性を持たせることでプレイヤーの体験を向上させる結果につながることが多いです。

 

例:格闘ゲームには、リズムに合わせて素早くボタンを連打することで発動する技がよくあります。プレイヤーは、これらの動きを何度も実行して、マッスルメモリとして覚えていきます。格闘ゲームがフェアなものであるためには、与えた入力に対する結果として現れるプレイヤーキャラクターの行動が、実際に与えた入力と一致していることが非常に重要です。 

では、多くの格闘ゲームはこの一貫性を実現するために何をしているのでしょうか。彼らは、一定の間隔でインプットをポーリングし、そのインプットを少しだけバッファリングします。そうすることで、プレイヤーの入力をゲームプレイのフレームに一貫してマッピングすることができます。入力遅延の平均値は増加しますが、その遅延はずっと安定しています。

 

バッファリングを増やすことでゲームはもっとスムーズになりますが、そうすると多くの場合、遅延が大きくなりすぎて、プレイヤーは自分の入力と画面上のゲームプレイが切り離されたような体験をすることになります。

遅延のペナルティを受けずにスムーズなバッファリングを実現するためには、さまざまな手法があります。クライアント権威型のゲームでは、自分のプレイヤーキャラクターの入力を即座にプレイヤーオブジェクトに適用することで、ローカルプレイヤーの遅延を最小限に抑えることができます。他のプレイヤーが敵プレイヤーのデータをバッファリングしても、スムーズに表示することができます。 

この方法は、プレイヤーにとっては素晴らしいものですが、チート行為が容易になるため、別の問題を引き起こす可能性があります。 

対戦型のゲームでは、クライアントサイド予測と呼ばれる技術を使うことができます。これは、ローカルプレイヤーの入力を即座に適用しますが、サーバーは同じ入力を適用してプレイヤーの行動を計算し、クライアントが有効な動きを実行したかどうかをチェックし、必要に応じて修正します。

 

3. 「帯域幅は無料」

🚫虚構:私のブロードバンド契約はとても安いので、帯域幅が無料に違いない。 

事実:帯域幅は無料ではない。また、そのコストは地域によって異なり、一部の地域では使用した帯域幅に対して他の地域よりも大幅に高い料金が請求される。

理由:民間のブロードバンド契約は、一般的に商用サーバーに適用される料金に比べてかなり安いから。ブロードバンド契約が安いのは、ほとんどの人が帯域幅のほんの一部だけを使っていて、しかも頻繁に使わないため。商用サーバーではまったく事情が異なる。ゲームサーバーは通常、1 日のほとんどの時間を通して稼働しており、数百人のプレイヤーのトラフィックをサポートすることもある。そのため、ホスティング会社は、使用量に応じてギガバイト単位で課金するのが一般的である。

上記の文章の意味するところは、帯域幅を節約することは、運用コストを削減するために非常に重要であるということです。加えて、帯域幅の使用量が少ないゲームであれば、インターネットの接続速度が遅いプレイヤーでもゲームを楽しむことができます。 

マルチプレイヤーゲームのラグの原因として、ユーザーの宅内ネットワークの混雑が挙げられます。これは、ビデオストリーミングなど、ネットワーク上に他の重いトラフィックがあるために起こることが多いのですが、ゲームの帯域幅コストを削減することで、プレイヤーの体験を向上させることができます。

 

次のマルチプレイヤータイトルを自信を持って作ろう

マルチプレイヤーゲームの構築は困難な試みですが、同時にエキサイティングなものでもあります。次に大ヒットをさらうバトルロイヤルゲームの制作を志している人にも、居心地の良いオンライン協力型ゲームを作りたい人にとっても、マルチプレイヤーネットワークのニュアンスを理解することは不可欠です。 

マルチプレイヤーネットワークでのよくある罠をもっと知りたい方は、e ブックをぜひダウンロードしてください。 

さらに、Unity の Netcode ソリューションドキュメンテーションをチェックして、次のマルチプレイヤープロジェクトを今すぐ始めましょう。 

2021年12月1日 カテゴリ: ゲーム | 11 分 で読めます

Is this article helpful for you?

Thank you for your feedback!