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常用方法 加载音乐文件 - ...
随机推荐
- [bzoj1003][ZJOI2006][物流运输] (最短路+dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- Runtime运行时机制
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的 我们需要了解的是 Objective-C 是一门动态语言, ...
- 判断一个key 是否在map中存在
public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-gener ...
- time date 基础操作
一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...
- Mac截屏快捷键总结
Mac截屏快捷键总结 1)Command-Shift-3: 将整个屏幕拍下并保存到桌面. 2)Command-Shift-Control-3: 将整个屏幕拍下并保存到剪贴板(Clipboard ...
- 虚拟机IOS开发环境搭建教程
来源:http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html 安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB ...
- HTTP协议之 简易浏览器(3)--转载
简单的说,今天的全部工作就是 我的目的只有两个 1.加深对http协议的理解 2.深化对B/S结构的认识. 代码 1 /* 2 这个程序把主机地址写死了, 3 想更像的话,可以在加个输入.然后根据 ...
- T-SQL 函数概述
T-SQL函数的类别和描述: 函数类别 作用 聚合函数 返回一个标量值,表示在某个值域上的聚合,应用于特定的聚合选择或者汇总 配置变量 返回SQL Server执行环境的信息.这些信息可用于给对象编程 ...
- 最大流EK算法模板
最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用. #include<cstdio> #include<cstring> using n ...
- (原+转)pycharm中传入命令行参数
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5670821.html 参考网址: http://zhidao.baidu.com/question/5 ...