Unity框架学习--音频管理器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 音频管理器
/// </summary>
public class AudioManager : SingletonMonoAutoBase1_DonDestoryOnLoad<AudioManager>
{//各个声道的AudioSource组件AudioSource bgmAudioSource;AudioSource bgsAudioSource;AudioSource voiceAudioSource;//各个声道的游戏对象GameObject bgmController;GameObject soundController;GameObject sound2D;GameObject sound3D;GameObject bgsController;GameObject msController;GameObject voiceController;//控制器的名字string bgmControllerName = "BGMController";string soundControllerName = "SoundController";string soundPool2DName = "SoundPool2D";string soundClip2DName = "SoundClip2D";string soundClip3DName = "SoundClip3D";string soundPool3DName = "SoundPool3D";string bgsControllerName = "BGSController";string msControllerName = "MSController";string voiceControllerName = "VoiceController";/// <summary>/// 播放音乐/// </summary>public void PlayBGM(AudioClip bgm,bool loop=true){if (bgm == null) return;bgmAudioSource.clip = bgm;bgmAudioSource.loop = loop;bgmAudioSource.Play();}/// <summary>/// 暂停BGM/// </summary>public void PauseBGM(){bgmAudioSource.Pause();}/// <summary>/// 取消暂停BGM/// </summary>public void UnPauseBGM(){bgmAudioSource.UnPause();}/// <summary>/// 停止BGM/// </summary>public void StopBGM(){bgmAudioSource.Stop();bgmAudioSource.clip = null;}/// <summary>/// 播放指定的音效--2D音效/// </summary>public void PlaySound(AudioClip sound){if (sound == null){Debug.LogWarning("传入的文件为空!");return;}//临时的空物体,用来播放音效GameObject go = null;for (int i = 0; i < sound2D.transform.childCount; i++){if (sound2D.transform.GetChild(i).gameObject.activeSelf){go = sound2D.transform.GetChild(i).gameObject;go.SetActive(true);break;}}if (go == null){go = new GameObject(soundClip2DName);go.transform.SetParent(sound2D.transform);}//如果该游戏对象身上没有AudioSource组件,则添加AudioSource组件并设置参数if (!go.TryGetComponent<AudioSource>(out AudioSource audioSource)){go.AddComponent<AudioSource>();audioSource.playOnAwake = false;audioSource.loop = false;}//设置要播放的音效audioSource.clip = sound;StartCoroutine(DestroyWhenFinished());//每隔一秒检测一次,如果该音效播放完毕,则销毁音效的游戏对象IEnumerator DestroyWhenFinished(){do{yield return new WaitForSeconds(1);} while (audioSource!=null && audioSource.time > 0);if (go != null){go.SetActive(false);audioSource.clip = null;}}}/// <summary>/// 播放3D音效/// </summary>public void PlaySound(AudioClip sound,GameObject target){if (sound == null){Debug.LogWarning("传入的文件为空!");return;}if (target == null){Debug.LogWarning("传入的target为空!");return;}//临时的空物体,用来播放音效GameObject go = null;//如果对象池中有,则从对象池中取出来用for (int i = 0; i < sound3D.transform.childCount; i++){if (!sound3D.transform.GetChild(i).gameObject.activeSelf){go = sound3D.transform.GetChild(i).gameObject;go.SetActive(true);break;}}//如果对象池中没有,则创建一个游戏对象if (go == null){go = new GameObject(soundClip3DName);}go.transform.SetParent(target.transform);go.transform.localPosition = Vector3.zero;if (go.TryGetComponent<AudioSource>(out AudioSource audioSource)){audioSource = go.AddComponent<AudioSource>();audioSource.playOnAwake = false;audioSource.loop = false;audioSource.spatialBlend = 1f;  //3D效果,近大远小}//设置要播放的音频audioSource.clip = sound;audioSource.Play();StartCoroutine(DestroyWhenFinsh());IEnumerator DestroyWhenFinsh(){do{yield return new WaitForSeconds(1);} while (audioSource.time > 0);}if (go != null){//放入对象池go.transform.SetParent(sound3D.transform);go.transform.localPosition = Vector3.zero;audioSource.clip = null;go.SetActive(false);}}/// <summary>/// 在世界空间中指定的位置播放3D音效/// </summary>public void PlaySound(AudioClip sound,Vector3 worldPosition,Transform parent=null){if (sound == null){return;}GameObject go = null;for (int i = 0; i < sound3D.transform.childCount; i++){if (sound3D.transform.GetChild(i).gameObject.activeSelf){go = sound3D.transform.GetChild(i).gameObject;go.SetActive(true);break;}}if (go==null){go = new GameObject(soundClip3DName);}go.transform.position = worldPosition;go.transform.SetParent(parent);if (!go.TryGetComponent<AudioSource>(out AudioSource audioSource)){audioSource = go.AddComponent<AudioSource>();audioSource.playOnAwake = false;audioSource.loop = false;audioSource.spatialBlend = 1f;}audioSource.clip = sound;audioSource.Play();StartCoroutine(DestroyWhenFinshed());IEnumerator DestroyWhenFinshed(){do{yield return new WaitForSeconds(1);} while (audioSource!=null && audioSource.time > 0);if (go != null){go.transform.SetParent(sound3D.transform);go.transform.localPosition = Vector3.zero;audioSource.clip = null;go.SetActive(false);}}}/// <summary>/// 播放环境音效/// </summary>public void PlayBGS(AudioClip bgs,bool loop=true){if (bgs==null){return;}bgsAudioSource.loop = loop;bgsAudioSource.clip = bgs;bgsAudioSource.Play();}/// <summary>/// 暂停环境音效/// </summary>public void PauseBGS(){bgsAudioSource.Pause();}/// <summary>/// 取消暂停环境音效/// </summary>public void UnPause(){bgsAudioSource.UnPause();}/// <summary>/// 停止BGS/// </summary>public void StopBGS(){bgsAudioSource.Stop();bgsAudioSource.clip = null;}private void Awake(){//创建并设置背景音乐的控制器bgmController = CreateController(bgmControllerName, transform);bgmAudioSource = bgmController.AddComponent<AudioSource>();bgmAudioSource.playOnAwake = false;bgmAudioSource.loop = true;//创建音效控制器soundController = CreateController(soundControllerName, transform);sound2D = CreateController(soundPool2DName, soundController.transform);sound3D = CreateController(soundPool3DName, soundController.transform);bgsController = CreateController(bgsControllerName, transform);  //环境音效bgsAudioSource = bgsController.AddComponent<AudioSource>();bgsAudioSource.playOnAwake = false;bgsAudioSource.loop = true;msController = CreateController(msControllerName, transform);  //提示音效voiceController = CreateController(voiceControllerName,transform);  //角色语音voiceAudioSource = voiceController.AddComponent<AudioSource>();voiceAudioSource.loop = false;voiceAudioSource.playOnAwake = false;}GameObject CreateController(string name,Transform parent){GameObject go = new GameObject(name);go.transform.SetParent(parent);return go;}
}

很多代码写的大差不差的,完全可以精简

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#实现依赖注入

当谈到C#中的依赖注入(Dependency Injection,DI)时,我们可以使用一个简单的示例来说明它是如何工作的。依赖注入是一种设计模式,用于将依赖关系从一个类传递到另一个类,以实现松耦合和可测试性。 假设我们有一个简单的订单处理应用程序,其中包含两个主要类:OrderServi…

音视频 ffplay命令-主要选项

选项说明-x width强制显示宽带-y height强制显示高度-video_size size帧尺寸 设置显示帧存储(WxH格式)&#xff0c;仅适用于类似原始YUV等没有包含帧大小(WxH)的视频-pixel_format format格式设置像素格式-fs以全屏模式启动-an禁用音频&#xff08;不播放声音&#xff09;-vn禁…

leetcode第359场周赛

随机更新.... 7004. 判别首字母缩略词 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s &#xff0c;则认为 s 是 words 的首字母缩略词。例如&#xff0c…

uniapp配置添加阿里巴巴图标icon流程步骤

文章目录 下载复制文件到项目文件夹里项目配置目录结构显示图标 下载 阿里巴巴icon官网 https://www.iconfont.cn/ 复制文件到项目文件夹里 项目配置目录结构 显示图标

go atomic原子操作详细解读

文章目录 概要1、基本知识1.1 原子操作是什么1.2 CPU怎么实现原子操作的&#xff1f; 2、atomic包2.1、 Add函数2.2、CompareAndSwap函数2.3、Swap函数2.4、Load函数2.5、Store函数 3、atomic.Value值 概要 atomic包是golang通过对底层系统支持的原子操作进行封装&#xff0c;…

华为将收取蜂窝物联网专利费,或将影响LPWAN市场发展

近日&#xff0c;华为正式公布了其4G和5G手机、Wi-Fi6设备和物联网产品的专利许可费率&#xff0c;其中包含了长距离通信技术蜂窝物联网。作为蜂窝物联网技术的先驱&#xff0c;华为是LTE Category NB (NB-IoT)、LTE Category M和其他4G物联网标准的主要贡献者。 在NB-IoT领域…

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…

React2023电商项目实战 - 1.项目搭建

古人学问无遗力&#xff0c;少壮工夫老始成。 纸上得来终觉浅&#xff0c;绝知此事要躬行。 —— 陆游《《冬夜读书示子聿》》 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff09;内容审核(自动) 文章目录 系列文章目录一、项目介绍1.页面…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

python绘制谷歌地图

谷歌地图 更多好看的图片见pyecharts官网 import pyecharts.options as opts from pyecharts.charts import MapGlobe from pyecharts.faker import POPULATIONdata [x for _, x in POPULATION[1:]] low, high min(data), max(data)c (MapGlobe().add_schema().add(mapty…

解决el-select回显异常 显示option选项的value 而不是显示label

1、问题 回显的value和选项value类型不同 form中v-model"form.userId"是字符串类型 option中:value“item.userId” 选项id是数字类型 2、办法 :value“item.userId” 改为 :value“item.iduserId‘’”&#xff08;转换成字符串&#xff09; <el-form-item l…

面试之快速学习STL-map

关联式容器 包括 map、multimap、set 以及 multiset 这 4 种容器。和序列式容器区别&#xff1a; a . 关联式容器在存储元素时还会为每个元素在配备一个键&#xff0c;整体以键值对的方式存储到容器中。 b . 相比前者&#xff0c;关联式容器可以通过键值直接找到对应的元素&am…

【100天精通python】Day42:python网络爬虫开发_HTTP请求库requests 常用语法与实战

目录 1 HTTP协议 2 HTTP与HTTPS 3 HTTP请求过程 3.1 HTTP请求过程 3.2 GET请求与POST请求 3.3 常用请求报头 3.4 HTTP响应 4 HTTP请求库requests 常用语法 4.1 发送GET请求 4.2 发送POST请求 4.3 请求参数和头部 4.4 编码格式 4.5 requests高级操作-文件上传 4.6 …

Spring Boot 统一功能处理

目录 1.用户登录权限效验 1.1 Spring AOP 用户统一登录验证的问题 1.2 Spring 拦截器 1.2.1 自定义拦截器 1.2.2 将自定义拦截器加入到系统配置 1.3 拦截器实现原理 1.3.1 实现原理源码分析 2. 统一异常处理 2.1 创建一个异常处理类 2.2 创建异常检测的类和处理业务方法 3. 统一…

go-test

单元测试 基本用法 Go语言测试 常用reflect.DeepEqual()对slice进行比较 跳过某些测试用例 func TestTimeConsuming(t *testing.T) {if testing.Short() {t.Skip("short模式下会跳过该测试用例")}... }当执行go test -short时就不会执行上面的TestTimeConsuming测…

python http文件上传

server端代码 import os import cgi from http.server import SimpleHTTPRequestHandler, HTTPServer# 服务器地址和端口 host = 0.0.0.0 port = 8080# 处理文件上传的请求 class FileUploadHandler(SimpleHTTPRequestHandler):def do_POST(self):# 解析多部分表单数据form = …

【Spring系列篇--关于IOC的详解】

目录 面试经典题目&#xff1a; 1. 什么是spring&#xff1f;你对Spring的理解&#xff1f;简单来说&#xff0c;Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.什么是IoC&#xff1f;你对IoC的理解&#xff1f;IoC的重要性?将实例化对象的权利从程序员…

Centos 8 网卡connect: Network is unreachable错误解决办法

现象1、ifconfig没有ens160配置 [testlocalhost ~]$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopba…

基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目&#xff1a;Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724…

CentOS Linux 78安全基线检查

阿里云标准-CentOS Linux 7/8安全基线检查 检查项类别描述加固建议等级密码复杂度检查身份鉴别检查密码长度和密码是否使用多种字符类型编辑/etc/security/pwquality.conf&#xff0c;把minlen(密码最小长度)设置为8-32位&#xff0c;把minclass(至少包含小写字母、大写字母、数…