public async void Start() { battlePhase = BattlePhase.Starting; // Register data handlers unitOrderMoveDataHandler = DataHandler.New(HandleUnitOrderMove, new NetDataFilterUnitOrder(battleData.id).And(new NetDataFilterType(typeof(UnitOrderMove)))); unitOrderStopDataHandler = DataHandler.New(HandleUnitOrderStop, new NetDataFilterUnitOrder(battleData.id).And(new NetDataFilterType(typeof(UnitOrderStop)))); NetDataEventManager.Instance.RegisterHandler(unitOrderMoveDataHandler); NetDataEventManager.Instance.RegisterHandler(unitOrderStopDataHandler); // Load players LoadBattleRequestData loadBattleRequestData = new LoadBattleRequestData() { battle = battleData }; NetRequest request1 = NetRequest.CreateAndSend(player1.NetworkingClient.Connection, loadBattleRequestData, Channel.ReliableFragmented); NetRequest request2 = NetRequest.CreateAndSend(player2.NetworkingClient.Connection, loadBattleRequestData, Channel.ReliableFragmented); await Task.WhenAll(request1.WaitForResponse(), request2.WaitForResponse()); bool player01Loaded = request1.response.GetDataOrDefault <bool>(); bool player02Loaded = request2.response.GetDataOrDefault <bool>(); if (player01Loaded == false || player02Loaded == false) { Log.Error(LogTag, $"Failed to start BattleSession for BattleData: {battleData}."); return; } // Start battle phases loop while (battlePhase != BattlePhase.BattleEnded) { StartPlanningPhase(); await WaitForEndOfPhase(); StartActionPhase(); await WaitForEndOfPhase(); if (battleData.unitsOnBoard.Count == 0) { battlePhase = BattlePhase.BattleEnded; } } }