using System.Collections.Generic; using UnityEngine; using UnityEngine.Video; public class VideoPlayerPool { private static VideoPlayerPool _instance; public static VideoPlayerPool Instance => _instance ??= new VideoPlayerPool(); private readonly Queue pool = new Queue(); private GameObject parent; private int maxCount = 5; // 已经分配出去的播放器(方便管理) private readonly HashSet inUsePlayers = new HashSet(); private VideoPlayerPool() { } public void Init(GameObject parentObj, int maxPoolCount) { parent = parentObj; maxCount = maxPoolCount; // 先清理旧的 foreach (var player in pool) { if (player != null) GameObject.Destroy(player.gameObject); } pool.Clear(); inUsePlayers.Clear(); // 创建初始播放器 for (int i = 0; i < maxCount; i++) { var go = new GameObject($"VideoPlayer_{i}"); go.transform.SetParent(parent.transform); var player = go.AddComponent(); player.playOnAwake = false; player.renderMode = VideoRenderMode.RenderTexture; pool.Enqueue(player); } } // 获取播放器 public VideoPlayer GetPlayer() { Debug.Log($"[VideoPlayerPool] GetPlayer VideoPlayerPool===={pool.Count}"); if (pool.Count == 0) { Debug.LogWarning("VideoPlayerPool空了,无法分配更多播放器"); return null; } var player = pool.Dequeue(); inUsePlayers.Add(player); player.gameObject.SetActive(true); return player; } // 归还播放器 public void ReturnPlayer(VideoPlayer player) { if (player == null) return; if (inUsePlayers.Contains(player)) { player.Stop(); player.clip = null; if (player.targetTexture != null) { player.targetTexture.Release(); GameObject.Destroy(player.targetTexture); player.targetTexture = null; } player.gameObject.SetActive(false); inUsePlayers.Remove(player); pool.Enqueue(player); } else { Debug.LogWarning("尝试归还未被分配的播放器"); } } // 释放所有 public void DisposeAll() { foreach (var player in pool) { if (player != null) GameObject.Destroy(player.gameObject); } foreach (var player in inUsePlayers) { if (player != null) GameObject.Destroy(player.gameObject); } pool.Clear(); inUsePlayers.Clear(); } }