Files
aibis-dream/Assets/Scripts/FixSystemNew/Open/SpriteFlashSystem.cs
T
2025-06-03 21:50:35 +08:00

226 lines
8.3 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 SpriteRenderer crossFadeRenderer1;
// [SerializeField] private SpriteRenderer crossFadeRenderer2;
// [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);
targetSpriteRenderer.enabled = false;
}
else
{
Debug.LogError("未设置目标SpriteRenderer");
}
if (backupSpriteRenderer != null)
{
backupSpriteRenderer.color = new Color(1f, 1f, 1f, 0f);
backupSpriteRenderer.enabled = false;
}
else
{
Debug.LogError("未设置备用SpriteRenderer");
}
// if (crossFadeRenderer1 != null)
// {
// crossFadeRenderer1.color = new Color(1f, 1f, 1f, 0f);
// crossFadeRenderer1.enabled = false;
// }
// else
// {
// Debug.LogError("未设置交叉淡入淡出SpriteRenderer1");
// }
// if (crossFadeRenderer2 != null)
// {
// crossFadeRenderer2.color = new Color(1f, 1f, 1f, 0f);
// crossFadeRenderer2.enabled = false;
// }
// else
// {
// Debug.LogError("未设置交叉淡入淡出SpriteRenderer2");
// }
}
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}");
yield break;
}
}
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 StartEndingFadeIn(endingSprite, fadeDuration);
}
currentEndingIndex++;
}
else
{
Debug.LogError($"无法加载结局图片: {fullPath}");
}
}
else
{
Debug.Log($"无法开始闪烁:isFading={isFading}");
}
}
private IEnumerator StartFlash(Sprite flashSprite, float fadeDuration = 0.5f)
{
targetSpriteRenderer.enabled = true;
backupSpriteRenderer.enabled = true;
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;
targetSpriteRenderer.enabled = false;
backupSpriteRenderer.enabled = false;
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;
// // 启用交叉淡入淡出渲染器
// crossFadeRenderer1.enabled = true;
// crossFadeRenderer2.enabled = true;
// // 设置第一个渲染器的sprite为当前显示的图片
// crossFadeRenderer1.sprite = targetSpriteRenderer.sprite;
// crossFadeRenderer1.color = new Color(1f, 1f, 1f, 1f);
// // 设置第二个渲染器的sprite为新图片
// crossFadeRenderer2.sprite = endingSprite;
// crossFadeRenderer2.color = new Color(1f, 1f, 1f, 0f);
// // 创建新的序列
// currentSequence?.Kill();
// currentSequence = DOTween.Sequence();
// // 第一个渲染器淡出,同时第二个渲染器淡入
// currentSequence.Join(crossFadeRenderer1.DOFade(0f, crossFadeDuration).SetEase(Ease.InOutSine));
// currentSequence.Join(crossFadeRenderer2.DOFade(1f, crossFadeDuration).SetEase(Ease.InOutSine));
// // 等待序列完成
// yield return currentSequence.WaitForCompletion();
// // 更新目标渲染器的sprite
// targetSpriteRenderer.sprite = endingSprite;
// targetSpriteRenderer.color = new Color(1f, 1f, 1f, 1f);
// // 禁用交叉淡入淡出渲染器
// crossFadeRenderer1.enabled = false;
// crossFadeRenderer2.enabled = false;
// isFading = false;
// currentSequence = null;
// }
private void OnDestroy()
{
currentSequence?.Kill();
}
}
}