/// <summary> /// 接続・切断 /// </summary> private async void joinOrLeave() { if (!isJoin) { // 接続開始 var request = new MatchingJoinRequest { withOther = loopParam.WithOther }; await hubConnector.ServerImpl.JoinAsync(request); isJoin = true; } else { // 切断 await hubConnector.ServerImpl.LeaveAsync(); // UI初期化 isJoin = false; } }
/// <summary> /// マッチング参加(マッチングはでき次第通知) /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task JoinAsync(MatchingJoinRequest request) { // 待合室に放り込む matchingRoom = await Group.AddAsync("MatchingRoom"); if (request.withOther) { // 誰かとマッチングして対戦 // マッチング処理(今は単純にアクセスしてきた順にマッチングさせる) MatchingRoomManager.Data data = new MatchingRoomManager.Data(ConnectionId, Context); (string, MatchingRoomManager.Data)addResult = roomManager.TryMatching(data); if (!string.IsNullOrEmpty(addResult.Item1)) { // マッチング対象から外す roomManager.RemoveFromMatchingRoom(data.Id); roomManager.RemoveFromMatchingRoom(addResult.Item2.Id); // マッチングした者同士、部屋番号だけ教えるのであとは対戦サーバーにて再集結させる var mineId = ConnectionId.ToString(); var enemyId = addResult.Item2.Guid.ToString(); BroadcastToSelf(matchingRoom).OnMatchingSuccess(new MatchingRequestSuccessResponse { MineId = mineId, EnemeyId = enemyId, RoomName = addResult.Item1 }); BroadcastTo(matchingRoom, addResult.Item2.Guid).OnMatchingSuccess(new MatchingRequestSuccessResponse { MineId = enemyId, EnemeyId = mineId, RoomName = addResult.Item1 }); // マッチングルーム本体から退出させる await matchingRoom.RemoveAsync(addResult.Item2.Context); await matchingRoom.RemoveAsync(Context); } } else { // 1人でネットワーク(スコア更新用) / 特にすることもないので専用の部屋を作ってプレイしてもらう BroadcastToSelf(matchingRoom).OnMatchingSuccess(new MatchingRequestSuccessResponse { MineId = ConnectionId.ToString(), EnemeyId = "", RoomName = roomManager.GenerateRoomId() }); // マッチングルーム本体から退出させる await matchingRoom.RemoveAsync(Context); } }