using System;
using Cielonos;
using Sirenix.OdinInspector;
using SLSUtilities.Feedback;
using SLSUtilities.Rendering.PostProcessing;
using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
///
/// 黑白闪反馈动作,在 Clip 持续时间内开启 StrobeFlash 的 AutoFlash,
/// Clip 结束或被打断时自动关闭。
///
[Serializable]
public class StrobeFlashAction : FeedbackActionBase
{
public override string DisplayName => "Strobe Flash";
///
/// 是否修改频率和颜色参数。
///
[Title("Strobe Settings")]
[LabelText("Modify Extra")]
public bool modifyExtra;
[ShowIf("modifyExtra")]
[LabelText("Frequency")]
public float frequency = 15f;
[ShowIf("modifyExtra")]
[LabelText("Color High")]
public Color colorHigh = Color.white;
[ShowIf("modifyExtra")]
[LabelText("Color Low")]
public Color colorLow = Color.black;
[NonSerialized] private StrobeFlash _strobeFlash;
[NonSerialized] private bool _initialEnable;
[NonSerialized] private bool _initialAutoFlash;
[NonSerialized] private float _initialFrequency;
[NonSerialized] private Color _initialColorHigh;
[NonSerialized] private Color _initialColorLow;
[NonSerialized] private bool _resolved;
public override void OnStart(FeedbackContext context)
{
_resolved = TryResolveComponent();
if (!_resolved) return;
_initialEnable = _strobeFlash.enableEffect.value;
_initialAutoFlash = _strobeFlash.autoFlash.value;
_initialFrequency = _strobeFlash.frequency.value;
_initialColorHigh = _strobeFlash.colorHigh.value;
_initialColorLow = _strobeFlash.colorLow.value;
_strobeFlash.enableEffect.value = true;
_strobeFlash.autoFlash.value = true;
if (modifyExtra)
{
_strobeFlash.frequency.value = frequency;
_strobeFlash.colorHigh.value = colorHigh;
_strobeFlash.colorLow.value = colorLow;
}
}
public override void OnUpdate(FeedbackContext context, float normalizedTime)
{
// StrobeFlash 由 Shader 内部的 _Time 驱动自动闪烁,
// Action 只负责开关控制,不需要每帧更新。
}
public override void OnEnd(FeedbackContext context)
{
RestoreValues();
}
public override void OnInterrupt(FeedbackContext context)
{
RestoreValues();
}
private bool TryResolveComponent()
{
if (_strobeFlash != null) return true;
if (PostProcessingManager.Instance == null)
{
Debug.LogWarning("[StrobeFlashAction] PostProcessingManager instance not found.");
return false;
}
if (!PostProcessingManager.Instance.GetVolumeComponent(out _strobeFlash))
{
Debug.LogWarning("[StrobeFlashAction] StrobeFlash not found in Volume Profile.");
return false;
}
return true;
}
private void RestoreValues()
{
if (!_resolved) return;
_strobeFlash.enableEffect.value = _initialEnable;
_strobeFlash.autoFlash.value = _initialAutoFlash;
_strobeFlash.frequency.value = _initialFrequency;
_strobeFlash.colorHigh.value = _initialColorHigh;
_strobeFlash.colorLow.value = _initialColorLow;
_resolved = false;
}
}
}