Unityを使わずにフリスビーを犬に届けよ!を作ってみる(5)の続きです。

フリスビーを犬に届けよ!の元ネタ

Unishar-ユニシャー【Unityでのゲーム開発を手助けするメディア】

さぎのみや氏のTwitter

さぎのみや氏の個人ブログ

複数のステージをつくる

これではひとつのステージをクリアしたらゲームは終了になりました。今回は複数のステージをつくります。最初のステージをクリアしたら次のステージに移行できるようにします。

FrisbeeHubクラスの修正

ステージクリアしてもこれまでのようにゲームは終了しません。かわりに2秒間待機したあと後述するFrisbeeGame.StageClearメソッドを呼び出して新しいステージを生成します。そしてSendMapメソッドを呼び出してこれをクライアントサイドに送信します。

FrisbeeGame.StageClearメソッドは以下のようになっています。StageNumberをインクリメントしたあとInitメソッドを呼び出すと次のステージが生成されます。

クライアントサイドの処理

次にクライアントサイドの処理ですが、これまではランキングのページにリダイレクトさせていましたが、これをやめます。

ステージクリアをしたあとFrisbeeGame.StageClearメソッドとFrisbeeHub.SendMapメソッドが実行されるため、サーバーサイドからクライアントサイドにSendPlayerToClientとSendStartGoalToClientが複数回送信されます。プレイヤーとスタート地点、ゴールの3Dオブジェクトはすでにシーンに追加されているので、2回目以降はシーンに追加せず位置だけ変更します。

ゲームオーバー判定とスコア

これで複数のステージで遊べるようになったのですが、ゲームオーバーの処理はどうすればいいでしょうか?

残機制?

このゲームはやってみるとわかりますが、ミスばっかりで苦しむことになります。すぐにゲームオーバーになっては面白くないのでこの案はボツにしたいと思います。

クリアまでの時間を競う?

最終の第5ステージは難しくしてあります。クリアできない人がいるかもしれません。

そこで制限時間を設けてそれまでにクリアできなければゲームオーバーとします。

次に問題になるのがスコアです。

クリアしたときに加点するだけではちょっとやってみて「難しい。やーめた」といって離脱する人が続出することが予想されます。だからそれ以外のときも加点される仕様にしたいのです。

そこで3秒ごとに10点追加
ステージクリア時には残りの秒数×30

というのはどうでしょうか?

Gameクラスの修正

これまではステージクリアまでの経過時間を測っていました。今回は残り時間を計測します。またステージクリアのあとは次のステージが存在します。クリアしたステージから次のステージのあいだは計時を止めなければなりません。また新しいステージがはじまったら残り時間をリセットしなければなりません。

そこでFrisbeeGameにClearedプロパティを追加します。ステージをクリアするとtrueになり、新しいステージがはじまるとfalseになります。

またGameStartメソッドのなかでStageNumberプロパティに1を設定しています。ゲームオーバーになったら別のページにリダイレクトするので意味はない処理なのですが、ダイレクトせずに[ゲーム開始]のボタンを出現させて引き続きゲームを続けるようにしたいときも対応できるようにします。

ゲームオーバーになったら別のページにリダイレクトする意味はとくにありません。ゲームのページに誰かがアクセスしているとタイマーが動きっぱなしになること(サーバーへの負荷)を避けたいだけです。

Playクラスの修正

スコアを表示させるためにScoreプロパティを追加しています。またステージクリア時に計時をリセットするためにStartTimeに現在時刻を代入しなおしています。

GameOverになったらIsDeadフラグとIsGameOverフラグをセットします。そしてミス時と同様に火花を発生させます。

FrisbeeHubクラスの修正

プレイヤーが生存している時は3秒に1回、10点を追加します。そのためのタイマーを追加します。3秒に1回の割合でTimerForScore_Elapsedを呼び出します。またこのタイマーもユーザーがいないときは停止させます。

OnConnectedAsyncメソッドとOnDisconnectedAsyncメソッドはTimerForScoreを追加した部分以外は完全に同じです。

3秒に1回10点を加点する処理を示します。ゲームオーバーではなくPlayer.IsDeadとFrisbeeGame.Clearedがfalse(ミスのあと復活するまでの時間帯ではないしステージクリア時から次のステージが開始されるまでの時間帯でもない)の場合に10点を加算します。

最後のステージは難しいですが、各ステージの制限時間は5分とします。第五ステージをクリアしたあとは同じですが、制限時間が20秒ずつ短くなっていきます(永久にできないように無理ゲー化させる)。

ステージクリア時にはStageClearEventToClientを送信して効果音を出すだけでなく、ボーナスポイントを計算してShowBonusTextを送信してクライアントサイドで表示させます。次のステージが開始されたらHideBonusTextを送信して表示をやめます。

クライアントサイドにおける処理

クライアントサイドの処理を示します。

ゲームオーバーになったらサーバーサイドからGameOverEventToClientが送信されるので、BGMを停止してゲームオーバー時の効果音を鳴らします(効果音を鳴らす設定の場合)。

そのあとランキングのページにリダイレクトさせます。

ステージクリア時にボーナスポイントを表示させる処理を示します。

テキストファイルを生成して追加します。すでに追加されている場合は追加の処理はおこなわずに、すでに生成されているテキストフィールドに文字列を表示させます。

ボーナスポイントを表示させる必要がなくなったら空文字列を設定します。