public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            BodySync.WriteStreamData().WriteToStream(stream);
            HMDSync.WriteStreamData().WriteToStream(stream);
            LeftHandSync.WriteStreamData().WriteToStream(stream);
            RightHandSync.WriteStreamData().WriteToStream(stream);
        }
        else
        {
            float lag = Mathf.Abs((float)(PhotonNetwork.Time - info.SentServerTime));

            var streamData = new TransformStreamData();

            streamData.ReadFromStream(stream);
            BodySync.ReadStreamData(streamData, lag);

            streamData.ReadFromStream(stream);
            HMDSync.ReadStreamData(streamData, lag);

            streamData.ReadFromStream(stream);
            LeftHandSync.ReadStreamData(streamData, lag);

            streamData.ReadFromStream(stream);
            RightHandSync.ReadStreamData(streamData, lag);
        }
    }
    public void ReadStreamData(TransformStreamData streamData, float lag)
    {
        //Setup remote position.
        NetworkPosition = streamData.NetworkPosition;
        NetworkRotation = streamData.NetworkRotation;
        Direction       = streamData.Direction;

        if (IsFirstTake)
        {
            Distance = 0;
            Angle    = 0;
            Transform.localPosition = NetworkPosition;
            Transform.localRotation = NetworkRotation;

            IsFirstTake = false;
        }
        else
        {
            NetworkPosition += Direction * lag;
            Distance         = Vector3.Distance(Transform.localPosition, NetworkPosition);
            Angle            = Quaternion.Angle(Transform.localRotation, NetworkRotation);
        }
    }