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 SpriteRenderer crossFadeRenderer1; // [SerializeField] private SpriteRenderer crossFadeRenderer2; // [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); targetSpriteRenderer.enabled = false; } else { Debug.LogError("未设置目标SpriteRenderer!"); } if (backupSpriteRenderer != null) { backupSpriteRenderer.color = new Color(1f, 1f, 1f, 0f); backupSpriteRenderer.enabled = false; } else { Debug.LogError("未设置备用SpriteRenderer!"); } // if (crossFadeRenderer1 != null) // { // crossFadeRenderer1.color = new Color(1f, 1f, 1f, 0f); // crossFadeRenderer1.enabled = false; // } // else // { // Debug.LogError("未设置交叉淡入淡出SpriteRenderer1!"); // } // if (crossFadeRenderer2 != null) // { // crossFadeRenderer2.color = new Color(1f, 1f, 1f, 0f); // crossFadeRenderer2.enabled = false; // } // else // { // Debug.LogError("未设置交叉淡入淡出SpriteRenderer2!"); // } } public IEnumerator TriggerFlash(string imagePath, float fadeDuration = 0.2f) { if (!isFading) { string fullPath = $"CG/{imagePath}"; Sprite flashSprite = ResourceKit.LoadAssetSync(fullPath); if (flashSprite != null) { yield return StartFlash(flashSprite, fadeDuration); } else { Debug.LogError($"无法加载闪回图片: {fullPath}"); yield break; } } else { Debug.Log($"无法开始闪烁:isFading={isFading}"); } } public IEnumerator TriggerEnding(string imagePath, float fadeDuration = 2f) { if (!isFading) { string fullPath = $"CG/{imagePath}"; Sprite endingSprite = ResourceKit.LoadAssetSync(fullPath); if (endingSprite != null) { if (currentEndingIndex == 0) { yield return StartEndingFadeIn(endingSprite, 0.01f); } else { yield return StartEndingFadeIn(endingSprite, fadeDuration); } currentEndingIndex++; } else { Debug.LogError($"无法加载结局图片: {fullPath}"); } } else { Debug.Log($"无法开始闪烁:isFading={isFading}"); } } private IEnumerator StartFlash(Sprite flashSprite, float fadeDuration = 0.5f) { targetSpriteRenderer.enabled = true; backupSpriteRenderer.enabled = true; 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; targetSpriteRenderer.enabled = false; backupSpriteRenderer.enabled = false; 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; // // 启用交叉淡入淡出渲染器 // crossFadeRenderer1.enabled = true; // crossFadeRenderer2.enabled = true; // // 设置第一个渲染器的sprite为当前显示的图片 // crossFadeRenderer1.sprite = targetSpriteRenderer.sprite; // crossFadeRenderer1.color = new Color(1f, 1f, 1f, 1f); // // 设置第二个渲染器的sprite为新图片 // crossFadeRenderer2.sprite = endingSprite; // crossFadeRenderer2.color = new Color(1f, 1f, 1f, 0f); // // 创建新的序列 // currentSequence?.Kill(); // currentSequence = DOTween.Sequence(); // // 第一个渲染器淡出,同时第二个渲染器淡入 // currentSequence.Join(crossFadeRenderer1.DOFade(0f, crossFadeDuration).SetEase(Ease.InOutSine)); // currentSequence.Join(crossFadeRenderer2.DOFade(1f, crossFadeDuration).SetEase(Ease.InOutSine)); // // 等待序列完成 // yield return currentSequence.WaitForCompletion(); // // 更新目标渲染器的sprite // targetSpriteRenderer.sprite = endingSprite; // targetSpriteRenderer.color = new Color(1f, 1f, 1f, 1f); // // 禁用交叉淡入淡出渲染器 // crossFadeRenderer1.enabled = false; // crossFadeRenderer2.enabled = false; // isFading = false; // currentSequence = null; // } private void OnDestroy() { currentSequence?.Kill(); } } }