diff --git a/Assets/MyGame/Framework/Tool/UITool/UIManager.cs b/Assets/MyGame/Framework/Tool/UITool/UIManager.cs
index 029e8b621..609a97cae 100644
--- a/Assets/MyGame/Framework/Tool/UITool/UIManager.cs
+++ b/Assets/MyGame/Framework/Tool/UITool/UIManager.cs
@@ -8,7 +8,6 @@ using System.Net;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
using TMPro;
-using UnityEngine.Video;
//ui面板枚举 这里要求分类 Main *00 *00-*99 整数为主界面尾数为子界面
public enum UIPanel
{
@@ -98,8 +97,6 @@ public enum UIPanel
/// 过场/加载面板接口(热更侧 LoadingPanel 实现)
public interface ILoadingPanel
{
- /// 设置并播放过场视频
- void PlayVideo(VideoClip clip);
/// 设置背景图
void SetBackground(Sprite sprite);
/// 注册播放结束回调
@@ -202,14 +199,19 @@ public class UIManager : MonoSingleton
_loadingShown = true;
}
- public ILoadingPanel ShowLoadPanel(VideoClip videoClip, Action action=null)
+ ///
+ /// 显示过场/加载面板(视频版)。
+ /// 过场视频不再由加载面板自己播放:LoginPanel 根节点的 VideoPlayer 会把视频投影到
+ /// 共享 RenderTexture(LoadBG),加载面板只是显示这张 RT,所以加载界面与登录界面
+ /// 用的是同一个 VideoPlayer、同一进度,衔接时不会出现偏差。
+ ///
+ public ILoadingPanel ShowLoadPanel(Action action=null)
{
ShowAsync(UIPanel.LoginPanel);
GameObject load = Instantiate(loadPanel, uiRoot);
var loadScript = load.GetComponent();
load.transform.GetChild(0).gameObject.SetActive(true);
- loadScript.PlayVideo(videoClip);
loadScript.SetOnEnd(action);
return loadScript;
}
diff --git a/Assets/MyGame/Scripts/Manager/GameManager.cs b/Assets/MyGame/Scripts/Manager/GameManager.cs
index ac1eab7ca..b0a3f1e52 100644
--- a/Assets/MyGame/Scripts/Manager/GameManager.cs
+++ b/Assets/MyGame/Scripts/Manager/GameManager.cs
@@ -13,7 +13,6 @@ using UnityEngine.InputSystem;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
-using UnityEngine.Video;
public class GameManager : MonoSingleton
{
@@ -586,7 +585,6 @@ public class GameManager : MonoSingleton
}
// Start is called before the first frame update
public Button btn_Skip;
- public VideoClip startVideoClip;
IEnumerator yanchi(ILoadingPanel loadingPanel)
{
@@ -600,16 +598,12 @@ public class GameManager : MonoSingleton
void Start()
{
btn_Skip.gameObject.SetActive(false);
- var v = UIManager.Instance.ShowLoadPanel(startVideoClip);
- //UIManager.Instance.ShowAsync(UIPanel.LoginPanel, null, (a) =>
- //{
- // v.LoadBar(100);
- //}, 28);
+ // 过场视频由 LoginPanel 根节点的 VideoPlayer 投影到共享 RT,加载面板只是显示它
+ var v = UIManager.Instance.ShowLoadPanel();
StartCoroutine(yanchi(v));
btn_Skip.onClick.AddListener(() =>
{
UIManager.Instance.StopShowPanel();
- //UIManager.Instance.ShowAsync(UIPanel.LoginPanel, null, null, 0);
v.LoadBar(100);
});
}
diff --git a/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadPanel.prefab b/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadPanel.prefab
index 1000db627..1c2e044ca 100644
--- a/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadPanel.prefab
+++ b/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadPanel.prefab
@@ -61,7 +61,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4e3d181187b8960468a09681396cff23, type: 3}
m_Name:
m_EditorClassIdentifier:
- player: {fileID: 0}
image_Bg: {fileID: 3732645741845648369}
fadeTime: 1.3
--- !u!223 &-8634983503678138505
diff --git a/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadingPanel.cs b/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadingPanel.cs
index d6189d2bd..2d8b61a73 100644
--- a/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadingPanel.cs
+++ b/Assets/MyGame/aa/UI/DefaultPanel/LoadPanel/LoadingPanel.cs
@@ -1,23 +1,26 @@
using DG.Tweening;
using System;
using System.Collections;
-using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class LoadingPanel : MonoBehaviour, ILoadingPanel
{
- public VideoPlayer player;
public Image image_Bg;
public Action actionEnd;
public float fadeTime = 1.3f;
- /// 设置并播放过场视频
- public void PlayVideo(VideoClip clip)
+ /// 过场视频显示的 RawImage(LoadPanel 预制体子节点 0),显示 LoginPanel VideoPlayer 投影的共享 RenderTexture
+ private RawImage videoImage;
+
+ /// LoginPanel 根节点上播放过场视频的 VideoPlayer(加载面板只是显示它的输出,不自己播放)
+ private VideoPlayer loginVideo;
+
+ private void Awake()
{
- player.clip = clip;
- player.Play();
+ if (transform.childCount > 0)
+ videoImage = transform.GetChild(0).GetComponent();
}
/// 设置背景图
@@ -38,14 +41,15 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
// 登录成功 UILoginPanel.Succeed() 的 ShowAsync(HomeMainPanel) 命中缓存秒开,
// 不再出现"登录成功后进大厅白等"。
StartCoroutine(PreloadHomeMainRoutine());
+ StartCoroutine(BindLoginVideoRoutine());
}
- /// 先让视频起播,播放过程中再预载大厅主面板(避免大包解压和视频启动抢主线程)
+ /// 播放过程中预载大厅主面板(避免大包解压和视频启动抢主线程)
private IEnumerator PreloadHomeMainRoutine()
{
- // 1) 等视频真正开始播放(最多等 5 秒兜底,防止视频未播时死等)
+ // 1) 等共享过场视频(LoginPanel 根节点 VideoPlayer)真正起播(最多等 5 秒兜底,防止视频未播时死等)
float waited = 0f;
- while (player != null && !player.isPlaying && waited < 5f)
+ while ((loginVideo == null || !loginVideo.isPlaying) && waited < 5f)
{
waited += Time.deltaTime;
yield return null;
@@ -58,6 +62,44 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
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);
+ }
+
///
/// 进入条进度值
///
@@ -69,19 +111,19 @@ public class LoadingPanel : MonoBehaviour, ILoadingPanel
// ⭐ 兜底再预载一次:若启动时 UIManager 尚未就绪导致首次发起无效,这里补上
if (UIManager.Instance != null)
UIManager.Instance.PreloadPanel(UIPanel.HomeMainPanel);
- GameManager.Instance.btn_Skip.gameObject.SetActive(false);
+
+ HideSkipButton();
+
Destroy(gameObject, fadeTime);
- if (player.gameObject.activeSelf)
+ if (videoImage != null && videoImage.gameObject.activeSelf)
{
- player.GetComponent().DOFade(0, fadeTime);
+ videoImage.DOFade(0, fadeTime);
}
- if (image_Bg.gameObject.activeSelf)
+ if (image_Bg != null && image_Bg.gameObject.activeSelf)
{
image_Bg.DOFade(0, fadeTime);
-
}
actionEnd?.Invoke();
}
-
}
}