using System; using System.Collections.Generic; using UnityEngine; public class VideoManager : Singleton { private GameObjectPoolManager.GameObjectPool uiVideoPool; private Dictionary prepareDict = new Dictionary(); private Dictionary> prepareCallbacks = new Dictionary>(); 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(); } return null; } public UIVideoPlayer PrepareVideo(string videoName, Action 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 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); } } }