オンラインゲームの仕組み備忘録 2回目

オンラインゲームを作るときには、通信の仕組みとゲームデザインを一緒に考えなければなりません。

 1回目で書いたとおり、オフラインゲームに通信機能を付け加えただけではオンラインゲームにはできません。

オンラインを考慮していないゲームデザインで作業を進めていくと、作成段階で矛盾が生じてきます。矛盾のある仕様では修正を余儀なくされてしまうため、余計に無駄な時間を増やしてしまうでしょう。

「オンラインゲームのゲームデザインを考えるときに考慮しなければならない通信の制約」

1. 通信遅延 2. データ消失 3. 回線切断




1対1の対戦ゲームをするとします。もし、オフラインのゲームであれば登場するキャラクターは2人ですが、オンラインだとどうなるでしょうか。実は、4人になってしまいます。ゲーム画面には2人のキャラしかいませんが、ゲームを実行している端末が2台あるため、全体では4人のキャラが存在しています。

端末ごとにキャラクターが存在するので同じキャラクターでも、扱われる端末が違えば別キャラとして処理しなければなりません。つまり端末2台のそれぞれに2体いるので、全体で4人のキャラが存在することになります。

 プレイヤー1(P1)とそのキャラの相手側の端末にいるキャラ(P1’)、プレイヤー2(P2)とそのキャラの相手側の端末にいるキャラ(P2’)がいるとします。自分の端末で操作してるP1’は端末1で操作されたキャラP1の影のようなものです。

 端末2に反映されるこの影は、通信回線を通って受信した情報を処理することによって映し出されるため、端末1での動作が即時に端末2に反映されるわけではないです。通信遅延のためです。

 

 オンラインゲームでは端末間での結果のズレを生じてしまわないように、同じ時刻のそれぞれの端末の動作を考えてみます。端末1の2人のキャラと端末2の2人のキャラが同じ時刻にそれぞれどのような動作をしているかを考慮します。結果にズレがないようにゲームデザインするか、ズレが発生しても違和感を感じさせないようにデザインします。

 もし1台の端末にn人のキャラが登場するオンラインゲームでは、他の端末でも同じようにn人のキャラが存在します。n人のキャラがでてくるオンランゲームがm台の端末で遊ばれているとすると、キャラ全体は

n × m [人]

いることになります。このように、オフラインでは考える必要がなかったことも考慮しなければなりません。通信相手のそれぞれの端末で同じ時刻に何が起こっているのかを、比較しながら考える必要があります。



「エラーも仕様」

 オフラインのゲームを作るときに発生するエラーのひとつに、ファイルの読み込みの失敗があります。データを読み込まなければそれ以上ゲームを進めることができないので、ゲームを強制終了するだととして処置をとります。

 オンラインの場合は、データが予想通り届かなかったり回線切断などが発生してしまいます。オフラインではそーなったら強制終了ですが、オンラインゲームの仕様によっては、この状態でも通常通りゲームを続行しなければなりません。よって、エラーがエラーではなく「仕様」として作っていかなければなりません。このため、相手からの情報が届かなかったり、切断してしまったりしたときにゲームはどーやって振る舞えばよいかをあらかじめ決めておかなければなりません。


1対1の対戦カードゲームでは、対戦相手と切断してしまった場合、対戦相手がいなくなってしまうためゲームを続けることができません。ゲームを強制終了させることになるでしょう。ですが、1対1の対戦でもダーツのようなスコアを競うゲームなどでは、対戦相手がいなくなっても1人プレイができるためそのままゲームを続けることができます。この際、切断した相手との勝敗をどのようにするかをあらかじめ決めておきます。


複数人で対戦したり協力するオンラインゲームでは、1人が切断してしまった場合にゲームを終了させてしまうと、問題なく接続している残りのプレイヤーも一緒にゲームを終了しなければなりません。アクションタイプのオンラインゲームなどは、1人プレイヤーが切断してゲームを続けられなくなっても、残されたプレイヤーはゲームを続けられる方がいいと思います。これはエラーではなく、「仕様」になります。


例1: データが届かなかったキャラは、フィールド上の、最後に受信したデータの位置に停止する

例2: プレイヤーが切断した場合、そのプレイヤーはパーティから抜け、残りのメンバーでゲームができるようにする。


このような設定にしたとき、他の部分で矛盾が生じないかなど、ゲーム進行に影響のある仕様も一緒に検討しなければなりません。オンラインゲームを作ると決めたら、プロジェクトの初期段階からこれらのエラーが発生することも念頭に置いたゲームデザインを行うべきです。

 正常に通信が行なわれているときの処理は問題なく動作しても、エラーが発生したときに正しく動作しなくなってしまうことが多々あります。通信エラーはいつどこで発生するか予測できないので、様々なエラー処理をしなければなりません。

 通信担当のプログラマが口を揃えて言う言葉があるそうです。

「通信プログラムの大半はエラー処理だ!」

製品やサービスとして提供する通信プログラムの約8割は、エラー処理だと言われています。作成する通信プログラムの仕様が多くなればそれだけエラー対応の処理も増えていきます。

 通信プログラムだけの話ではありませんが、特に通信プログラムでは、想定できるエラーの処理は正常系の処理よりも先に取り組むように心がけましょう。


「正解はひとつではない」


同じゲームの仕様を2人のプログラマが実装しても、同じプログラムになることはありません。似ている場合はありますが、全く違っている場合もあるでしょう。どちらにしても仕様通りに動作するでしょう。

 通信の仕組みを考えるときも、これと同じことが言えます。キー入力同期の通信は、キー入力を同期すればいいので、どのゲームでも全て同じ仕組みで動かせるように思われがちですが、実はそうではありません。別のゲームを一つのやり方で動かそうとしても動かないこともありますし、同じゲームを別の仕組みで動かすこともできます。このようにオンラインゲームの同期のさせ方や仕組みは、ひとつだけではないのです。

「正解はひとつだけではない」



今日は、ここまでとします〜 ではっ


by えいちゅー

Debug.Log("自分の成長記録板");

Debug.Log("自分と同じようにプログラミング始めたばかりの方や、自分のブログに興味をもっていただけた方、ぜひコメントなどよろしくお願いします");

0コメント

  • 1000 / 1000