Unityを使わずにフリスビーを犬に届けよ!を作ってみる(3)の続きです。今回はクライアントサイドにおける処理を実装します。

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

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

さぎのみや氏のTwitter

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

cshtml部分

Pages\Frisbee\game.cshtml

JavaScript部分

グローバル変数と定数

JavaScriptの定数部分を示します。

wwwroot\frisbee\frisbee.js

シーン、レンダラー、ライト、カメラの作成

ThreeJSを使いますが、その初期化にかんする部分を示します。

ここではシーン、レンダラー、ライト、カメラの作成をしています。

ページが読み込まれたときの初期化

ページが読み込まれたら初期化の処理をおこないます。

ここでやっている初期化はmp3ファイルの再生関係です。[音を出す]にチェックがされていてゲーム中であればBGMをエンドレスで再生したいのですが、この音声ファイルは最後のほうは無音なので50秒再生したら先頭から再生しなおすようにしています。

そのあとAspNetCore.SignalRでサーバーサイドに接続を試みます。うまくいけば成功を示すメッセージが返されます。そのあとスコアを表示するためのテキストフィールドを生成して座標(0, 0)に固定しています。

mp3ファイルの再生関連

SetVolumes関数は効果音のボリュームを設定します。効果音の大きさに違いがあるのでmp3ファイルによって微調整をいれています。

IsSound関数は効果音を再生する設定になっているかを調べるためのものです。

PlayBgm関数とStopBgm関数はBGMの再生と停止をおこなうためのものです。

接続成功時の処理

AspNetCore.SignalRでサーバーサイドへの接続を試みて実際に接続できた場合は、サーバーサイドからSuccessfulConnectionToClientが送信されます。これを受信したらそのときに付与されるIDをグローバル変数に保存しておきます。

接続に成功したらゲームをするために必要な情報(フィールドの形状や自機の位置など)が送られてきます。そのときの処理を示します。

フィールド上に存在する障害物の座標はSendObstaclesToClientで送られてきます。これをうけとったら3Dオブジェクトを生成してシーンに追加します。

スタート地点とゴールの座標はSendStartGoalToClientで送られてきます。これをうけとったらスタート地点は3Dオブジェクトを生成し、ゴールは犬の画像でスプライトを生成してシーンに追加します。

プレイヤーの初期座標はSendPlayerToClientで送られてきます。これをうけとったらフリスビーのような薄い円柱を生成してシーンに追加します。

ゲーム開始のボタンが押されたらサーバーサイドにGameStartを送信します。これに対してサーバーサイドで不具合がおきずに正常に処理がおこなわれたらEventGameStartToClientが返されます。この場合はisPlayingフラグをtrueにして、ゲーム開始ボタンを非表示にし、[音を出す]にチェックがされている場合はBGMも再生します。

キー操作への対応

ユーザーがキー操作をしたときにこれをサーバーサイドに送信してフリスビーが移動するようにします。

更新処理

サーバーサイドで更新処理がおこなわれた場合、クライアントサイドにはUpdateXXXToClientが送信されます。

以下はプレイヤーの座標と表示角度、生存or死亡に関するデータが送られてきたときの処理です。

ここでは座標と回転を設定してカメラの座標も決めています。プレイヤー死亡または非表示にするときはisdead == trueとなります。この場合はカメラに写らない場所にフリスビーを移動させ、カメラもこれを追わないようにします。

ミス時には火花が散ります。そのときはUpdateSparksToClientが送られてきます。このとき引数が空文字の場合は火花を描画する必要がないことを意味しています。

最初に火花を描画しなければならなくなった場合、火花のスプライトを生成します。2回目以降はそれを使い回します。表示する必要がないスプライトはカメラに写らない場所に移動させます。

ステージクリア時に描画される星も同様の処理をおこないます。

クライアントサイドで更新処理をおこなううえで必要なデータがすべてサーバーサイドから送信されたら、最後にEndUpdateToClientが送信されます。これを受信したらレンダリングをおこないます。

引数のtimeはゲーム開始から経過した時間を文字列にしたものです。これをテキストフィールドに表示させます。

ミス時、ステージクリア時の処理

ミス時、クリア時の処理を示します。サーバーサイドからステージクリア時にはStageClearEventToClient、ミス時にはPlayerDeadEventToClientが送信されるので、これを受信したら適切な処理をおこないます。どちらの場合も効果音を鳴らす設定がされている場合は効果音を鳴らします。

クリア時はタイムトライアルランキングのページに強制的にリダイレクトします。

ランキングのページの表示

ランキングのページのcshtmlは以下のようになっています。

Pages\Frisbee\hi-score.cshtml