思考并回答以下问题:
- 为什么要封装Audio模块?
- 为什么同类型的东西多了,就需要一个管理器?
- 能不继承MonoBehavior就不继承MonoBehavior?
- 为什么用类来存AudioClip?
Audio
播放音效需要两个条件:
- 1、AudioListener:有且只有一个。
- 2、AudioSource:需要AudioClip,AudioClip可替换,即一个AudioSource可以对应多个AudioClip。
AudioSource组件非常复杂,有很多变量,占用很大空间,还继承MonoBehavior。所以AudioSource能减少一个就减少一个。
**音效分类**- 1、前景音乐。可以同时播放多个前景音乐。
- 2、背景音乐。只能播放一个背景音乐。
1、维持一个AudioSource的队列,需要播放音效就从队列里拿一个空闲的AudioSource出来去播放AudioClip。重复利用AudioSource,使用有限的AudioSource去播放无限的Audio Clip。
2、不是一个对象需要播放音乐了就在那个对象上添加一个AudioSource组件,那这个对象就永远有这个组件了,导致内存浪费。
3、利用外观模式去管理这两个类。从AudioSource中拿一个,从AudioClip中拿一个,两个一结合,就可以播放了。
AudioSource需要的功能:
- 1、能够拿出一个空闲的AudioSource,重复利用AudioSource(对象池);
- 2、无限扩展,如果队列里都忙着,可以添加AudioSource;
- 3、释放多余的。
- 4、播放一个音效。
- 5、停止播放。
AudioClip:
- 1、应该有一个管理类;
- 2、通过配置文件读取名字加载到内存;
- 3、通过名字能查找到对应的clip片段。
实现
SourceManager
维护一个List来管理AudioSource。
SourceManager.cs
1 | using System.Collections.Generic; |
ClipManager
管理Clip。
AudioConfig.txt 配置文件,一般也是Excel变成txt
1 | 3 |
ClipManager.cs
1 | using System.Collections; |
SingleClip
用对象把AudioClip存起来。
SingleClip.cs
1 | public class SingleClip |
AudioManager
外观类,对外的接口。
AudioManager.cs
1 | using System.Collections; |
使用
UseAudio.cs
1 | using System.Collections; |