using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEngine.Rendering; using System.Collections; using AibisDream.Framework; using UnityEngine.EventSystems; using AibisDream.FixSystem; 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.2f) { 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 IEnumerator 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) { yield return StartEndingFadeIn(endingSprite, 0.01f); } else { yield return 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); StartCoroutine(CameraKit.Instance.ShakeCamera(fadeDuration, 0.25f, 60)); // 创建新的序列 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 IEnumerator 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)); // 等待序列完成 yield return currentSequence.WaitForCompletion(); // 完成后重置状态 isFading = false; currentSequence = null; } private IEnumerator 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)); // 等待序列完成 yield return currentSequence.WaitForCompletion(); // 交换两个渲染器的角色 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(); } } }