Unity 音乐播放全局类
今天晚了LOL, 发现里面的声音系统做得很不错,于是最近就写了一份反正以后也用的到,2D音乐全局播放.
项目跟PoolManager对象池插件结合了.
解决的问题:
1. 已经播放的声音,可以马上暂停或者减少音量等等
2. 实现音乐全局控制
3. 音乐和音效分开控制
4. 音乐重叠播放
类如下:
AudioShot 音乐实体类
SoundController 全局音乐控制类
SoundPanel 音乐面板
代码如下:
AudioShot实体类:
using UnityEngine;
using System.Collections; public class AudioShot : MonoBehaviour {
public AudioSource audioSource;
public string audioName;
}
SoundController类:
using UnityEngine;
using System.Collections;
using PathologicalGames;
using System.Collections.Generic; /*
* 2D音乐播放全局控制类
* 如果有音乐已经在播放了,改变声音大小,或者停止播放
* 可控制已经在播放的音乐马上暂停,或改变当前的音量
*/
public class SoundController : MonoBehaviour { private float fxVolume = 1; //音效声音大小
private float musicVolume = 1; //音乐声音大小 private bool isPlayFxVolume = true; //是否播放音效声音
private bool isPlayMusicVolume = true; //是否播放音乐声音 public AudioClip[] fxClip;
public AudioClip[] musicClip; private SpawnPool audioSpwan; //音乐游戏物体池
private List<AudioSource> fxAudioList; //为了控制已经播放的音乐,需要记录他们的引用
private List<AudioSource> musicAudioList;
public static SoundController instance;
private int audioCount; //音乐下标值计时器 public void Awake()
{
audioSpwan = PoolManager.Pools["Audio"];
fxAudioList = new List<AudioSource>();
musicAudioList = new List<AudioSource>();
instance = this;
} /// <summary>
/// 播放音效不可重叠播放
/// </summary>
/// <param name="name"></param>
public void PlayFxSound(string name)
{
if (isPlayFxVolume)
{
for (int i = 0; i < fxClip.Length; i++)
{
if (name == fxClip[i].name)
{
audio.PlayOneShot(fxClip[i], fxVolume);
return;
}
}
}
} /// <summary>
/// 播放音效可重叠播放(NGUI播放方式,只能一次播放完整才能销毁,最好不要使用)
/// </summary>
/// <param name="name"></param>
public void PlayFxSoundOverlap(string name)
{
if (fxClip == null) return; if (isPlayFxVolume)
{
for (int i = 0; i < fxClip.Length; i++)
{
if (name == fxClip[i].name)
{
//NGUITools.PlaySound(fxClipStatic[i], fxVolume);
var gameObject = audioSpwan.Spawn("AudioShotGame");
gameObject.audio.clip = fxClip[i];
gameObject.audio.volume = fxVolume;
gameObject.audio.Play(); AudioShot model = gameObject.GetComponent<AudioShot>(); if (string.IsNullOrEmpty(model.audioName))
{
model.name = audioCount + "";
audioCount++;
fxAudioList.Add(gameObject.audio); //添加到集合中
} return;
}
}
}
} /// <summary>
/// 播放音乐
/// </summary>
/// <param name="name"></param>
public void PlayMusicSound(string name)
{
if(isPlayMusicVolume)
{
for (int i = 0; i < musicClip.Length; i++)
{
if (name == musicClip[i].name)
{
audio.PlayOneShot(musicClip[i], musicVolume);
return;
}
}
}
} public void PlayMusicSoundOverlap(string name)
{
if (musicClip == null) return; if(isPlayMusicVolume)
{
for (int i = 0; i < musicClip.Length; i++)
{
if (name == musicClip[i].name)
{
var gameObject = audioSpwan.Spawn("AudioShotGame");
gameObject.audio.clip = musicClip[i];
gameObject.audio.volume = musicVolume;
gameObject.audio.Play(); AudioShot model = gameObject.GetComponent<AudioShot>();
if (string.IsNullOrEmpty(model.audioName))
{
model.audioName = audioCount + "";
audioCount++;
//添加到集合中
musicAudioList.Add(gameObject.audio);
} return;
}
}
}
}
public void UpdateFxVolume(float volume)
{
this.fxVolume = volume; foreach (var i in fxAudioList)
{
i.volume = volume;
}
}
public void UpdateMusicVolume(float volume)
{
this.musicVolume = volume; foreach (var i in musicAudioList)
{
i.volume = volume;
}
}
public void IsPlayFxVolume(bool isPlay)
{
isPlayFxVolume = isPlay; if (isPlay == false)
{
foreach (var i in fxAudioList)
{
i.volume = 0;
}
}
else
{
foreach (var i in fxAudioList)
{
i.volume = fxVolume;
}
}
}
public void IsPlayMusicVolume(bool isPlay)
{
isPlayMusicVolume = isPlay; if (isPlay == false)
{
foreach (var i in musicAudioList)
{
i.volume = 0;
}
}
else
{
foreach (var i in musicAudioList)
{
i.volume = musicVolume;
}
}
}
public void ClearAudioSource()
{
for (int i = 0; i < musicAudioList.Count; i++)
{
if (musicAudioList[i].isPlaying == false)
{
musicAudioList.Remove(musicAudioList[i]);
}
} for (int i = 0; i < fxAudioList.Count; i++)
{
if (fxAudioList[i].isPlaying == false)
{
fxAudioList.Remove(fxAudioList[i]);
}
}
} }
音乐控制面板类:
using UnityEngine;
using System.Collections; public class SoundPanel : MonoBehaviour { public void UpdateFxVolume(float i)
{
SoundController.instance.UpdateFxVolume(i);
} public void UpdateMusicVolume(float i)
{
SoundController.instance.UpdateMusicVolume(i);
} public void isPlayFxSound(bool isOpen)
{
SoundController.instance.IsPlayFxVolume(isOpen);
} public void isPlayMusicSound(bool isOpen)
{
SoundController.instance.IsPlayMusicVolume(isOpen);
} public void PlayMusic()
{
SoundController.instance.PlayMusicSoundOverlap("3550");
} public void PlayFx()
{
SoundController.instance.PlayFxSoundOverlap("1843");
} }
源代码地址: http://yunpan.cn/cKSQeasSgVXbD 提取码 dedb
Unity 音乐播放全局类的更多相关文章
- [MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载
>目录< >——————————————————————< 1.建立工程 1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows So ...
- iOS开发拓展篇—音频处理(音乐播放器2)
iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 ...
- iOS开发拓展篇—音频处理(音乐播放器3)
iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...
- [个人项目] 使用 Vuejs 完成的音乐播放器
Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获. api:我使用的是一个开源的 nod ...
- 【转】【Unity】实现全局管理类的几种方式
本文原作者未知,转载自:http://blog.csdn.net/ycl295644/article/details/42458477 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和 ...
- Unity中实现全局管理类的几种方式
(搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...
- iOS开发--音乐文件播放工具类的封装(包含了音效的封装)
一.头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface ...
- android 音乐播放器
本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
随机推荐
- 后台数据导出为Excel
数据导出的方法如下: 一.下载office的类库:microsoft.office.interop.excel.zip 根据电脑安装的office版本选择引入相应的类库,office2007选择12. ...
- Eat Candy(暴力,水)
Eat Candy Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 8 Solved: 6[Submit][Status][Web Board] Des ...
- PHP获取中英文混合字符串长度及截取
1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * ...
- 设置 git config 的一些默认配置
设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...
- CSU 1808 地铁
题意: ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟 ...
- CSS筛选器简单实例1
1.通配符 <!--筛选器---通配符实例--> <!--支持IE7+ --> <style type="text/css"> *.all { ...
- Android ListView使用(非原创)
1.ListView:它以列表的形式展示具体要显示的内容,并且能够根据数据的长度自适应屏幕显示 <LinearLayout xmlns:android="http://schemas. ...
- 【SQL语句】 - Ctrl+3 查询表属性的存储过程 [sp_select_talberowName]
/**-- ============================================= Author: xftCteateDate: 2013-10-11Description:查看表 ...
- iPad学做菜
项目描述:家常菜.川菜 .鲁菜.东北菜.甜品等各大菜系应有尽有,详细的制作步骤,再也不用为自己不会做饭而烦恼. 主要技术:主界面采用UISplitViewController的结构设计:自定义各大菜系 ...
- Install cv2.so for Anaconda
sudo apt-get install python-opencv cp /usr/lib/python2.7/dist-packages/cv2.so /opt/anaconda/lib/pyth ...