您的位置:首页 > 移动开发 > Unity3D

Unity 音乐播放全局类

2015-10-27 16:23 465 查看


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");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: