using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using Architecture.Core;
namespace GameFramework
{
///
/// 游戏失败叠加层 —— 直接挂在 Gameplay 场景的 Canvas 上。
///
/// 使用方式:
/// 1. 在 Gameplay 场景里创建一个空物体,挂上本脚本
/// 2. 运行一次游戏(或点 Editor 按钮),脚本会自动构建子 UI
/// 3. 停止运行后,子 UI 留在场景中,可自由编辑样式/位置/精灵
/// 4. 运行时订阅 OnGameOver 事件自激活(不再由 GameManager 直接调用)
///
/// 所有 UI 元素均为 [SerializeField],可在 Inspector 中替换。
///
public class GameLostOverlay : MonoBehaviour
{
// ====== Canvas ======
[Header("Canvas(留空则自动创建)")]
[SerializeField] private Canvas lostCanvas;
// ====== UI 元素引用(全部可编辑) ======
[Header("背景蒙版")]
[SerializeField] private Image dimBackground;
[Header("标题 —— 你已迷失……")]
[SerializeField] private Text lostTitleText;
[SerializeField] private Image lostTitleImage; // 可用图片替代文字
[Header("装饰")]
[SerializeField] private Image leftDecoration;
[SerializeField] private Image rightDecoration;
[Header("主界面按钮")]
[SerializeField] private Button mainMenuButton;
[SerializeField] private Image mainMenuButtonImage;
[Header("音效")]
[SerializeField] private AudioData lostSFX;
[Header("SO 事件通道(替代 GameManager 直接调用 Show,订阅 OnGameOver 自激活)")]
[SerializeField] private GameEvent onGameOverEvent;
[Header("标题渐现动效")]
[Tooltip("标题渐现总时长(秒)")]
[SerializeField] private float titleFadeDuration = 1.5f;
[Tooltip("水面波纹位置抖动幅度(像素)")]
[SerializeField] private float ripplePositionAmplitude = 8f;
[Tooltip("水面波纹缩放抖动幅度")]
[SerializeField] private float rippleScaleAmplitude = 0.08f;
[Tooltip("水面波纹频率(越大抖动越快)")]
[SerializeField] private float rippleFrequency = 15f;
[Tooltip("水波纹材质(留空则自动从 Shader 创建)")]
[SerializeField] private Material rippleMaterial;
[Tooltip("水波纹着色器(留空则尝试 Shader.Find 兜底;建议拖入 Assets/UI/shaders/WaterRippleFade.shader 以避免构建裁剪导致运行时找不到)")]
[SerializeField] private Shader waterRippleShader;
[Tooltip("主界面按钮延迟出现时间(秒)")]
[SerializeField] private float buttonFadeDelay = 2f;
[Tooltip("按钮渐现时长(秒)")]
[SerializeField] private float buttonFadeDuration = 0.5f;
private bool _isVisible;
private Coroutine _titleAnimCoroutine;
private Coroutine _buttonFadeCoroutine;
private Material _rippleMaterial;
// ====================================================================
// 生命周期(激活由 OnGameOver 事件驱动,见 OnEnable)
// ====================================================================
void Awake()
{
// 如果 Canvas 还没赋值,尝试从自身获取
if (lostCanvas == null)
lostCanvas = GetComponent