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

代码内容不是本人原创的,请原谅我斗胆作为原创发表:


首先是存放声音的脚本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三个类



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值