Unityを使わずにフリスビーを犬に届けよ!を作ってみる(2)の続きです。今回はAspNetCore.SignalRにおける処理を実装します。

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

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

さぎのみや氏のTwitter

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

FrisbeeHubクラスを定義する

以降は名前空間を省略して以下のように書きます。

接続時の処理

接続時におこなわれる処理を定義します。
AspNetCore.SignalRでサーバーサイドに接続したときに付与されるIDをキーにしてFrisbeeGameオブジェクトとIClientProxyオブジェクトの辞書を定義します(GamesとClientProxyMap)。またタイマーを使って更新処理をおこなうので静的フィールド変数としてTimerを定義します。

最初にOnConnectedAsyncメソッドが呼び出されたときだけタイマーの初期化をおこないます。また接続ユーザーが0の状態から1になったときは停止しているタイマーをスタートさせます。

新しくユーザーが接続したときはFrisbeeGameオブジェクトを生成します。このときFrisbeeGameクラスのコンストラクタ内で自動的にPlayerオブジェクトも生成されるので、死亡時とステージクリア時のイベントハンドラを追加します。そのあと接続に成功した旨をクライアントサイドに伝えます。

切断時の処理

切断時の処理を示します。

Context.ConnectionIdを調べてClientProxyMapとGamesからこれをキーとするオブジェクトが辞書に登録されているのであれば削除します。またこれによって接続されているユーザー数が0になるのであればタイマーを停止します。

マップ上のデータを送信する

新しいユーザーが接続された場合、クライアントサイドにマップの状態(障害物、スタート地点、ゴールの位置などの情報)を送信します。そのための処理を示します。

ゲーム開始時の処理

ゲームが開始されたときにおこなわれる処理を示します。

更新時の処理

更新時の処理を示します。

FrisbeeGame.Updateメソッドを呼び出して各オブジェクトの状態を更新します。そのあとSendUpdateToClientメソッドを呼び出してクライアントサイドにデータを送信します。

そのあとプレイヤーの位置、火花や星が発生していればその位置して送信します。最後にゲーム開始からの経過時間を取得し、クライアントサイドでの更新処理に必要なデータはすべて送信した旨を伝えるEndUpdateToClientとともにこれを送信します。

ミス時の処理

ミス時のイベントハンドラの部分を示します。

ステージクリア時の処理

ステージクリア時のイベントハンドラの部分を示します。

TimeTrialManager.Saveメソッドを呼び出していますが、TimeTrialManagerクラスはこのあと示します。

TimeTrialManagerクラスを示します。

これまでスコアランキングを表示させるための処理とほとんど同じです。このゲームはタイムトライアルなのでスコアのかわりにクリアまでにかかった時間を保存しています。また消費時間が少ないほうが上位なのでその部分がこれまでのものと違うだけです。

ユーザーのキー操作に対応する部分の処理を示します。ここもほとんど同じです。ゲームによって使用するキーが異なるため、その部分にだけ違いがあります。

最後にProgram.csにFrisbee.FrisbeeHubを追加します。

Program.cs