123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using System;
- using UnityEngine;
- using Random = UnityEngine.Random;
- namespace HQFPSWeapons
- {
- [Serializable]
- public class CameraShakeSettings
- {
- public Vector3 PositionAmplitude;
- public Vector3 RotationAmplitude;
- public AnimationCurve Decay = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
- [Clamp(0f, 10f)]
- public float Duration = 2f;
- public float Speed = 1f;
- }
- [Serializable]
- public class CameraShake
- {
- public bool IsDone { get { return Time.time > m_EndTime; } }
- private CameraShakeSettings m_Settings;
- private Spring m_PositionSpring;
- private Spring m_RotationSpring;
- private float m_Speed;
- private float m_Scale;
- private float xSign, ySign, zSign;
- private float m_EndTime;
- public CameraShake(CameraShakeSettings settings, Spring positionSpring, Spring rotationSpring, float scale)
- {
- m_Settings = settings;
- m_PositionSpring = positionSpring;
- m_RotationSpring = rotationSpring;
- m_Speed = m_Settings.Speed;
- m_Scale = scale;
- xSign = Random.Range(0, 100) > 50 ? 1f : -1f;
- ySign = Random.Range(0, 100) > 50 ? 1f : -1f;
- zSign = Random.Range(0, 100) > 50 ? 1f : -1f;
- m_EndTime = Time.time + settings.Duration;
- }
- public void Update()
- {
- if (IsDone)
- return;
- UpdateShake(m_PositionSpring, m_Settings.PositionAmplitude);
- UpdateShake(m_RotationSpring, m_Settings.RotationAmplitude);
- }
- private void UpdateShake(Spring spring, Vector3 amplitude)
- {
- float timer = (m_EndTime - Time.time) * m_Speed;
- Vector3 shake = new Vector3(
- xSign * Mathf.Sin(timer) * amplitude.x * m_Scale,
- ySign * Mathf.Cos(timer) * amplitude.y * m_Scale,
- zSign * Mathf.Sin(timer) * amplitude.z * m_Scale
- );
- spring.AddForce(shake * m_Settings.Decay.Evaluate(1f - (m_EndTime - Time.time) / m_Settings.Duration));
- }
- }
- }
|