This commit is contained in:
2025-05-23 22:07:20 +08:00
parent e60a938319
commit 75ba953134
49 changed files with 7809 additions and 2674 deletions
@@ -0,0 +1,188 @@
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();
}
}
}