Unity (游戏音效模块的封装)
前言
你是不还在被游戏的音效组件AudioSoure 播放音乐困扰,为了更加节省资源,更加方便快捷的播放音效,本篇文章将为你解答疑惑。
AudioSoure中有很多的变量
如果场景中有很多的AudioSoure将会非常消耗资源,我们可以仿照对象池的原理,把声音进行类似的操作。
直结开始教程
首先创建3个脚本(AudioManager,ClipManager,SoureManager)
ClipManager:用来管理Clip片段
AudioManager:用来管理组件AudioSoure
SoureManager:相当于总管理者,提供对外调用
我们先来编写AudioManager脚本
这个类不需要继承MonoBehaviour
声明三个变量
然后为物体添加audiosoure,并且将添加的audiosoure用列表存起来
当我们想要播放声音时,需要获得一个空闲的audiosoure所以我们要写个获得空audiosoure的方法
当然,如果一直生成产生大量的audiosoure,会降低性能,所以我们还需要一个销毁audiosoure的方法,使我们的性能得到优化
暂时这个类里面先写这些,一会儿我们还要回到这个类继续完善
ClipManager脚本的编写
这个类也不需要继承MonoBehaviour
播放声音的组件功能已经完善了,这时候却没有声音,所以我们要在这个脚本中对audiosoure里面的clip属性添加一些方法,以便我们能正确地播放声音
声明两个变量
如果你有很多(成千上百种声音需要播放)我们不能手动的拖拽,这样会大大降低开发成本,这里我使用读取文本地操作来简化开发
一:我们到Assets路径下
二:创建StreamingAssets文件夹(注意:必须是StreamingAssets文件夹,一个字母也不能差,因为我们要用到Application.streamingAssetsPath方法),关于这个方法要是不理解,可以去看看这个博客https://blog.csdn.net/BillCYJ/article/details/99712313 之后在文件夹内创建文本文件,回到vs中为文本添加音乐的名称和数量(注意:数量可以根据添加的音乐动态改变,这里为了简洁我并没有这样做)
我们回到ClipManager这个类当中,创建读取文本的方法
把读取的名字添加的我们之前声明的数组变量(musicName)中
这样我们就能快速的知道音乐的名称
有了这些名称后,我们要把路径下的音乐资源加载到内存中(这里使用Resources.Load<>,和之前的ApplicatiRon.streamingAssetsPath一样,这个方法同样需要创建一个Resources文件夹,然后需要把音乐文件都放在这个文件夹中)
之后为脚本添加加载代码
同时在构造函数中调用
(SingleClip类一会儿说明)
看样子一切都已经完成,让我们回到AudioManager脚本
我们创建一个Play()的方法来播放声音(我们要播放声音首先要调用之前的获得空闲的AudioSoure方法,这时虽然有了组件,但是声音却无法的到,这时我们就要继续为我们ClipManager类添加方法,通过名字来找到需要播放的声音)
首先创建一个新的类SingleManger来单独存放声音(audio Clip)
然后我们回到ClipManager声明变量
(这时再看看就应该能明白Load方法了)
回到AudioManager脚本完善Play()
同理写出Stop()方法
这样就大功告成了
然我们来到SoureManager脚本中
SoureManager脚本使用单例模式
最后让我们测试一下
为了方便修改音乐的名称我用了静态类存放
一下是测试结果
可以看到运行开始就为物体添加了3个AudioSoure组件
当我按下asd中的任何键都可以播放声音
当按下的按键次数大于3就会自动创建组件AudioSoure
当声音播放完毕组件就自动销毁了