ボスコニアンのようなオンライン対戦ゲームをつくる(3)の続きです。今回はリアルタイムのクライアントとサーバー間およびサーバーからクライアント間の通信を可能にするために必要な処理をおこなうHubクラスを定義します。

SignalR ハブを構成する

SignalR ハブで必要なサービスを登録するには、Program.cs で AddSignalR を呼び出します。

Program.cs

次にBosconian.GameHubクラスを定義します。

GameHubクラスの定義

GameHubクラスを定義します。

以降は名前空間の部分は省略して書きます。

静的フィールド変数として以下を定義します。

接続と切断のイベント処理

接続のイベント時におこなう処理を示します。

初回のみタイマーの初期化とGameオブジェクトにイベントハンドラを追加する処理をおこないます。そのあと辞書(ClientProxyMap)にContext.ConnectionIdをキーにしてIClientProxyを追加します。もし接続ユーザー数が1のときはタイマーをスタートさせます。

切断のイベント時におこなう処理を示します。

ClientProxyMapからContext.ConnectionIdをキーとするデータを削除します。もしプレイ中のユーザーが離脱したのであればPlayerオブジェクトのConnectionIdプロパティに空文字列をセットし、そのプレイヤーは切断されたものとして処理します。また接続ユーザー数が0になった場合はタイマーを停止させます。

イベントハンドラの定義

追加したイベントハンドラを示します。

敵を倒したとき、要塞を破壊したとき、プレイヤーが死亡したとき、ゲームオーバーになったときはプレイヤーに対応するクライアントにイベントを送信します。

更新処理

タイマーイベントが発生した場合は、プレイしているユーザーがいる場合のみ、更新処理をおこないます。

更新処理をおこなう場合はGame.Updateメソッドを実行したあと、Gameオブジェクトをjsonに変換して文字列をクライアントサイドに送信します。ゲームを開始していない場合やゲームオーバーになっているクライアントには送信しません。

ユーザーがゲームを開始したときの処理

ユーザーがゲームを開始しようとしたときの処理を示します。

ユーザーがゲームを開始しようとしたときはGame.GetNewPlayerメソッドがnull以外を返すかどうか調べます。戻り値がnullでなければゲームに参加することができます。この場合はPlayer.GameStartメソッドを実行してクライアントサイドには”SendToClientGameStartSuccessful”を送信します。nullが返された場合は満員状態なので”SendToClientGameStartFailure”を送信します。

ユーザーがプレイヤーを操作しようとしたときの処理

ユーザーがプレイヤーを操作しようとしたときの処理を示します。

移動方向を変更しようとしているときはChangeDirectメソッドが呼び出されます。ユーザーに対応するPlayerオブジェクトを取得してPlayer.ChangeDirectメソッドを呼び出します。弾丸を発射するときはPlayer.Shotメソッドを呼び出します。このときtrueが返されたときは発射の処理が行なわれたことを意味しています。この場合はクライアントサイドに”SendToClientShoted”を送信します。