using DG.Tweening;
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class LoadingPanel : MonoBehaviour, ILoadingPanel
{
public Image image_Bg;
public Action actionEnd;
public float fadeTime = 1.3f;
/// 过场视频显示的 RawImage(LoadPanel 预制体子节点 0),显示 LoginPanel VideoPlayer 投影的共享 RenderTexture
private RawImage videoImage;
/// LoginPanel 根节点上播放过场视频的 VideoPlayer(加载面板只是显示它的输出,不自己播放)
private VideoPlayer loginVideo;
private void Awake()
{
if (transform.childCount > 0)
videoImage = transform.GetChild(0).GetComponent();
}
/// 设置背景图
public void SetBackground(Sprite sprite)
{
image_Bg.sprite = sprite;
}
/// 注册播放结束回调
public void SetOnEnd(Action action)
{
actionEnd = action;
}
private void Start()
{
// ⭐ 视频播放期间预载大厅主面板:把 HomeUIRes 的加载提前到这段视频等待时间里,
// 登录成功 UILoginPanel.Succeed() 的 ShowAsync(HomeMainPanel) 命中缓存秒开,
// 不再出现"登录成功后进大厅白等"。
StartCoroutine(PreloadHomeMainRoutine());
StartCoroutine(BindLoginVideoRoutine());
}
/// 播放过程中预载大厅主面板(避免大包解压和视频启动抢主线程)
private IEnumerator PreloadHomeMainRoutine()
{
// 1) 等共享过场视频(LoginPanel 根节点 VideoPlayer)真正起播(最多等 5 秒兜底,防止视频未播时死等)
float waited = 0f;
while ((loginVideo == null || !loginVideo.isPlaying) && waited < 5f)
{
waited += Time.deltaTime;
yield return null;
}
yield return new WaitForSeconds(0.5f); // 让视频先渲染几帧,起播更顺
// 2) 播放过程中加载:等 UIManager 就绪后发起预载
while (UIManager.Instance == null)
yield return null;
yield return null; // 等 UIManager 初始化完成(地址表装载)
UIManager.Instance.PreloadPanel(UIPanel.HomeMainPanel);
}
///
/// 过场视频由 LoginPanel 根节点的 VideoPlayer 播放并投影到共享 RenderTexture,
/// 这里等它就绪后监听 loopPointReached:视频第一遍循环播放完毕时隐藏跳过按钮。
/// (面板销毁时协程终止;OnDestroy 里也会解除监听)
///
private IEnumerator BindLoginVideoRoutine()
{
while (loginVideo == null)
{
yield return null;
if (UIManager.Instance == null) continue;
var login = UIManager.Instance.Get(UIPanel.LoginPanel);
if (login == null) continue;
loginVideo = login.GetComponent();
}
loginVideo.loopPointReached += OnFirstLoopPointReached;
}
/// 视频第一遍播完:隐藏跳过按钮并解除监听
private void OnFirstLoopPointReached(VideoPlayer vp)
{
vp.loopPointReached -= OnFirstLoopPointReached;
loginVideo = null;
HideSkipButton();
}
private void OnDestroy()
{
if (loginVideo != null)
loginVideo.loopPointReached -= OnFirstLoopPointReached;
}
private void HideSkipButton()
{
if (GameManager.Instance != null && GameManager.Instance.btn_Skip != null)
GameManager.Instance.btn_Skip.gameObject.SetActive(false);
}
///
/// 进入条进度值
///
/// 最大100 100时直接删除
public void LoadBar(int count)
{
if (count == 100)
{
// ⭐ 兜底再预载一次:若启动时 UIManager 尚未就绪导致首次发起无效,这里补上
if (UIManager.Instance != null)
UIManager.Instance.PreloadPanel(UIPanel.HomeMainPanel);
HideSkipButton();
Destroy(gameObject, fadeTime);
if (videoImage != null && videoImage.gameObject.activeSelf)
{
videoImage.DOFade(0, fadeTime);
}
if (image_Bg != null && image_Bg.gameObject.activeSelf)
{
image_Bg.DOFade(0, fadeTime);
}
actionEnd?.Invoke();
}
}
}