private IEnumerator <IYieldInstruction> TelemtrySpeedFilter() { float time = 0.0f; while (time < (TELEMETRY_UPDATE_RATE + TELEMETRY_SPEED_FILTER_PADDING)) { time += Time.deltaTime; yield return(new YieldUntilNextFrame()); } if (this.StateMachine.CurrentState is DefaultForeignAvatarState) { DefaultForeignAvatarState state = (DefaultForeignAvatarState)this.StateMachine.CurrentState; state.SetCurrentAvatarSpeed(0.0f); } }
private IEnumerator <IYieldInstruction> DeadReckonTelemetry(Vector3 position, Quaternion rotation) { float step = 1.0f / (TELEMETRY_UPDATE_RATE * 1.1f); Vector3 lastFixedUpdatePosition; for (float time = 0.0f; time < (TELEMETRY_UPDATE_RATE * 1.1f); time += Time.fixedDeltaTime) { float t = time * step; lastFixedUpdatePosition = this.Entity.UnityGameObject.transform.position; yield return(new YieldUntilNextFrame()); this.Entity.UnityGameObject.transform.position = Vector3.Lerp(mLastPosition, position, t); this.Entity.UnityGameObject.transform.rotation = Quaternion.Slerp(mLastRotation, rotation, t); if (this.StateMachine.CurrentState is DefaultForeignAvatarState) { DefaultForeignAvatarState state = (DefaultForeignAvatarState)this.StateMachine.CurrentState; // Add this frame's speed to the list of recent speeds float thisFrameSpeed = (lastFixedUpdatePosition - this.Entity.UnityGameObject.transform.position).magnitude / Time.fixedDeltaTime; mSpeeds.Add(thisFrameSpeed); if (mSpeeds.Count > mSpeedWindow) { mSpeeds.RemoveAt(0); } // Average the speeds float smoothSpeed = 0.0f; foreach (float speed in mSpeeds) { smoothSpeed += speed; } smoothSpeed /= (float)mSpeeds.Count; state.SetCurrentAvatarSpeed(smoothSpeed); } lastFixedUpdatePosition = this.Entity.UnityGameObject.transform.position; } }