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)    收藏  举报

导航