|
|
using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
public class VideoManager : Singleton<VideoManager>
|
{
|
private GameObjectPoolManager.GameObjectPool uiVideoPool;
|
|
private Dictionary<string, UIVideoPlayer> prepareDict = new Dictionary<string, UIVideoPlayer>();
|
|
private Dictionary<string, Action<bool, UIVideoPlayer>> prepareCallbacks = new Dictionary<string, Action<bool, UIVideoPlayer>>();
|
|
public void Init()
|
{
|
GameObject uiVideoPrefab = UILoader.LoadPrefab("UIVideoPlayer");
|
uiVideoPool = GameObjectPoolManager.Instance.GetPool(uiVideoPrefab);
|
}
|
|
public void Release()
|
{
|
if (uiVideoPool != null)
|
{
|
uiVideoPool.Clear();
|
uiVideoPool = null;
|
}
|
}
|
|
private UIVideoPlayer GetUIVideoPlayer()
|
{
|
GameObject videoObj = uiVideoPool.Request();
|
if (videoObj != null)
|
{
|
return videoObj.GetComponent<UIVideoPlayer>();
|
}
|
return null;
|
}
|
|
public UIVideoPlayer PrepareVideo(string videoName, Action<bool, UIVideoPlayer> onPrepared)
|
{
|
// 如果已经在准备中,直接返回 并给出提示 已经在加载准备中
|
if (prepareDict.TryGetValue(videoName, out UIVideoPlayer existingPlayer))
|
{
|
Debug.LogError("Video " + videoName + " is already being prepared.");
|
return existingPlayer;
|
}
|
|
|
UIVideoPlayer uiVideoPlayer = GetUIVideoPlayer();
|
if (uiVideoPlayer != null)
|
{
|
string _videoName = videoName; // 避免闭包问题
|
prepareDict.Add(_videoName, uiVideoPlayer);
|
prepareCallbacks.Add(_videoName, onPrepared);
|
uiVideoPlayer.Prepare(videoName, (success) =>
|
{
|
OnPrepareOK(videoName, success, uiVideoPlayer);
|
});
|
}
|
else
|
{
|
Debug.LogError("Failed to get UIVideoPlayer from pool.");
|
onPrepared?.Invoke(false, null);
|
}
|
return uiVideoPlayer;
|
}
|
|
|
public void CancelPrepare(UIVideoPlayer uIVideoPlayer)
|
{
|
if (uIVideoPlayer != null)
|
uIVideoPlayer.CancelPrepare();
|
{
|
uiVideoPool.Release(uIVideoPlayer.gameObject);
|
// 从 prepareDict 移除
|
string keyToRemove = null;
|
foreach (var kv in prepareDict)
|
{
|
if (kv.Value == uIVideoPlayer)
|
{
|
keyToRemove = kv.Key;
|
break;
|
}
|
}
|
if (keyToRemove != null)
|
{
|
prepareDict.Remove(keyToRemove);
|
prepareCallbacks.Remove(keyToRemove);
|
}
|
}
|
}
|
|
private void OnPrepareOK(string videoName, bool success, UIVideoPlayer uiVideoPlayer)
|
{
|
// 安全移除和回调
|
if (prepareDict.ContainsKey(videoName))
|
{
|
prepareDict.Remove(videoName);
|
}
|
Action<bool, UIVideoPlayer> callback = null;
|
if (prepareCallbacks.TryGetValue(videoName, out callback))
|
{
|
callback?.Invoke(success, uiVideoPlayer);
|
prepareCallbacks.Remove(videoName);
|
}
|
}
|
|
public void ReleaseVideoPlayer(UIVideoPlayer uIVideoPlayer)
|
{
|
if (uIVideoPlayer != null)
|
{
|
CancelPrepare(uIVideoPlayer);
|
uiVideoPool.Release(uIVideoPlayer.gameObject);
|
}
|
}
|
}
|