void FixedUpdate()
    {
        if (networkObject == null)
        {
            return;
        }

        // Everyone that is not the server or the controlling player will just set the position.
        if (!networkObject.IsServer && !_isOwner)
        {
            transform.position = networkObject.position;
            return;
        }

        // We advance one frame in the simulation
        _listener.AdvanceFrame();

        // The controlling player saves this Frame with his last input and action recorded.
        if (_isOwner)
        {
            _listener.SaveFrame();
        }

        // The server and the controlling player play the frames they saved.
        _listener.PlayFrame(transform);

        // We allow the server to catch up if he is too far behind because of prolonged latency
        if (networkObject.IsServer && _listener.FramesToPlay.Count > _listener.FrameSyncRate)
        {
            _listener.PlayFrame(transform);
        }

        // Reconcile frames when the client is too far away from the server-position.
        if (_isOwner)
        {
            _listener.ReconcileFrames();
        }

        // The server updates the position on the network for everyone else.
        if (networkObject.IsServer)
        {
            networkObject.position = transform.position;
        }
    }