void DeserializeDataContinuously() { if (m_StreamQueue.HasQueuedObjects() == false) { return; } for (int i = 0; i < m_SynchronizeLayers.Count; ++i) { if (m_SynchronizeLayers[i].SynchronizeType == SynchronizeType.Continuous) { m_Animator.SetLayerWeight(m_SynchronizeLayers[i].LayerIndex, (float)m_StreamQueue.ReceiveNext()); } } for (int i = 0; i < m_SynchronizeParameters.Count; ++i) { SynchronizedParameter parameter = m_SynchronizeParameters[i]; if (parameter.SynchronizeType == SynchronizeType.Continuous) { switch (parameter.Type) { case ParameterType.Bool: m_Animator.SetBool(parameter.Name, (bool)m_StreamQueue.ReceiveNext()); break; case ParameterType.Float: m_Animator.SetFloat(parameter.Name, (float)m_StreamQueue.ReceiveNext()); break; case ParameterType.Int: m_Animator.SetInteger(parameter.Name, (int)m_StreamQueue.ReceiveNext()); break; case ParameterType.Trigger: break; } } } }
/// <summary> /// Reads/writes the continuous animator parameters. /// </summary> private void Update() { if (PhotonNetwork.InRoom == false || PhotonNetwork.CurrentRoom.PlayerCount <= 1) { m_StreamQueue.Reset(); return; } // OnPhotonSerializeView is called within FixedUpdate while certain parameters need to be updated more often for a smooth movement. // Update those parameters here. if (m_PhotonView.IsMine) { m_StreamQueue.SendNext(HorizontalMovement); m_StreamQueue.SendNext(ForwardMovement); m_StreamQueue.SendNext(Pitch); m_StreamQueue.SendNext(Yaw); m_StreamQueue.SendNext(AbilityIndex); m_StreamQueue.SendNext(AbilityFloatData); } else { if (m_StreamQueue.HasQueuedObjects()) { SetHorizontalMovementParameter((float)m_StreamQueue.ReceiveNext(), 1); SetForwardMovementParameter((float)m_StreamQueue.ReceiveNext(), 1); SetPitchParameter((float)m_StreamQueue.ReceiveNext(), 1); SetYawParameter((float)m_StreamQueue.ReceiveNext(), 1); var abilityIndex = (int)m_StreamQueue.ReceiveNext(); // When the animator is snapped the ability index will be reset. It may take some time for that value to propagate across the network. // Wait to set the ability index until it is the correct reset value. if (m_SnappedAbilityIndex == -1 || abilityIndex == m_SnappedAbilityIndex) { SetAbilityIndexParameter(abilityIndex); m_SnappedAbilityIndex = -1; } SetAbilityFloatDataParameter((float)m_StreamQueue.ReceiveNext(), 1); } } }
/// <summary> /// Updates the LookSource values. /// </summary> public void Update() { if (PhotonNetwork.InRoom == false || PhotonNetwork.CurrentRoom.PlayerCount <= 1) { m_StreamQueue.Reset(); return; } // The look source variables are continuous and should be updated every frame. if (m_PhotonView.IsMine) { m_StreamQueue.SendNext(m_LookSource.LookDirectionDistance); m_StreamQueue.SendNext(m_LookSource.Pitch); m_StreamQueue.SendNext(m_LookSource.LookPosition()); m_StreamQueue.SendNext(m_LookSource.LookDirection(false)); } else if (m_StreamQueue.HasQueuedObjects()) { m_LookDirectionDistance = (float)m_StreamQueue.ReceiveNext(); m_Pitch = (float)m_StreamQueue.ReceiveNext(); m_LookPosition = (Vector3)m_StreamQueue.ReceiveNext(); m_LookDirection = (Vector3)m_StreamQueue.ReceiveNext(); } }