using UnityEngine; namespace SLSUtilities.Feedback { /// /// 震动曲线预设集合。每个方法返回一条全新的 AnimationCurve 实例。 /// 所有曲线的 X 轴为归一化时间 [0, 1],Y 轴为强度系数。 /// public static class ShakeCurvePresets { /// /// 预设名 → 工厂方法。 /// public static readonly (string name, System.Func factory)[] All = new[] { ("Impact", (System.Func)QuickImpact), ("Punch", (System.Func)Punch), ("Bump", (System.Func)SmoothBump), ("Fade Out", (System.Func)FadeOut), ("Oscillate", (System.Func)Oscillate), ("Dense Osc.", (System.Func)DenseOscillate), ("Anticipation", (System.Func)Anticipation), ("Recoil", (System.Func)Recoil), ("Double Hit", (System.Func)DoubleHit), ("Flash", (System.Func)Flash), }; /// /// 快速冲击 — 峰值出现在 10~15%,之后快速衰减至零。 /// 适合:打击确认、子弹命中、轻攻击。 /// public static AnimationCurve QuickImpact() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 8f), new Keyframe(0.12f, 1f, 0f, 0f), new Keyframe(0.5f, 0.12f, -0.6f, -0.3f), new Keyframe(1f, 0f, -0.1f, 0f) ); } /// /// 重拳 — 第 1 帧即达峰值,线性衰减至零。 /// 适合:重击、格挡冲击、爆炸瞬间。 /// public static AnimationCurve Punch() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, float.PositiveInfinity), new Keyframe(0.02f, 1f, 0f, -1.02f), new Keyframe(1f, 0f, -1.02f, 0f) ); } /// /// 平滑铃形 — 对称的升/降曲线(EaseInOut)。 /// 适合:脚步震动、跳跃落地、节奏性效果。 /// public static AnimationCurve SmoothBump() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 0f), new Keyframe(0.5f, 1f, 0f, 0f), new Keyframe(1f, 0f, 0f, 0f) ); } /// /// 渐弱 — 起始即为峰值,EaseOut 衰减至零。 /// 适合:爆炸余波、效果消散、技能冷却过渡。 /// public static AnimationCurve FadeOut() { return new AnimationCurve( new Keyframe(0f, 1f, 0f, 0f), new Keyframe(1f, 0f, -2f, 0f) ); } /// /// 衰减振荡 — 2~3 个波峰逐渐衰减。 /// 适合:爆炸余震、碰撞后振荡、弹跳。 /// public static AnimationCurve Oscillate() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 12f), new Keyframe(0.08f, 1f, 0f, 0f), new Keyframe(0.24f, -0.55f, 0f, 0f), new Keyframe(0.42f, 0.3f, 0f, 0f), new Keyframe(0.62f, -0.12f, 0f, 0f), new Keyframe(1f, 0f, 0f, 0f) ); } /// /// 密集衰减振荡 — 5~6 个波峰,频率更高,适合更猛烈的效果。 /// 适合:大型爆炸持续余震、引擎振动、电击。 /// public static AnimationCurve DenseOscillate() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 20f), new Keyframe(0.05f, 1f, 0f, 0f), new Keyframe(0.13f, -0.72f, 0f, 0f), new Keyframe(0.21f, 0.52f, 0f, 0f), new Keyframe(0.29f, -0.36f, 0f, 0f), new Keyframe(0.38f, 0.24f, 0f, 0f), new Keyframe(0.48f, -0.15f, 0f, 0f), new Keyframe(0.60f, 0.08f, 0f, 0f), new Keyframe(0.75f, -0.03f, 0f, 0f), new Keyframe(1f, 0f, 0f, 0f) ); } /// /// 预兆 + 冲击 — 先小幅反向蓄力,再大幅正向爆发。 /// 适合:重型近战预备 + 冲击,与动画预备帧配合。 /// public static AnimationCurve Anticipation() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 0f), new Keyframe(0.18f, -0.2f, 0f, 0f), new Keyframe(0.32f, 0f, 0f, 4f), new Keyframe(0.5f, 1f, 0f, 0f), new Keyframe(1f, 0f, -1.2f, 0f) ); } /// /// 后坐/反弹 — 快速达到峰值后超调回弹,逐渐收敛。 /// 适合:枪械后坐力、刀击挥出后的回摆。 /// public static AnimationCurve Recoil() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 10f), new Keyframe(0.1f, 1f, 0f, 0f), new Keyframe(0.32f, -0.3f, 0f, 0f), new Keyframe(0.52f, 0.12f, 0f, 0f), new Keyframe(0.72f, -0.04f, 0f, 0f), new Keyframe(1f, 0f, 0f, 0f) ); } /// /// 双击峰 — 两个依次递减的波峰。 /// 适合:连击、二段攻击、双弹命中。 /// public static AnimationCurve DoubleHit() { return new AnimationCurve( new Keyframe(0f, 0f, 0f, 8f), new Keyframe(0.12f, 1f, 0f, 0f), new Keyframe(0.32f, 0.1f, 0f, 0f), new Keyframe(0.52f, 0.7f, 0f, 0f), new Keyframe(1f, 0f, -0.6f, 0f) ); } /// /// 方波闪光 — 近乎即时上升/下降,中间保持峰值。 /// 适合:描边闪光、即时视觉强调、全屏闪白。 /// public static AnimationCurve Flash() { // 使用极陡切线模拟方波:在极短时间内完成升/降 return new AnimationCurve( new Keyframe(0f, 0f, 0f, float.PositiveInfinity), new Keyframe(0.02f, 1f, float.PositiveInfinity, 0f), new Keyframe(0.98f, 1f, 0f, float.NegativeInfinity), new Keyframe(1f, 0f, float.NegativeInfinity, 0f) ); } } }