Unity (游戏音效模块的封装)

前言

你是不还在被游戏的音效组件AudioSoure 播放音乐困扰,为了更加节省资源,更加方便快捷的播放音效,本篇文章将为你解答疑惑。

AudioSoure中有很多的变量
Unity (游戏音效模块的封装)
如果场景中有很多的AudioSoure将会非常消耗资源,我们可以仿照对象池的原理,把声音进行类似的操作。

直结开始教程

首先创建3个脚本(AudioManager,ClipManager,SoureManager)

ClipManager:用来管理Clip片段
AudioManager:用来管理组件AudioSoure
SoureManager:相当于总管理者,提供对外调用
Unity (游戏音效模块的封装)

我们先来编写AudioManager脚本

这个类不需要继承MonoBehaviour
声明三个变量
Unity (游戏音效模块的封装)
然后为物体添加audiosoure,并且将添加的audiosoure用列表存起来
Unity (游戏音效模块的封装)
当我们想要播放声音时,需要获得一个空闲的audiosoure所以我们要写个获得空audiosoure的方法
Unity (游戏音效模块的封装)
当然,如果一直生成产生大量的audiosoure,会降低性能,所以我们还需要一个销毁audiosoure的方法,使我们的性能得到优化

Unity (游戏音效模块的封装)
暂时这个类里面先写这些,一会儿我们还要回到这个类继续完善

ClipManager脚本的编写

这个类也不需要继承MonoBehaviour
播放声音的组件功能已经完善了,这时候却没有声音,所以我们要在这个脚本中对audiosoure里面的clip属性添加一些方法,以便我们能正确地播放声音

声明两个变量
Unity (游戏音效模块的封装)
如果你有很多(成千上百种声音需要播放)我们不能手动的拖拽,这样会大大降低开发成本,这里我使用读取文本地操作来简化开发
一:我们到Assets路径下
Unity (游戏音效模块的封装)
二:创建StreamingAssets文件夹(注意:必须是StreamingAssets文件夹,一个字母也不能差,因为我们要用到Application.streamingAssetsPath方法),关于这个方法要是不理解,可以去看看这个博客https://blog.csdn.net/BillCYJ/article/details/99712313 之后在文件夹内创建文本文件,回到vs中为文本添加音乐的名称和数量(注意:数量可以根据添加的音乐动态改变,这里为了简洁我并没有这样做)
Unity (游戏音效模块的封装)
我们回到ClipManager这个类当中,创建读取文本的方法
把读取的名字添加的我们之前声明的数组变量(musicName)中
这样我们就能快速的知道音乐的名称
Unity (游戏音效模块的封装)
有了这些名称后,我们要把路径下的音乐资源加载到内存中(这里使用Resources.Load<>,和之前的ApplicatiRon.streamingAssetsPath一样,这个方法同样需要创建一个Resources文件夹,然后需要把音乐文件都放在这个文件夹中)
Unity (游戏音效模块的封装)
之后为脚本添加加载代码
同时在构造函数中调用
(SingleClip类一会儿说明)
Unity (游戏音效模块的封装)
看样子一切都已经完成,让我们回到AudioManager脚本
我们创建一个Play()的方法来播放声音(我们要播放声音首先要调用之前的获得空闲的AudioSoure方法,这时虽然有了组件,但是声音却无法的到,这时我们就要继续为我们ClipManager类添加方法,通过名字来找到需要播放的声音)
首先创建一个新的类SingleManger来单独存放声音(audio Clip)
Unity (游戏音效模块的封装)
然后我们回到ClipManager声明变量
Unity (游戏音效模块的封装)
(这时再看看就应该能明白Load方法了)
Unity (游戏音效模块的封装)
回到AudioManager脚本完善Play()
Unity (游戏音效模块的封装)
同理写出Stop()方法
Unity (游戏音效模块的封装)
这样就大功告成了
然我们来到SoureManager脚本中
SoureManager脚本使用单例模式
Unity (游戏音效模块的封装)
最后让我们测试一下
为了方便修改音乐的名称我用了静态类存放
Unity (游戏音效模块的封装)
一下是测试结果
Unity (游戏音效模块的封装)
可以看到运行开始就为物体添加了3个AudioSoure组件
Unity (游戏音效模块的封装)
当我按下asd中的任何键都可以播放声音
当按下的按键次数大于3就会自动创建组件AudioSoure
Unity (游戏音效模块的封装)
当声音播放完毕组件就自动销毁了

相关文章: