Files
aibis-dream/Assets/Scripts/FixSystemNew/Open/SpriteFlashSystem.cs
T
2025-05-26 15:40:53 +08:00

187 lines
6.7 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;
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<Sprite>($"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<Sprite>($"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();
}
}
}