/// <summary>
        /// Game Start
        /// </summary>
        private void prepareGameStart(GameReadyResponse response)
        {
            foreach (var key in response.PlayerBoards.Keys)
            {
                bool       isMine = loopParam.MineId == key;
                PlayerInfo info   = isMine ? playerInfo[MINE_IDX] : playerInfo[ENEMY_IDX];

                var playing = new NetworkPlayingState(info.Viewer, isMine);
                info.SetPlayState(playing);

                NetworkPlayStartState start = new NetworkPlayStartState(playing, ServerImpl, new GameStartRequest {
                    Id = key, RoomName = loopParam.RoomName
                });
                info.Ctrl.ReserveAddState(start);
            }
        }
        /// <summary>
        /// >マッチング時に与えられたルーム名をもとにゲーム準備を宣言
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task GameReadyAsync(GameReadyRequest request)
        {
            IsConnected = true;
            MineId      = request.MineId;
            EnemyId     = request.EnemyId;
            WithOther   = request.WithOther;

            // ゲームループ作成
            ServerMainGameLoop.LoopData data = new ServerMainGameLoop.LoopData(MineId, EnemyId, this, NetworkInput);
            ServerMainGameLoop.CreateNew(looperPool, logger, data);

            // ゲーム部屋に放り込む
            gameRoom = await Group.AddAsync(request.RoomName);

            if (WithOther)
            {   // 2P
                var memberNum = await gameRoom.GetMemberCountAsync();

                if (memberNum == 2)
                {   // 2人揃ったらゲームを開始してよい
                    logger.LogInformation($"GameReady at {MineId}");
                    var param = new Dictionary <string, IReadOnlyList <short> >();
                    // 互いの情報取得
                    var mineLoop = ServerMainGameLoop.TryTakeGame(MineId);
                    var enemLoop = ServerMainGameLoop.TryTakeGame(EnemyId);
                    param[MineId]  = mineLoop.PlayingState.Board;
                    param[EnemyId] = enemLoop.PlayingState.Board;

                    var res = new GameReadyResponse {
                        RoomName = request.RoomName, PlayerBoards = param
                    };
                    Broadcast(gameRoom).OnGameReady(res);
                }
            }
            else
            {   // 1P / 速攻でスタート
                logger.LogInformation($"GameReady at {MineId}");
                var loop  = ServerMainGameLoop.TryTakeGame(request.MineId);
                var param = new Dictionary <string, IReadOnlyList <short> >();
                param[MineId] = loop.PlayingState.Board;
                BroadcastToSelf(gameRoom).OnGameReady(new GameReadyResponse {
                    RoomName = request.RoomName, PlayerBoards = param
                });
            }
        }
 /// <summary>
 /// ゲーム準備終わり
 /// </summary>
 /// <param name="response"></param>
 public void OnGameReady(GameReadyResponse response)
 {
     Debug.Log($"GameReady!! at {loopParam.MineId}");
     prepareGameStart(response);
 }