using UnityEngine; namespace CameraShake { /// /// Contains methods for changing strength and direction of shakes depending on their position. /// public static class Attenuator { /// /// Returns multiplier for the strength of a shake, based on source and camera positions. /// public static float Strength(StrengthAttenuationParams pars, Vector3 sourcePosition, Vector3 cameraPosition) { Vector3 vec = cameraPosition - sourcePosition; float distance = Vector3.Scale(pars.axesMultiplier, vec).magnitude; float strength = Mathf.Clamp01(1 - (distance - pars.clippingDistance) / pars.falloffScale); return Power.Evaluate(strength, pars.falloffDegree); } /// /// Returns displacement, opposite to the direction to the source in camera's local space. /// public static Displacement Direction(Vector3 sourcePosition, Vector3 cameraPosition, Quaternion cameraRotation) { Displacement direction = Displacement.Zero; direction.position = (cameraPosition - sourcePosition).normalized; direction.position = Quaternion.Inverse(cameraRotation) * direction.position; direction.eulerAngles.x = direction.position.z; direction.eulerAngles.y = direction.position.x; direction.eulerAngles.z = -direction.position.x; return direction; } [System.Serializable] public class StrengthAttenuationParams { /// /// Radius in which shake doesn't lose strength. /// [Tooltip("Radius in which shake doesn't lose strength.")] public float clippingDistance = 10; /// /// Defines how fast strength falls with distance. /// [Tooltip("How fast strength falls with distance.")] public float falloffScale = 50; /// /// Power of the falloff function. /// [Tooltip("Power of the falloff function.")] public Degree falloffDegree = Degree.Quadratic; /// /// Contribution of each axis to distance. E. g. (1, 1, 0) for a 2D game in XY plane. /// [Tooltip("Contribution of each axis to distance. E. g. (1, 1, 0) for a 2D game in XY plane.")] public Vector3 axesMultiplier = Vector3.one; } } }