public static class Easing {
// 1. Sine (正弦) - 柔和
public static float EaseInSine(float t) => 1 - Mathf.Cos((t * Mathf.PI) / 2);
public static float EaseOutSine(float t) => Mathf.Sin((t * Mathf.PI) / 2);
// 2. Power Curves (Quad, Cubic, Quart, Quint) - 力度递增
public static float EaseInQuad(float t) => t * t;
public static float EaseOutQuad(float t) => 1 - (1 - t) * (1 - t);
public static float EaseInCubic(float t) => t * t * t;
public static float EaseOutCubic(float t) => 1 - Mathf.Pow(1 - t, 3);
public static float EaseInQuart(float t) => t * t * t * t;
public static float EaseOutQuart(float t) => 1 - Mathf.Pow(1 - t, 4);
public static float EaseInQuint(float t) => t * t * t * t * t;
public static float EaseOutQuint(float t) => 1 - Mathf.Pow(1 - t, 5);
// 3. Expo (指数) - 爆发
public static float EaseInExpo(float t) => t == 0 ? 0 : Mathf.Pow(2, 10 * t - 10);
public static float EaseOutExpo(float t) => t == 1 ? 1 : 1 - Mathf.Pow(2, -10 * t);
// 4. Circ (圆形) - 突然
public static float EaseInCirc(float t) => 1 - Mathf.Sqrt(1 - Mathf.Pow(t, 2));
public static float EaseOutCirc(float t) => Mathf.Sqrt(1 - Mathf.Pow(t - 1, 2));
// 5. Back (回弹) - 预备/过冲
public static float EaseInBack(float t) {
float c1 = 1.70158f; float c3 = c1 + 1;
return c3 * t * t * t - c1 * t * t;
}
public static float EaseOutBack(float t) {
float c1 = 1.70158f; float c3 = c1 + 1;
return 1 + c3 * Mathf.Pow(t - 1, 3) + c1 * Mathf.Pow(t - 1, 2);
}
// 6. Elastic (弹簧) - 弹性
public static float EaseOutElastic(float t) {
float c4 = (2 * Mathf.PI) / 3;
return t == 0 ? 0 : t == 1 ? 1 : Mathf.Pow(2, -10 * t) * Mathf.Sin((t * 10 - 0.75f) * c4) + 1;
}
// 7. Bounce (弹跳) - 撞击
public static float EaseOutBounce(float t) {
float n1 = 7.5625f; float d1 = 2.75f;
if (t < 1 / d1) return n1 * t * t;
else if (t < 2 / d1) return n1 * (t -= 1.5f / d1) * t + 0.75f;
else if (t < 2.5f / d1) return n1 * (t -= 2.25f / d1) * t + 0.9375f;
else return n1 * (t -= 2.625f / d1) * t + 0.984375f;
}
}