今天晚了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 音乐播放全局类的更多相关文章

  1. [MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

    >目录< >——————————————————————< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows So ...

  2. iOS开发拓展篇—音频处理(音乐播放器2)

    iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 ...

  3. iOS开发拓展篇—音频处理(音乐播放器3)

    iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...

  4. [个人项目] 使用 Vuejs 完成的音乐播放器

    Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获. api:我使用的是一个开源的 nod ...

  5. 【转】【Unity】实现全局管理类的几种方式

    本文原作者未知,转载自:http://blog.csdn.net/ycl295644/article/details/42458477 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和 ...

  6. Unity中实现全局管理类的几种方式

    (搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...

  7. iOS开发--音乐文件播放工具类的封装(包含了音效的封装)

    一.头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface ...

  8. android 音乐播放器

    本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...

  9. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

随机推荐

  1. python json基础学习01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import json #全称(javascript object  ...

  2. 《招聘一个靠谱的iOS》面试题参考答案(上)

    说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 博文中给出了高质量的面试题,但是未给出答案, ...

  3. Apache POI组件操作Excel,制作报表(一)

    Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和Po ...

  4. python学习之路-9 socket网络编程

    socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  5. Codeforces 67C Sequence of Balls 编辑距离 dp

    题目链接:点击打开链接 有一个交换操作比較特殊,所以记录每一个点距离自己近期的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一 ...

  6. Linux 编译安装 apache 2.4

    在安装apache之前需要准备一些必要的依赖包 gcc安装: #yum install -y gcc gcc-c++安装: #yum install gcc-c++  apr安装: 下载包:apr-1 ...

  7. Masonry的一些使用。

    除了等距的有问题(懒得改了),其他用过挺正常的,我自己也是刚使用,有问题还请海涵. 地址:http://pan.baidu.com/s/1boyxu8Z

  8. 内存操作相关内核 API 的使用

    1.RtlCopyMemory .RtlCopyBytes.RtlMoveMemory: 2.RtlZeroMemory.RtlFillMemory: 3.RtlEqualMemory: 4.ExAl ...

  9. (转)在Eclipse中使用JUnit4进行单元测试

    原地址:http://blog.csdn.net/andycpp/article/details/1327147

  10. 指令中 controller && controllerAs

    1, controller 他会暴露一个API,利用这个API可以在多个指令之间通过依赖注入进行通信. controller($scope, $element, $attrs, $tranclude) ...