Unity声音管理系统

1)笔记

1)单例类的修改: void Awake-->public virtual void Awake
  (1)因为UnitySingleton继承自MonoBehaviour;
  (2)很有可能我们的用户使用这个Awake,一旦用户重载了Awake这个函数,
     那么就调不到基类的Awake;

2)声音模块的需求分析:
  (1)背景音乐
    播放 背景音乐
    暂停 背景音乐
    关闭 背景音乐
  (2)音效
    播放 音效
    暂停 音效
    关闭 音效

3)进入一个新的场景,要播放一个背景音乐;
  游戏打斗,播放一个音效;
  关闭背景音乐,不再听得到,设置静音;
  关闭音效,不要音效;

4)audio_manager

5)继承自UnitySingleton:
  (1)要借助AudioSource组件来播放声音
  (2)切换场景的时候,节点不能销毁

6)实现:
  (1)背景音乐:单独一个AudioSource组件;
  (2)音效: 需要支持同时播放,一边跑、一边叫、有打斗很多声音, 最大支持10个音效;
     音效队列;
  (3)Awake的时候,往节点上添加AudioSource组件, 先调用基类的 base.Awake(),
    this.music = this.gameObject.AddComponent();
    10个音效的AudioSource添加;

7)_instance = (T)obj.AddComponent(typeof(T)); 不赋值试试?
  _instance指向的是 typeof T这个类型的组件,而不是obj的节点;

  this.gameObject等价于GameObject obj;

  不需要把这个强制挂到一个节点上;

8)背景音乐的使用:
  (1)AudioClip 是一个音乐片段,一个音乐mp3文件挂载上去;

9)队列的方式,一个个找当前谁在用;
  一直拿,音效很长,连续拿11个,会不会拿到null?
  不会! Play是非阻塞的,不可能是阻塞的,不然等到播完才渲染,那不卡死!
  取出一个后,立马是放到队列尾巴了,因此下一次取得是第二个,这样循环播放;

 

你可能感兴趣的:(Unity声音管理系统)