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常用方法 加载音乐文件 - ...
随机推荐
- 【转】vlc android 代码编译
转自:http://blog.csdn.net/asircao/article/details/7734201 系统:ubuntu12.04代码:git://git.videolan.org/vlc- ...
- 人物角色群体攻击判定(三)Physics.OverlapSphere(群体攻击)
使用Physics.OverlapSphere来检测不方便调试, 其他都可以. 核心代码: //检测敌人 public void CheckEnemy() { Collider[] cols = ...
- Android学习总结——欢迎页和导航页的实现
activity_welcome.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...
- iOS开发之Crash分析,以及收集
一 先谈谈iOS的Crash收集方式: 1. APP 发生crash,用户手机手机上肯定会有crash纪录,当然删除了该app,或是删了再装 crash纪录还是没了. 2. 如果用户设置-隐私 同 ...
- C/C++基本数据类型所占字节数
关于这个主要的问题,非常早曾经就非常清楚了,C标准中并没有详细给出规定那个基本类型应该是多少字节数,并且这个也与机器.OS.编译器有关,比方相同是在32bits的操作系统系,VC++的编译器下int类 ...
- [ES7] Object.observe + Microtasks
ES6: If you know about the Javascirpt's event loop. You know that any asyns opreations will be throw ...
- 动态修改UINavigationBar的背景色
这是我们最终想要得到的效果: 思路 在UISrollView的delegate方法 1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView ...
- 黑马程序员 ——Java SE(1)
----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...
- 系统简单的UIImagePickerController
1.从系统相册中读取 /* 判断选择的读取类型是否支持 UIImagePickerControllerSourceTypePhotoLibrary,普通相册 UIImagePickerControll ...
- (原)Understand中查看函数调用关系
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4994551.html 1. 选中某函数,如_tmain,右键“Graphical Views——Cal ...