提交
This commit is contained in:
@@ -2,22 +2,19 @@ using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using DG.Tweening;
|
||||
using UnityEngine.Rendering;
|
||||
using System.Collections;
|
||||
|
||||
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;
|
||||
[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 Stack<Sprite> spriteStack;
|
||||
private Stack<Sprite> endingSpriteStack;
|
||||
private bool isFading = false;
|
||||
private bool isEndingMode = false;
|
||||
private DG.Tweening.Sequence currentSequence;
|
||||
@@ -25,29 +22,6 @@ namespace AibisDream
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -68,116 +42,141 @@ namespace AibisDream
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public IEnumerator TriggerFlash(string imagePath, float fadeDuration = 0.5f)
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Space))
|
||||
if (!isFading)
|
||||
{
|
||||
Debug.Log("按下空格键");
|
||||
if (!isFading)
|
||||
string fullPath = $"Assets/Resources/Art/CG/{imagePath}";
|
||||
Sprite flashSprite = Resources.Load<Sprite>($"Art/CG/{imagePath}");
|
||||
if (flashSprite != null)
|
||||
{
|
||||
if (!isEndingMode && spriteStack != null && spriteStack.Count > 0)
|
||||
{
|
||||
StartSpriteFlash();
|
||||
}
|
||||
else if (isEndingMode && endingSpriteStack != null && endingSpriteStack.Count > 0)
|
||||
{
|
||||
StartEndingCrossFade();
|
||||
}
|
||||
yield return StartFlash(flashSprite, fadeDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"无法开始闪烁:isFading={isFading}, spriteStack.Count={spriteStack?.Count ?? 0}");
|
||||
Debug.LogError($"无法加载闪回图片: {fullPath}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"无法开始闪烁:isFading={isFading}");
|
||||
}
|
||||
}
|
||||
|
||||
private void StartSpriteFlash()
|
||||
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闪烁");
|
||||
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);
|
||||
isFading = true;
|
||||
targetSpriteRenderer.sprite = flashSprite;
|
||||
targetSpriteRenderer.color = new Color(1f, 1f, 1f, 0f);
|
||||
|
||||
// 创建新的序列
|
||||
currentSequence?.Kill();
|
||||
currentSequence = DOTween.Sequence();
|
||||
// 创建新的序列
|
||||
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(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.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;
|
||||
// 等待序列完成
|
||||
yield return currentSequence.WaitForCompletion();
|
||||
|
||||
// 检查是否需要切换到ending模式
|
||||
if (spriteStack.Count == 0 && endingSpriteStack != null && endingSpriteStack.Count > 0)
|
||||
{
|
||||
isEndingMode = true;
|
||||
Debug.Log("切换到Ending模式");
|
||||
// 显示第一张ending sprite
|
||||
ShowNextEndingSprite();
|
||||
}
|
||||
});
|
||||
}
|
||||
// 完成后重置状态
|
||||
Debug.Log("闪烁效果完成");
|
||||
isFading = false;
|
||||
currentSequence = null;
|
||||
DialogController.Instance.StartDialogNode("闪回完成");
|
||||
}
|
||||
|
||||
private void ShowNextEndingSprite()
|
||||
private void StartEndingFadeIn(Sprite endingSprite,float fadeDuration=2f)
|
||||
{
|
||||
if (endingSpriteStack.Count > 0)
|
||||
{
|
||||
var nextSprite = endingSpriteStack.Pop();
|
||||
targetSpriteRenderer.sprite = nextSprite;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
});
|
||||
}
|
||||
isFading = false;
|
||||
currentSequence = null;
|
||||
});
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
|
||||
Reference in New Issue
Block a user