using RebootKit.Engine.Foundation; using UnityEngine; namespace RebootReality.jelycho.Player { public class CameraSpring : MonoBehaviour { [Min(0.01f), SerializeField] float m_HalfLife = 0.075f; [SerializeField] float m_Frequency = 10.0f; [SerializeField] float m_ForwardAngularDisplacement = 1.0f; [SerializeField] float m_SidewaysAngularDisplacement = 1.0f; [SerializeField] float m_HeightAngularDisplacement = 2.0f; Vector3 m_SpringPosition; Vector3 m_SpringVelocity; public void Initialize() { m_SpringPosition = transform.position; m_SpringVelocity = Vector3.zero; } public void UpdateSpring(float deltaTime, Vector3 up, Vector3 right, Vector3 forward) { MathUtility.Spring(ref m_SpringPosition, ref m_SpringVelocity, transform.position, m_HalfLife, m_Frequency, deltaTime); Vector3 localSpringPosition = m_SpringPosition - transform.position; float springHeight = Vector3.Dot(localSpringPosition, up); float springForward = Vector3.Dot(localSpringPosition, forward); float springSideways = Vector3.Dot(localSpringPosition, right); float pitch = -springHeight * m_HeightAngularDisplacement + -springForward * m_ForwardAngularDisplacement; transform.localEulerAngles = new Vector3(pitch, 0.0f, springSideways * m_SidewaysAngularDisplacement); } } }