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从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i