hch
5 小时以前 bc6f633a2f3cfc01122d8fd4452f69313ddcb32b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 
 
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);
        }
    }
}