using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
namespace GameFramework
{
///
/// 游戏失败叠加层 —— 直接挂在 Gameplay 场景的 Canvas 上。
///
/// 使用方式:
/// 1. 在 Gameplay 场景里创建一个空物体,挂上本脚本
/// 2. 运行一次游戏(或点 Editor 按钮),脚本会自动构建子 UI
/// 3. 停止运行后,子 UI 留在场景中,可自由编辑样式/位置/精灵
/// 4. 运行时由 GameManager 调用 GameLostOverlay.Show() 激活
///
/// 所有 UI 元素均为 [SerializeField],可在 Inspector 中替换。
///
public class GameLostOverlay : MonoBehaviour
{
private static GameLostOverlay _instance;
// ====== 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("标题渐现动效")]
[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("主界面按钮延迟出现时间(秒)")]
[SerializeField] private float buttonFadeDelay = 2f;
[Tooltip("按钮渐现时长(秒)")]
[SerializeField] private float buttonFadeDuration = 0.5f;
private bool _isVisible;
private Coroutine _titleAnimCoroutine;
private Coroutine _buttonFadeCoroutine;
private Material _rippleMaterial;
// ====================================================================
// 静态入口
// ====================================================================
///
/// 显示失败叠加层。优先使用场景中已有的实例,
/// 没有则动态创建一个。
///
public static void Show()
{
// 场景中已有(隐藏的)实例?
if (_instance != null)
{
_instance.Activate();
return;
}
// 尝试在场景中找到
var found = FindObjectOfType();
if (found != null)
{
_instance = found;
found.Activate();
return;
}
// 都没有 → 动态创建
var obj = new GameObject("GameLostOverlay");
var overlay = obj.AddComponent();
overlay.BuildAll();
overlay.Activate();
}
// ====================================================================
// 生命周期
// ====================================================================
void Awake()
{
_instance = this;
// 如果 Canvas 还没赋值,尝试从自身获取
if (lostCanvas == null)
lostCanvas = GetComponent