using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEngine.Rendering; using System.Collections; namespace AibisDream { public class SpriteFlashSystem : MonoBehaviour { [Header("References")] [SerializeField] private SpriteRenderer targetSpriteRenderer; [SerializeField] private SpriteRenderer backupSpriteRenderer; // [SerializeField] private float fadeDuration = 0.5f; // [SerializeField] private float crossFadeDuration = 2f; [SerializeField] private UnityEngine.Rendering.Volume volume1; private bool isFading = false; private bool isEndingMode = false; private DG.Tweening.Sequence currentSequence; private int currentEndingIndex = 0; private void Awake() { // 确保SpriteRenderer初始状态正确 if (targetSpriteRenderer != null) { targetSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); } else { Debug.LogError("未设置目标SpriteRenderer!"); } if (backupSpriteRenderer != null) { backupSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); } else { Debug.LogError("未设置备用SpriteRenderer!"); } } public IEnumerator TriggerFlash(string imagePath, float fadeDuration = 0.5f) { if (!isFading) { string fullPath = $"Assets/Resources/Art/CG/{imagePath}"; Sprite flashSprite = Resources.Load($"Art/CG/{imagePath}"); if (flashSprite != null) { yield return StartFlash(flashSprite, fadeDuration); } else { Debug.LogError($"无法加载闪回图片: {fullPath}"); } } else { Debug.Log($"无法开始闪烁:isFading={isFading}"); } } public void TriggerEnding(string imagePath,float fadeDuration=2f) { if (!isFading) { string fullPath = $"Assets/Resources/Art/CG/{imagePath}"; Sprite endingSprite = Resources.Load($"Art/CG/{imagePath}"); if (endingSprite != null) { if (currentEndingIndex == 0) { // 第一张图片使用淡入效果 StartEndingFadeIn(endingSprite,fadeDuration); } else { // 后续图片使用交叉淡入淡出效果 StartEndingCrossFade(endingSprite,fadeDuration); } currentEndingIndex++; } else { Debug.LogError($"无法加载结局图片: {fullPath}"); } } else { Debug.Log($"无法开始闪烁:isFading={isFading}"); } } private IEnumerator StartFlash(Sprite flashSprite, float fadeDuration = 0.5f) { Debug.Log("开始Sprite闪烁"); isFading = true; targetSpriteRenderer.sprite = flashSprite; targetSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); // 创建新的序列 currentSequence?.Kill(); currentSequence = DOTween.Sequence(); // 添加淡入效果 currentSequence.Append(targetSpriteRenderer.DOFade(1f, fadeDuration).SetEase(Ease.InOutSine)); if (volume1 != null) currentSequence.Join(DOTween.To(() => volume1.weight, x => volume1.weight = x, 1f, fadeDuration).SetEase(Ease.InOutSine)); // 添加淡出效果 currentSequence.Append(targetSpriteRenderer.DOFade(0f, fadeDuration).SetEase(Ease.InOutSine)); if (volume1 != null) currentSequence.Join(DOTween.To(() => volume1.weight, x => volume1.weight = x, 0f, fadeDuration).SetEase(Ease.InOutSine)); // 等待序列完成 yield return currentSequence.WaitForCompletion(); // 完成后重置状态 Debug.Log("闪烁效果完成"); isFading = false; currentSequence = null; DialogController.Instance.StartDialogNode("闪回完成"); } private void StartEndingFadeIn(Sprite endingSprite,float fadeDuration=2f) { isFading = true; targetSpriteRenderer.sprite = endingSprite; targetSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); // 创建新的序列 currentSequence?.Kill(); currentSequence = DOTween.Sequence(); // 添加淡入效果 currentSequence.Append(targetSpriteRenderer.DOFade(1f, fadeDuration).SetEase(Ease.InOutSine)); if (volume1 != null) currentSequence.Join(DOTween.To(() => volume1.weight, x => volume1.weight = x, 1f, fadeDuration).SetEase(Ease.InOutSine)); // 完成后重置状态 currentSequence.OnComplete(() => { isFading = false; currentSequence = null; }); } private void StartEndingCrossFade(Sprite endingSprite,float crossFadeDuration=2f) { isFading = true; // 设置备用渲染器的sprite backupSpriteRenderer.sprite = endingSprite; backupSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); // 创建新的序列 currentSequence?.Kill(); currentSequence = DOTween.Sequence(); // 当前sprite淡出,同时备用sprite淡入 currentSequence.Join(targetSpriteRenderer.DOFade(0f, crossFadeDuration).SetEase(Ease.InOutSine)); currentSequence.Join(backupSpriteRenderer.DOFade(1f, crossFadeDuration).SetEase(Ease.InOutSine)); // 完成后交换两个渲染器的角色 currentSequence.OnComplete(() => { // 交换sprite var tempSprite = targetSpriteRenderer.sprite; targetSpriteRenderer.sprite = backupSpriteRenderer.sprite; backupSpriteRenderer.sprite = tempSprite; // 重置透明度 targetSpriteRenderer.color = new Color(1f, 1f, 1f, 1f); backupSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); isFading = false; currentSequence = null; }); } private void OnDestroy() { currentSequence?.Kill(); } } }