オンラインゲームの仕組み
インターネットの仕組み
オンラインゲームを作り始める前に、まずインターネットが大まかにどう動いているのかを理解しておこう。
クライアント/サーバー構造
現代のインターネットのほとんどは「クライアント/サーバー構造」と呼ばれる仕組みで動いている。この構造では、「クライアント」と「サーバー」という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にアクセスし、自分たちで作ったサーバーに接続してゲームをプレイし、結果をテストしていく。
No comments to display
No comments to display