「空島大乱闘」のオンラインの技術的なこと その2

伝説のマニアです♪U・ω・U


今回は、空島大乱闘のオンライン技術のうち、全体的な構成を説明していきたいと思います!



【通信の種類を選択する】
まず、ネットワーク通信を行う上で、通信種類を決める必要があります。知識のある方はご存知かと思いますが、通信の種類は大きく分けて、TCP通信、UDP通信があります。オンラインゲームであれば、TCP通信もUDP通信もよく使われます。

どの通信種類を選ぶかは、ゲームシステムによって決定しなければなりません。RPGのアイテム取得処理等のような、通信ミスが許されないものについてはTCP通信を使う必要がありますし、FPSのような通信速度を求められるゲームではUDP通信が使われていると思われます。

また、UDP通信に信頼性を付加した通信方法もオンラインゲームではよく使われるようです。この場合、パケットロス時の再送やパケット順番制御を自前でプログラミングする必要があります。探せば、そういったミドルウェアもあるかもしれません。

。。。そして、オンラインアクションゲームの空島大乱闘は何かと言いますと。。。


全部TCP通信ですww


通常、オンラインアクションゲームであれば、可能な限りUDP通信が使われると思います。前回触れたNAT問題があるため、端末が常にUDP通信を使える環境にあるとは限りません。

そのため、通信種類を決定する上で、「このゲームはTCPだ!」と決めつけるのではなく、まず端末がUDPが使えるかどうかチェックする、使えないのであればTCP、、、といった工夫が使われていると思うのです。

しかしながらぶっちゃけめんどくさい、空島大乱闘はTCP通信で作っています。この辺は、個人開発という言い訳で妥協していますw

後々は端末毎に通信種類を制御できるような仕組みを作りたいと思っているところです。。。U・ω・U



【通信の方式を選択する】
オンラインゲームの通信方式は、大きく分けて、「完全同期型」と「非同期型」の二種類があります。

完全同期型
完全同期型は、その名の通り、端末同士(もしくはサーバー&端末同士)を完全に一致させる通信方式です。ゲームシステムによって、ターン毎、またはフレーム毎にプレイヤー全員の操作が各端末ですべて揃ってから、ゲームの処理を進める、というものです。

この方式では、端末での見た目が完全に一致します。通信速度を求められないターン性のゲームや、速度を求めるが絶対にズレが許されない格闘ゲームではこの方式が選ばれると思われます。

非同期型
非同期型は、端末同士の見た目が一致しない通信方式です。各プレイヤー同士で、見えているゲーム世界が異なる事を許容する、という方式です。

この方式を採用する場合、各プレイヤー・モンスターのイベント、タイミングが一致しない事が起こり得ます。それでも、ゲームにとって重要なイベント(プレイヤー死亡やモンスター死亡等)はちゃんと一致させるように調整します。

ゲームを完全に合わせる事は妥協しているが、全体的にゲームが破綻していなければ良しとするのがこの方式です。

大規模なMMOGやFPSではこの方式が使われていると思われます。


そして空島大乱闘は、非同期型に分類されます。

空島大乱闘では、プレイヤー数は最大4人、モンスターの数は20匹以上となることがあります。この数のキャラクターを全部完全に同期させるのは非常に難しいです(ラグりまくりで大変な事になります♪)。

そこで、完全に合わせる事は妥協しているが、プレイヤーにはあまりそう感じさせない工夫が必要でした。

また、空島大乱闘は、対戦型ではなく協力プレイであるため、あまり厳しい同期化が求められないだろうと判断しました。

これが対戦型となると、また同期化の方法を変更しなければならなくなると思われます。




【クライアント/サーバー型、P2P型について】
次に、ゲームの処理を、サーバー側で行うのか、それともクライアント側で行うのかを決める必要があります。

クライアント/サーバー型
サーバー側でゲーム処理を行う場合、各クライアントからはキー入力イベントをサーバーへ送信し、サーバーからは結果をクライアントへ送信する、という流れになるかと思います。

MMOG等でこの方法が採用されているかと思われます。この方法では、ゲームの処理内容をサーバー側でチェックすることができるため、チート対策がやりやすくなります。

P2P型
P2Pの場合は、各クライアント同士がお互いにキー入力イベントを送りあう事となります。

格闘ゲーム等ではこの方法が採用されているかと思われます。



そして、空島大乱闘では、基本的にP2P型をとっています。

。。。ただし、直接クライアント端末同士で通信するのではなく、一度専用サーバー(リレーサーバーと言います)を通して通信を行っており、擬似的なP2P型と言えます。

理由としては、やはり、NAT問題がめんどくさいをクリアすることが難しいからです。

もし、プレイヤー端末がWiFi環境下にあった場合、ルーターの種類によっては、そのプレイヤーにパケットを送る事が難しくなります。

本当は、ルーターの種類によって、パケットを送る事が可能かどうかをチェックし、動的に通信方法を変える事が理想ではありますが、今回は妥協して、リレーサーバーを通して通信を実現しました。

リレーサーバーとは、クライアントから送信されてきたパケットを、そのまま別のクライアントに転送するだけのサーバーの事を言います。

この方法をとったのも、どのような環境下であったとしても、サーバーへTCPセッションを開始することができない端末はほとんどないだろう。。。と判断したからです(ただし、環境によってはTCPセッションの開始をポート80番に制限しているものもあるようですが、そんなの知りません)。

また、必ずサーバーを通して通信を行う事で、ゲームの中で絶対同期化したい処理(アイテム取得等の被ってはいけない処理)を、簡単に実装可能という事もありました。



【まとめ】
まとめとして、空島大乱闘は、TCP通信を使い、非同期型でリレーサーバーを用いた擬似P2P方式を採用している、ということになります。

リレーサーバーで大丈夫かな。。。と思ったのも、一度スマートフォン端末を使い、サーバー間(東京と沖縄)で通信を行い速度テストを行ったところ、概ねRTTが50msを実現できた事で、「あ、いけるかも」と思ったからですw (もちろん、スマートフォン端末は通信速度が不安定なので、毎回この速さで通信できるとは限りませんが。。。)

次回は、十字キーの実装とキー入力同期の方法を紹介していきたいと思います。
テーマ: Unityゲーム制作 | ジャンル: コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する