Files
aibis-dream/Assets/Scripts/FixSystemNew/Open/SpriteFlashSystem.cs
T
2025-05-27 18:18:41 +08:00

190 lines
6.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Sprite>($"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<Sprite>($"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();
}
}
}