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

unity框架研究之音频管理部分(1)

2016-10-10 14:53 274 查看
代码内容不是本人原创的,请原谅我斗胆作为原创发表:

首先是存放声音的脚本SoundBank(声音银行),是用一个类来存放声音:

,请注意,这个类是序列话了的!!!并且不用继承MonoBehaviour

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class SoundBank
{

public string name;
public AudioClip[] sounds;
List<AudioClip> soundsList = new List<AudioClip>();//声音列表

/// <summary>
/// 初始化声音列表
/// </summary>
void FillList()
{
foreach( AudioClip clip in sounds )
{
soundsList.Add(clip);
}
}

/// <summary>
/// 获得一个声音
/// </summary>
/// <returns></returns>
public AudioClip GetRandomClip()
{
if ( soundsList.Count == 0 )
{
FillList();
}

if (  soundsList.Count > 0 )
{
AudioClip clip = soundsList[0];
soundsList.RemoveAt(0);
return clip;
}

/*if ( _sounds.Length == 1 )
{
return _sounds[0];
}
else if ( _sounds.Length > 0 )
{
int ind = Random.Range( 0, _sounds.Length );
return _sounds[ind];
}*/

return null;
}

/// <summary>
/// 获得指定的声音Z
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public AudioClip GetClip( int index )
{
if ( index < sounds.Length )
{
return sounds[index];
}
return null;
}
}


然后下面就是声音图书馆(SoundLibrary),这个是继承MonoBehaviour,并且把SoundBank序列号后当做变量来使用,就像这样

[SerializeField]
SoundBank[] soundLibrary;
Dictionary<string, SoundBank> soundLibraryDict = new Dictionary<string, SoundBank>();


这样就可以很好的保存声音了,想使用哪一个或者哪一类声音就很方便了,下面是全部的代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// 声音图书馆的形成,建立一个用于存放声音的bank,
/// 里面有声音的源文件和获得该声音的方法等(不必继承MonoBehaviour)
/// </summary>
public class SoundLibrary : MonoBehaviour
{
[SerializeField] SoundBank[] soundLibrary; Dictionary<string, SoundBank> soundLibraryDict = new Dictionary<string, SoundBank>();
public SoundBank[] banks
{
get { return soundLibrary; }
}

// Use this for initialization
public void Init()
{

GenerateDictionary();
}

/// <summary>
/// 初始化声音字典
/// </summary>
void GenerateDictionary()
{
soundLibraryDict = new Dictionary<string, SoundBank>();

if (soundLibrary != null)
{
foreach (SoundBank s in soundLibrary)
{
soundLibraryDict.Add(s.name, s);
}
}
}

/// <summary>
/// 通过声音的名字获取对应的声音(SoundBank.GetRandomClip)
/// </summary>
/// <param name="soundName"></param>
/// <returns></returns>
public AudioClip GetSoundFromLibrary(string soundName)
{
if (soundLibraryDict.ContainsKey(soundName))
{
return soundLibraryDict[soundName].GetRandomClip();
}

return null;
}

public void MergeLibraries(SoundLibrary[] libraries)
{
List<SoundBank> newBanks = new List<SoundBank>();

if (soundLibrary != null)
{
newBanks.AddRange(soundLibrary);
}

foreach (SoundLibrary sl in libraries)
{
newBanks.AddRange(sl.soundLibrary);
}

soundLibrary = newBanks.ToArray();

GenerateDictionary();
}

public void RemoveLibrary(SoundLibrary library)
{
List<SoundBank> oldBanks = new List<SoundBank>();

if (soundLibrary != null)
{
oldBanks.AddRange(soundLibrary);
}

foreach (SoundBank bank in library.soundLibrary)
{
foreach (SoundBank oldBank in oldBanks)
{
if (oldBank.name == bank.name)
{
oldBanks.Remove(oldBank);
break;
}
}
}

soundLibrary = oldBanks.ToArray();

GenerateDictionary();
}
}


得益于音频管理着一部分代码所带来的编程思路,对我当前项目的帮助起到了极其重要的作用!

接下来还有:SoundEvent,SoundController,SoundManager三个类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐