void FixedUpdate() { //Client: Please read: http://forum.unity3d.com/threads/tips-for-server-authoritative-player-movement.199538/ //Client: Only client run simulation in realtime for the player to see if (isLocalPlayer) { //Client: start a new state localInputState = localInputState + 1; //Client: Updates camera cameraMouseAim.RunUpdate(Time.fixedDeltaTime); cameraAimPoint.RunUpdate(Time.fixedDeltaTime); //Client: gathers user input state characterInput.Parse(localInputState); //Client: add new input to the list inputStates.Enqueue(characterInput.currentInput); //Client: execute simulation on local data characterMovement.RunUpdate(Time.fixedDeltaTime); characterRotation.RunUpdate(Time.fixedDeltaTime); //Client: Trim commands to 25 and send commands to server if (inputStates.Count > WARNING_CLIENT_WAITING_STATES) { Debug.LogWarning("[NetworkInput]: States starting pulling up, are network condition bad?"); } if (inputStates.Count > MAX_CLIENT_WAITING_STATES) { Debug.LogError("Too many waiting states, starting to drop frames"); } while (inputStates.Count > MAX_CLIENT_WAITING_STATES) { inputStates.Dequeue(); } //Client: Send every sendInterval if (isServer && isLocalPlayer || nextSendTime < Time.time) { CmdSetServerInput(inputStates.ToArray(), transform.position); nextSendTime = Time.time + 0.33f; } } }