オンラインゲームの仕組み インターネットの仕組み オンラインゲームを作り始める前に、まずインターネットが大まかにどう動いているのかを理解しておこう。 クライアント/サーバー構造 現代のインターネットのほとんどは「クライアント/サーバー構造」と呼ばれる仕組みで動いている。この構造では、「クライアント」と「サーバー」という2つの存在が互いにメッセージをやり取りする。 クライアントとは、ユーザーが直接触れるデバイスのことだ。普段はパソコンやスマートフォンのブラウザがこれにあたる。オンライン決済アプリやLINEのチャットアプリもクライアントと言える。要するに、毎日使っているアプリケーションのことだ。 サーバーとは、データセンターなどにある遠隔地のコンピューターで、すべてのクライアントからのリクエストを受け取り、レスポンス(応答)を返す役割を持つ。例えば、QRコードで支払いをするとき、クライアントは支払い情報をサーバーに送り、サーバーがその金額を購入先の店に送金する、という流れになる。 ステートレスな接続 多くのクライアント/サーバー構造では、通信は必ずクライアントからのリクエストで始まる。サーバーはリクエストが来るまでじっと待っている。この仕組みでは、サーバー側からクライアントに連絡することはない。なぜなら、クライアントが接続してくるまで、サーバーはそのクライアントが誰なのか分からないからだ。このようなサービスは「ステートレス(状態を持たない)」と呼ばれる。サーバーが個々のクライアントの状態を記憶していないからだ。サーバーはリクエストを処理し、レスポンスを返したら、それで終わり。 こう考えてみるといい。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 - これは「内部使用」アドレスと呼ばれる。同じネットワーク内にある他のコンピューターに接続するために使われるが、インターネットからは見えない。インターネットのクライアントにはなれるが、インターネットのサーバーにはなれない。ただし、同じネットワーク内であればサーバーとしても機能する。 ポート ポートとは、同じコンピューター内にある接続用の「差し込み口」のようなものだ。1台のコンピューターが持つIPアドレスは1つだけでも、同時に複数の接続を持つことができる。それぞれの接続は異なるポートを使う。ある接続ではウェブページを見ていて、別の接続ではLINEでメッセージを送っている、というようなことが同時に起きる。各ポートは1〜65535の番号で識別されるが、いくつかの番号は特定のサービス用に予約されている。 ポート80 : ウェブサービス(HTTP) ポート443 : 暗号化されたウェブサービス(HTTPS) ポート23 : メールサービス(SMTP) ポート137、138、139、445 : Windowsのファイル共有サービス(Samba) 自分のパソコンが今どんな接続を使っているかは、 netstat コマンドですぐに確認できる。ポート番号は、接続中の各IPアドレスの後ろにあるコロン(:)の後の数字として表示される。 リアルタイムゲーム vs 非同期ゲーム ゲームのプレイスタイルによって、サーバーへの接続方法は大きく2つに分けられる。 リアルタイムゲーム このカテゴリーに入るのは、FPS(ファーストパーソン・シューティングゲーム)やMMOなどだ。サーバーへの速く安定した接続が必要になる。サーバー側のレスポンスも速くなければならない。レスポンスが遅れると、ゲームの結果が大きく変わってしまうこともあるからだ。そのため、こうしたゲームは通常サーバーへの常時接続を使い、素早く送受信・処理できるようバイナリ形式の小さなデータパケットを使う。 非同期ゲーム 非同期ゲームとは、多少の遅延(ラグ)が問題にならないゲームのことだ。リクエストを送ってから1〜2秒の遅れがあっても、ゲームプレイに支障は出ない。トレーディングカードゲームやアイテム収集ゲームなどがこのカテゴリーに入る。速度が重要でないため、必要なときだけデータを送るステートレスな接続の方が好まれる。データは扱いやすく読みやすいJSONのテキスト形式で送られることが多い。 リアルタイム 非同期 ゲームの種類の例 FPS、MMO、MOBA トレーディングカードゲーム、アイテム収集ゲーム、ガチャゲーム 接続の持続時間 常時接続のみ 一時的な接続 送られるデータの種類 バイナリデータ 主にテキストデータ 接続の状態 ステートフルな接続(サーバーが接続中のクライアントを把握している) ステートレスな接続(クライアントが接続のたびに自分自身を識別させる必要がある) プログラミング言語 C++ / Rust Node.js (JavaScript) / PHP APIとは何か APIとは「アプリケーション・プログラミング・インターフェース」の略だ。簡単に言うと、インターネット上に存在する関数やメソッドのことだ。オンラインゲームなどのアプリケーションは、コードの一部をオンラインで実行するためにAPIを使う。例えば、トレーディングカードゲームで新しいカードを手に入れるためにガチャを引きたいとする。ガチャは1日に1回しか回せないので、サーバー側で確認する必要がある。そこでAPIを使ってサーバーに「ガチャを回す」というリクエストを送り、条件を満たしていればサーバーが必要な処理を実行し、その結果をレスポンスとしてクライアントに返す。 この科目の目的 この科目では、PHPとデータベース(MySQL)を使ってオンラインゲームのAPIを作る方法を学ぶ。サーバー上でデータを保存・検索する方法を学び、ユーザーとその所持アイテムを管理できるようにする。そして、PHPを使ってAPI(クラウド上の関数)を作り、サーバーにログインして自分のインベントリを確認できるようにする。 最後に、Unityを使ってそのAPIにアクセスし、自分たちで作ったサーバーに接続してゲームをプレイし、結果をテストしていく。