Files
aibis-dream/Assets/Scripts/FixSystemNew/Open/SpriteFlashSystem.cs
T
2025-05-23 22:07:20 +08:00

188 lines
7.0 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;
namespace AibisDream
{
public class SpriteFlashSystem : MonoBehaviour
{
[Header("Sprite Flash Settings")]
[SerializeField] private List<Sprite> spriteList = new List<Sprite>();
[SerializeField] private List<Sprite> endingSpriteList = new List<Sprite>();
[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<Sprite> spriteStack;
private Stack<Sprite> 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<Sprite>(spriteList);
Debug.Log($"初始化Sprite栈,共有{spriteStack.Count}个Sprite");
}
else
{
Debug.LogWarning("Sprite列表为空!");
}
// 初始化Ending Sprite栈
if (endingSpriteList != null && endingSpriteList.Count > 0)
{
endingSpriteStack = new Stack<Sprite>(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();
}
}
}