using System; using Cielonos; using Sirenix.OdinInspector; using SLSUtilities.Feedback; using SLSUtilities.Rendering.PostProcessing; using UnityEngine; namespace Cielonos.MainGame.Effects.Feedback { /// /// 高级暗角反馈动作,通过 PostProcessingManager 驱动 AdvancedVignette Volume 参数。 /// 可用于受击暗角、环境压抑等效果。 /// [Serializable] public class VignetteAction : CurveShakeAction { public override string DisplayName => "Vignette"; /// /// 是否修改暗角中心点。 /// [Title("Vignette Settings")] [LabelText("Modify Center")] public bool modifyCenter; [ShowIf("modifyCenter")] [LabelText("Center")] public Vector2 center = new Vector2(0.5f, 0.5f); /// /// 是否修改颜色。 /// [LabelText("Modify Colors")] public bool modifyColors; [ShowIf("modifyColors")] [LabelText("Color Outer")] public Color colorOuter = Color.black; [ShowIf("modifyColors")] [LabelText("Color Inner")] public Color colorInner = Color.black; /// /// 是否修改柔和度和圆度。 /// [LabelText("Modify Shape")] public bool modifyShape; [ShowIf("modifyShape")] [LabelText("Smoothness")] [Range(0.01f, 1f)] public float smoothness = 0.5f; [ShowIf("modifyShape")] [LabelText("Roundness")] [Range(0f, 1f)] public float roundness = 1f; [NonSerialized] private AdvancedVignette _vignette; [NonSerialized] private float _initialIntensity; [NonSerialized] private Vector2 _initialCenter; [NonSerialized] private Color _initialColorOuter; [NonSerialized] private Color _initialColorInner; [NonSerialized] private float _initialSmoothness; [NonSerialized] private float _initialRoundness; [NonSerialized] private bool _resolved; public override void OnStart(FeedbackContext context) { _resolved = TryResolveComponent(); if (!_resolved) return; _initialIntensity = _vignette.intensity.value; _initialCenter = _vignette.center.value; _initialColorOuter = _vignette.colorOuter.value; _initialColorInner = _vignette.colorInner.value; _initialSmoothness = _vignette.smoothness.value; _initialRoundness = _vignette.roundness.value; if (modifyCenter) _vignette.center.value = center; if (modifyColors) { _vignette.colorOuter.value = colorOuter; _vignette.colorInner.value = colorInner; } if (modifyShape) { _vignette.smoothness.value = smoothness; _vignette.roundness.value = roundness; } } public override void OnUpdate(FeedbackContext context, float normalizedTime) { if (!_resolved) return; float newIntensity = EvaluateShake(normalizedTime, _initialIntensity); _vignette.intensity.value = newIntensity; } public override void OnEnd(FeedbackContext context) { RestoreValues(); } public override void OnInterrupt(FeedbackContext context) { RestoreValues(); } private bool TryResolveComponent() { if (_vignette != null) return true; if (PostProcessingManager.Instance == null) { Debug.LogWarning("[VignetteAction] PostProcessingManager instance not found."); return false; } if (!PostProcessingManager.Instance.GetVolumeComponent(out _vignette)) { Debug.LogWarning("[VignetteAction] AdvancedVignette not found in Volume Profile."); return false; } return true; } private void RestoreValues() { if (!_resolved) return; _vignette.intensity.value = _initialIntensity; _vignette.center.value = _initialCenter; _vignette.colorOuter.value = _initialColorOuter; _vignette.colorInner.value = _initialColorInner; _vignette.smoothness.value = _initialSmoothness; _vignette.roundness.value = _initialRoundness; _resolved = false; } } }