using System; using System.Collections.Generic; using PhxhSDK; using Sirenix.OdinInspector; using UnityEngine; /// /// 动画参数配置 /// [Serializable] public class UIAnimProfile { [LabelText("总时长")] public float totalDuration = 0.3f; [LabelText("高斯模糊动效开关")] public bool useMask = true; [LabelText("高斯模糊显隐时间")] [ShowIf("useMask")] public UIAnimRange maskFade = new UIAnimRange(0f, 0.05f); [LabelText("背景显隐时间")] public UIAnimRange bgFade = new UIAnimRange(0.02f, 0.2f); [LabelText("背景缩放时间")] public UIAnimRange bgScale = new UIAnimRange(0.02f, 0.12f); [LabelText("背景起始缩放大小")] public float bgScaleFrom = 1.1f; [LabelText("背景最终缩放大小")] public float bgScaleTo = 1f; [LabelText("内容主体显隐时间")] public UIAnimRange contentFade = new UIAnimRange(0.15f, 0.3f); [LabelText("内容主体透明度缓动曲线")] public AnimationCurve alphaCurve = AnimationCurve.Linear(0, 0, 1, 1); [LabelText("内容主体缩放缓动曲线")] public AnimationCurve scaleCurve = AnimationCurve.Linear(0, 0, 1, 1); public UIAnimProfile Clone() { return new UIAnimProfile { totalDuration = totalDuration, maskFade = maskFade, bgFade = bgFade, bgScale = bgScale, bgScaleFrom = bgScaleFrom, bgScaleTo = bgScaleTo, contentFade = contentFade, alphaCurve = new AnimationCurve(alphaCurve.keys), scaleCurve = new AnimationCurve(scaleCurve.keys), useMask = useMask }; } } /// /// 时间区间(秒) /// [Serializable] public struct UIAnimRange { [LabelText("开始时间")] public float start; [LabelText("结束时间")] public float end; public float Duration => Mathf.Max(0f, end - start); public UIAnimRange(float start, float end) { this.start = start; this.end = end; } } /// /// ScriptableObject 用于配置动画参数,放到 Resources/UIAnimProfileConfig.asset 即可打包生效 /// [CreateAssetMenu(fileName = "UIAnimProfileConfig", menuName = "UI/UI Anim Profile Config", order = 0)] public class UIAnimProfileConfig : ScriptableObject { [Serializable] public class Entry { [LabelText("弹窗类型")] public UIAnimPresetType presetType = UIAnimPresetType.Level1; [LabelText("配置")] public UIAnimProfile profile = new UIAnimProfile(); } [SerializeField] private List entries = new List(); /// /// 获取指定预设的配置,返回克隆体避免运行时共享引用 /// public UIAnimProfile GetProfile(UIAnimPresetType preset) { if (entries == null || entries.Count == 0) return null; for (int i = 0; i < entries.Count; i++) { var e = entries[i]; if (e != null && e.presetType == preset && e.profile != null) { return e.profile.Clone(); } } return null; } }