using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEngine.Rendering; namespace AibisDream { public class SpriteFlashSystem : MonoBehaviour { [Header("Sprite Flash Settings")] [SerializeField] private List spriteList = new List(); [SerializeField] private List endingSpriteList = new List(); [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 Stack spriteStack; private Stack endingSpriteStack; private bool isFading = false; private bool isEndingMode = false; private DG.Tweening.Sequence currentSequence; private int currentEndingIndex = 0; private void Awake() { Debug.Log("SpriteFlashSystem Awake"); // 初始化Sprite栈 if (spriteList != null && spriteList.Count > 0) { spriteStack = new Stack(spriteList); Debug.Log($"初始化Sprite栈,共有{spriteStack.Count}个Sprite"); } else { Debug.LogWarning("Sprite列表为空!"); } // 初始化Ending Sprite栈 if (endingSpriteList != null && endingSpriteList.Count > 0) { endingSpriteStack = new Stack(endingSpriteList); Debug.Log($"初始化Ending Sprite栈,共有{endingSpriteStack.Count}个Sprite"); } else { Debug.LogWarning("Ending Sprite列表为空!"); } // 确保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!"); } } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("按下空格键"); if (!isFading) { if (!isEndingMode && spriteStack != null && spriteStack.Count > 0) { StartSpriteFlash(); } else if (isEndingMode && endingSpriteStack != null && endingSpriteStack.Count > 0) { StartEndingCrossFade(); } } else { Debug.Log($"无法开始闪烁:isFading={isFading}, spriteStack.Count={spriteStack?.Count ?? 0}"); } } } private void StartSpriteFlash() { Debug.Log("开始Sprite闪烁"); if (spriteStack.Count > 0) { isFading = true; var nextSprite = spriteStack.Pop(); Debug.Log($"设置下一个Sprite: {nextSprite.name}"); targetSpriteRenderer.sprite = nextSprite; 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)); // 完成后重置状态 currentSequence.OnComplete(() => { Debug.Log("闪烁效果完成"); isFading = false; currentSequence = null; // 检查是否需要切换到ending模式 if (spriteStack.Count == 0 && endingSpriteStack != null && endingSpriteStack.Count > 0) { isEndingMode = true; Debug.Log("切换到Ending模式"); // 显示第一张ending sprite ShowNextEndingSprite(); } }); } } private void ShowNextEndingSprite() { if (endingSpriteStack.Count > 0) { var nextSprite = endingSpriteStack.Pop(); targetSpriteRenderer.sprite = nextSprite; targetSpriteRenderer.color = new Color(1f, 1f, 1f, 1f); } } private void StartEndingCrossFade() { if (endingSpriteStack.Count > 0) { isFading = true; var nextSprite = endingSpriteStack.Pop(); // 设置备用渲染器的sprite backupSpriteRenderer.sprite = nextSprite; 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(); } } }