public void AddFrameDataFromServer(NotifyPlayersFrameInputCmd inputCmd) { if (!mDispatchedFromServer.ContainsKey(inputCmd.frame)) { mDispatchedFromServer[inputCmd.frame] = inputCmd; mLastServerFrame = Mathf.Max(mLastServerFrame, inputCmd.frame); } mServerCmdQueues.Enqueue(inputCmd); }
/// <summary> /// Update & dispatch all the events. /// </summary> public void DoUpdate(float timeDiff) { if (LesGameCore.Instance.CurrentGameState != GameState.State_Gaming) { return; } //while (mClientFrameIdx < mLastServerFrame) if (mServerCmdQueues.Count > 0) { NotifyPlayersFrameInputCmd cmd = mServerCmdQueues.Dequeue(); //if (mDispatchedFromServer.ContainsKey(mClientFrameIdx)) if (cmd != null) { foreach (var cmdData in cmd.ctrls) { LesUnit unit = LesBattleField.Instance.GetUnit(cmdData.key.ToString()); if (!unit || unit.IsDead || unit.MarkAsVanished || !unit.gameObject.activeInHierarchy) { continue; // 角色特殊情况下pass掉. } foreach (var inputCmd in cmdData.frames) { mCurrentMoveDelta = new Vector2(inputCmd.x, inputCmd.y); unit.ControlUnitMoveByLockStep(new Vector2(inputCmd.x, inputCmd.y), timeDiff); if (inputCmd.skill == 0) { unit.DoNormalAttack(); } else if (inputCmd.skill == 1 || inputCmd.skill == 2 || inputCmd.skill == 3 || inputCmd.skill == 4) { unit.DoSkill(inputCmd.skill); } } } } } mClientFrameIdx++; }