using System; using Sirenix.OdinInspector; using UnityEngine; namespace SLSUtilities.Feedback { /// /// 通用的"按曲线震动数值"基类,提供曲线采样、初始值记录/复位等通用逻辑。 /// RadialBlur、ChromaticAberration、Vignette 等后处理效果均继承此类。 /// [Serializable] public abstract class CurveShakeAction : FeedbackActionBase { /// /// 震动曲线,X 轴为归一化时间 [0,1],Y 轴为震动强度 [0,1]。 /// [Title("Curve Shake")] [LabelText("Shake Curve")] public AnimationCurve shakeCurve = new AnimationCurve( new Keyframe(0f, 0f), new Keyframe(0.5f, 1f), new Keyframe(1f, 0f) ); /// /// 曲线值 0 对应的实际数值。 /// [LabelText("Remap Min")] public float remapMin; /// /// 曲线值 1 对应的实际数值。 /// [LabelText("Remap Max")] public float remapMax = 1f; /// /// 是否在初始值上叠加(而非替换)。 /// [LabelText("Relative to Initial")] public bool relativeToInitial; /// /// 根据归一化时间采样曲线并映射到实际值范围。 /// 如果 relativeToInitial 为 true,结果会叠加在 initialValue 上。 /// /// 归一化时间 [0,1] /// 初始值(OnStart 时记录) /// 映射后的最终数值 protected float EvaluateShake(float normalizedTime, float initialValue) { float curveValue = shakeCurve.Evaluate(normalizedTime); float remappedValue = Mathf.LerpUnclamped(remapMin, remapMax, curveValue); if (relativeToInitial) { return initialValue + remappedValue; } return remappedValue; } } }