Skip to main content

オンラインゲームの仕組み

インターネットの仕組み

オンラインゲームを作り始める前に、まずインターネットが大まかにどう動いているのかを理解しておこう。

クライアント/サーバー構造

現代のインターネットのほとんどは「クライアント/サーバー構造」と呼ばれる仕組みで動いている。この構造では、「クライアント」と「サーバー」という2つの存在が互いにメッセージをやり取りする。

クライアントとは、ユーザーが直接触れるデバイスのことだ。普段はパソコンやスマートフォンのブラウザがこれにあたる。オンライン決済アプリやLINEのチャットアプリもクライアントと言える。要するに、毎日使っているアプリケーションのことだ。

サーバーとは、データセンターなどにある遠隔地のコンピューターで、すべてのクライアントからのリクエストを受け取り、レスポンス(応答)を返す役割を持つ。例えば、QRコードで支払いをするとき、クライアントは支払い情報をサーバーに送り、サーバーがその金額を購入先の店に送金する、という流れになる。

image.png

ステートレスな接続

多くのクライアント/サーバー構造では、通信は必ずクライアントからのリクエストで始まる。サーバーはリクエストが来るまでじっと待っている。この仕組みでは、サーバー側からクライアントに連絡することはない。なぜなら、クライアントが接続してくるまで、サーバーはそのクライアントが誰なのか分からないからだ。このようなサービスは「ステートレス(状態を持たない)」と呼ばれる。サーバーが個々のクライアントの状態を記憶していないからだ。サーバーはリクエストを処理し、レスポンスを返したら、それで終わり。

こう考えてみるといい。Googleは世界中から毎秒何千もの検索クエリを処理している。どのパソコンが何を検索したかをいちいち記録するのは不可能だ。だからGoogleは検索を実行し、結果を返したら、そのクライアントのことはもう忘れてしまう。

リクエストとレスポンス

クライアントからサーバーへ送られるメッセージを「リクエスト」と呼ぶ。サーバーから返ってくる答えを「レスポンス」と呼ぶ。ステートレスな接続では、レスポンスが送られた時点で接続は切断され、次のリクエストのためにはまた新しく接続をやり直す必要がある。

IPアドレスとポート

IPアドレス

コンピューター同士がつながるためには、識別子が必要になる。IPアドレスとは、インターネット上のすべてのコンピューターを識別するための一意の番号のことだ。コンピューターの「電話番号」のようなものだと考えるといい。IPv4とIPv6の2種類があるが、ここでは主にIPv4アドレスを扱う。IPv4は次のような形をしている。

XXX.XXX.XXX.XXX

これは0〜255の数字4組をピリオドで区切ったもので、合計で

256 x 256 x 256 x 256 = 4,294,967,296

通りのアドレスが存在する。ただし、そのすべてが使えるわけではない。インターネット上では使用できない、特別な用途のアドレスがいくつかある。

  • 127.XXX.XXX.XXX - これは「ループバック」アドレスと呼ばれる。127から始まるアドレスは、すべて自分自身のコンピューターを指す。つまり127.0.0.0に接続しようとすると、今使っているそのコンピューターにつながることになる。
  • 192.168.XXX.XXX - これは「内部使用」アドレスと呼ばれる。同じネットワーク内にある他のコンピューターに接続するために使われるが、インターネットからは見えない。インターネットのクライアントにはなれるが、インターネットのサーバーにはなれない。ただし、同じネットワーク内であればサーバーとしても機能する。

image.png

ポート

ポートとは、同じコンピューター内にある接続用の「差し込み口」のようなものだ。1台のコンピューターが持つIPアドレスは1つだけでも、同時に複数の接続を持つことができる。それぞれの接続は異なるポートを使う。ある接続ではウェブページを見ていて、別の接続ではLINEでメッセージを送っている、というようなことが同時に起きる。各ポートは1〜65535の番号で識別されるが、いくつかの番号は特定のサービス用に予約されている。

  • ポート80 : ウェブサービス(HTTP)
  • ポート443 : 暗号化されたウェブサービス(HTTPS)
  • ポート23 : メールサービス(SMTP)
  • ポート137、138、139、445 : Windowsのファイル共有サービス(Samba)

自分のパソコンが今どんな接続を使っているかは、netstat コマンドですぐに確認できる。ポート番号は、接続中の各IPアドレスの後ろにあるコロン(:)の後の数字として表示される。

image.png

リアルタイムゲーム vs 非同期ゲーム

ゲームのプレイスタイルによって、サーバーへの接続方法は大きく2つに分けられる。

リアルタイムゲーム

このカテゴリーに入るのは、FPS(ファーストパーソン・シューティングゲーム)やMMOなどだ。サーバーへの速く安定した接続が必要になる。サーバー側のレスポンスも速くなければならない。レスポンスが遅れると、ゲームの結果が大きく変わってしまうこともあるからだ。そのため、こうしたゲームは通常サーバーへの常時接続を使い、素早く送受信・処理できるようバイナリ形式の小さなデータパケットを使う。

非同期ゲーム

非同期ゲームとは、多少の遅延(ラグ)が問題にならないゲームのことだ。リクエストを送ってから1〜2秒の遅れがあっても、ゲームプレイに支障は出ない。トレーディングカードゲームやアイテム収集ゲームなどがこのカテゴリーに入る。速度が重要でないため、必要なときだけデータを送るステートレスな接続の方が好まれる。データは扱いやすく読みやすいJSONのテキスト形式で送られることが多い。


リアルタイム 非同期
ゲームの種類の例 FPS、MMO、MOBA トレーディングカードゲーム、アイテム収集ゲーム、ガチャゲーム
接続の持続時間 常時接続のみ 一時的な接続
送られるデータの種類 バイナリデータ 主にテキストデータ
接続の状態 ステートフルな接続(サーバーが接続中のクライアントを把握している) ステートレスな接続(クライアントが接続のたびに自分自身を識別させる必要がある)
プログラミング言語 C++ / Rust Node.js (JavaScript) / PHP

APIとは何か

APIとは「アプリケーション・プログラミング・インターフェース」の略だ。簡単に言うと、インターネット上に存在する関数やメソッドのことだ。オンラインゲームなどのアプリケーションは、コードの一部をオンラインで実行するためにAPIを使う。例えば、トレーディングカードゲームで新しいカードを手に入れるためにガチャを引きたいとする。ガチャは1日に1回しか回せないので、サーバー側で確認する必要がある。そこでAPIを使ってサーバーに「ガチャを回す」というリクエストを送り、条件を満たしていればサーバーが必要な処理を実行し、その結果をレスポンスとしてクライアントに返す。

image.png

image.png

image.png

この科目の目的

この科目では、PHPとデータベース(MySQL)を使ってオンラインゲームのAPIを作る方法を学ぶ。サーバー上でデータを保存・検索する方法を学び、ユーザーとその所持アイテムを管理できるようにする。そして、PHPを使ってAPI(クラウド上の関数)を作り、サーバーにログインして自分のインベントリを確認できるようにする。

最後に、Unityを使ってそのAPIにアクセスし、自分たちで作ったサーバーに接続してゲームをプレイし、結果をテストしていく。