void LateUpdate() { //lock swivel position to target transform.position = m_swivelTarget.position; //lerp camera distance m_curCameraDistance = Mathf.Lerp(m_curCameraDistance, m_desiredCameraDistance, cameraPositionLerpFraction * Time.deltaTime * 30f); m_curCameraHeight = Mathf.Lerp(m_curCameraHeight, m_desiredCameraHeight, cameraPositionLerpFraction * Time.deltaTime * 30f); m_cameraObj.transform.localPosition = new Vector3(m_cameraObj.transform.localPosition.x, m_curCameraHeight, m_curCameraDistance); //force camera look if (cameraLookAtSwivel) { m_cameraObj.transform.rotation = Quaternion.LookRotation(transform.position - m_cameraObj.transform.position, m_characterController.KinematicCharacterMotor.CharacterUp); } //rotate towards velocity (check for 0 vel hitch bug and avoid drawing attention to it with camera) if (m_characterController.KinematicCharacterMotor.BaseVelocity.sqrMagnitude > 0f) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(m_characterController.KinematicCharacterMotor.BaseVelocity, m_characterController.KinematicCharacterMotor.CharacterUp), pitchLerpFraction * Time.deltaTime * 30f); Debug.DrawRay(transform.position, transform.forward * 10f, Color.cyan); } //debug to track sudden jerks in velocity float vel = Vector3.Distance(m_lastPos, transform.position) / Time.deltaTime; float badness = Mathf.Abs(vel - m_lastVel) / 2f; if (badness > .75f) { DebugUtil.DrawDebugCross(transform.position, 1f, Color.red, 100f); } Debug.DrawLine(m_lastPos, transform.position, Color.Lerp(Color.green, Color.red, badness), 100f); m_lastVel = vel; m_lastPos = transform.position; }