Unity 本地加载视频和声音(异步加载)
using UnityEngine; using UnityEngine.Video; using UnityEngine.Networking; using System.Collections; using System.Collections.Generic; using System.IO; /// <summary> /// 媒体管理器:统一管理本地音乐和视频 /// 使用 StreamingAssets 文件夹,支持动态替换文件 /// </summary> public class MediaManager : MonoBehaviour { public static MediaManager Instance { get; private set; } private AudioSource _audioSource; public VideoPlayer _videoPlayer; // 音频缓存 private readonly Dictionary<string, AudioClip> _musicCache = new(); private readonly Queue<string> _musicHistory = new(); [Header("缓存设置")] [Tooltip("最大缓存的音乐数量")] public int MaxMusicCache = 5; private string _currentMusic; private string _currentVideo; private void Awake() { if (Instance != null) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); // 初始化音频播放器 _audioSource = gameObject.AddComponent<AudioSource>(); // 初始化视频播放器 // _videoPlayer = gameObject.AddComponent<VideoPlayer>(); _videoPlayer.playOnAwake = false; // _videoPlayer.renderMode = VideoRenderMode.CameraNearPlane; // 默认渲染到摄像机前 } #region 音乐播放 /// <summary> /// 播放音乐(避免重复播放同一首) /// </summary> public void PlayMusic(string fileName) { if (_currentMusic == fileName && _audioSource.isPlaying) return; if (_musicCache.TryGetValue(fileName, out var clip)) { _audioSource.clip = clip; _audioSource.Play(); _currentMusic = fileName; } else { StartCoroutine(LoadAndPlayMusic(fileName)); } } private IEnumerator LoadAndPlayMusic(string fileName) { string path = Path.Combine(Application.streamingAssetsPath, fileName); using UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(path, AudioType.MPEG); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"音乐加载失败: {request.error}"); yield break; } AudioClip clip = DownloadHandlerAudioClip.GetContent(request); // 加入缓存 if (!_musicCache.ContainsKey(fileName)) { _musicCache[fileName] = clip; _musicHistory.Enqueue(fileName); if (_musicHistory.Count > MaxMusicCache) { string oldest = _musicHistory.Dequeue(); if (_musicCache.ContainsKey(oldest)) { Destroy(_musicCache[oldest]); _musicCache.Remove(oldest); } } } _audioSource.clip = clip; _audioSource.Play(); _currentMusic = fileName; } public void StopMusic() { if (_audioSource.isPlaying) _audioSource.Stop(); } #endregion #region 视频播放 /// <summary> /// 播放视频(避免重复播放同一个视频) /// </summary> public void PlayVideo(string fileName) { if (_currentVideo == fileName && _videoPlayer.isPlaying) return; string path = Path.Combine(Application.streamingAssetsPath, fileName); _videoPlayer.url = path; _videoPlayer.Play(); _currentVideo = fileName; } public void StopVideo() { if (_videoPlayer.isPlaying) _videoPlayer.Stop(); } #endregion }
posted on 2025-08-17 00:03 zqiang0803 阅读(12) 评论(0) 收藏 举报