Unity组件开发--背景音乐管理器

2024-01-11 15:28

本文主要是介绍Unity组件开发--背景音乐管理器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.背景音乐作为一个独立的节点:

2.通过Url加载背景音乐:运行后添加AudioSource组件

using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Analytics;
using UnityEngine.Networking;public class PlaySceneBgm : MonoBehaviour
{[HideInInspector]public AudioSource audioS;[HideInInspector]public string url;[HideInInspector]public static PlaySceneBgm Instance;private bool isLoaded;// Start is called before the first frame update[HideInInspector]public string defaultbgmUrl = "";private float playCurMusicProgress = 0;private bool isPaused = false;private string lastPlayUrl = "";public void SetUrl(string audioLink){if (url == audioLink){return;}this.playCurMusicProgress = 0;url = audioLink;StartCoroutine(GetAudioClip(true));}// Start is called before the first frame updatevoid Awake(){audioS = gameObject.AddComponent<AudioSource>();audioS.playOnAwake = false;audioS.loop = true;audioS.volume = 0.25f;Instance = this;EventManager.Instance.AddListener(EventName.OnSceneLoaded, (s, e) => {if (!string.ReferenceEquals(PlayerData.Instance.TemplateId.ToString(), null)){url = "..........";}defaultbgmUrl = url;if (PlayerData.Instance.isRunningPC){Debug.Log("当前是在PC上播放背景音乐");StartCoroutine(GetAudioClip(true));}});EventManager.Instance.AddListener(EventName.stopSceneBgm, stopSceneBgm);EventManager.Instance.AddListener(EventName.playSceneBgm, playSceneBgm);EventManager.Instance.AddListener(EventName.changeSceneBgmValue, changeSceneBgmValue);}public float getCurMusicPro() {return this.playCurMusicProgress;}public void stopSceneBgm(object sender, EventArgs e) {if (isLoaded && audioS.clip != null){audioS.Pause();isPaused = true;}}public bool getPlayState() {if (isLoaded && audioS.clip != null){return audioS.isPlaying;}else {return false;}}public void playSceneBgm(object sender, EventArgs e){if (isLoaded && audioS.clip != null){audioS.Play();}else {StartCoroutine(GetAudioClip(true));}}// 恢复音频播放public void resumeSceneBgm(){if (isLoaded && audioS.clip != null){if (isPaused){StartCoroutine(ResumeWithDelay());//url = lastPlayUrl;//StartCoroutine(GetAudioClip(true));isPaused = false;}}}private IEnumerator ResumeWithDelay(){yield return new WaitForSeconds(0.1f); // 添加 0.1 秒的延迟if (isLoaded && audioS.clip != null){audioS.UnPause();}}public void changeSceneBgmValue(object sender, EventArgs e){var data = e as changeBgmVolume;if (data != null) {audioS.volume = data.volume;}}IEnumerator GetAudioClip(bool isPlay = false){this.playCurMusicProgress = 0;Debug.Log("音频加载11111" + url);if (UtilsFunc.IsURL(url) == false){yield break;}var audioType = AudioType.MPEG;if (UtilsFunc.UrlExtension(url, "*.mp3") || UtilsFunc.UrlExtension(url, "*.MP3")){audioType = AudioType.MPEG;}else if (UtilsFunc.UrlExtension(url, "*.wav")){audioType = AudioType.WAV;}else if (UtilsFunc.UrlExtension(url, "*.ogg")){audioType = AudioType.OGGVORBIS;}Debug.Log("音频加载0000" + url);//using (var uwr = UnityWebRequestMultimedia.GetAudioClip(url, audioType))//{//    yield return uwr.SendWebRequest();//    if (uwr.result != UnityWebRequest.Result.Success)//    {//        Debug.LogError("音频加载8888"+uwr.error);//        yield break;//    }//    Debug.Log("音频加载22222" + url);//    isLoaded = true;//    AudioClip clip = DownloadHandlerAudioClip.GetContent(uwr);//    // use audio clip//    // 在异步线程中进行加载和分配//    audioS.clip = clip;//    lastPlayUrl = url;//    StartCoroutine(LoadAudioClip(isPlay));    //}WWW _www = new WWW(url);yield return _www;if (_www.error == null){isLoaded = true;AudioClip _audioClip = _www.GetAudioClip(true, true, audioType);audioS.clip = _audioClip;lastPlayUrl = url;StartCoroutine(LoadAudioClip(isPlay));    }else{Debug.Log(_www.error);Debug.LogError("音频加载报错" + _www.error);yield break;}}public void WebRequestPlayMP3(){StartCoroutine(IELoadExternalAudioWebRequest(url, AudioType.MPEG));}public void WWWPlayMP3(){StartCoroutine(IELoadExternalAudioWWW(url, AudioType.MPEG));}public void WebRequestPlayWAV(){StartCoroutine(IELoadExternalAudioWebRequest(url, AudioType.WAV));}public void WWWPlayWAV(){StartCoroutine(IELoadExternalAudioWWW(url, AudioType.WAV));}private IEnumerator IELoadExternalAudioWebRequest(string _url, AudioType _audioType){UnityWebRequest _unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(_url, _audioType);yield return _unityWebRequest.SendWebRequest();if (_unityWebRequest.isHttpError || _unityWebRequest.isNetworkError){Debug.Log(_unityWebRequest.error.ToString());}else{AudioClip _audioClip = DownloadHandlerAudioClip.GetContent(_unityWebRequest);audioS.clip = _audioClip;audioS.Play();}}private IEnumerator IELoadExternalAudioWWW(string _url, AudioType _audioType){this.playCurMusicProgress = 0;Debug.Log("音频加载11111" + url);if (UtilsFunc.IsURL(url) == false){yield break;}WWW _www = new WWW(_url);yield return _www;if (_www.error == null){AudioClip _audioClip = _www.GetAudioClip(true, true, _audioType);audioS.clip = _audioClip;audioS.Play();}else{Debug.Log(_www.error);}}private IEnumerator LoadAudioClip(bool isPlay = false){yield return audioS.clip.LoadAudioData();yield return new WaitUntil(() => audioS.clip.loadState == AudioDataLoadState.Loaded);Debug.Log("音频加载状态......." + audioS.clip.loadState);if (isPlay && audioS.clip.loadState == AudioDataLoadState.Loaded){audioS.Play();}}// Update is called once per framevoid Update(){if (audioS.clip == null) {return;}// 获取音频播放的进度float progress = audioS.time / audioS.clip.length;// 输出播放进度//Debug.Log("当前歌曲播放进度:" + progress);this.playCurMusicProgress = progress;}
}

3.外部通过PlaySceneBgm.Instance 调用相关接口:

这篇关于Unity组件开发--背景音乐管理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594818

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW