UFL6-1——音效管理模块音乐部分实现

实现音效管理模块 音乐 相关内容

  1. 声明MusicManager​,继承 不继承MonoBehaviour的单例模式基类

    1
    2
    3
    4
    5
    6
    7
    /// <summary>
    /// 音乐音效管理器
    /// </summary>
    public class MusicManager : BaseManager<MusicManager>
    {
    private MusicManager() { }
    }
  2. 播放背景音乐

    在场景上添加一个唯一的不可销毁的对象,该对象挂载一个播放背景音乐的音效源,
    音效管理模块需要关联这个音效源,通过这个音效源来控制背景音乐的播放

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //背景音乐播放组件
    private AudioSource bgmSource = null;

    public void PlayBGM(string name)
    {
    //动态创建播放背景音乐的组件,并且不会因为过场景而移除
    //保证背景音乐在过场景时也能播放
    if (bgmSource == null)
    {
    GameObject obj = new GameObject("BGM");
    GameObject.DontDestroyOnLoad(obj);
    bgmSource = obj.AddComponent<AudioSource>();
    }
    //根据传入的背景音乐名字,来播放背景音乐
    ABResManager.Instance.LoadResAsync<AudioClip>("music", name, (clip) =>
    {
    bgmSource.clip = clip;
    bgmSource.loop = true;
    bgmSource.volume = 0.1f; //TODO.. 临时设置
    bgmSource.Play();
    });
    }
  3. 停止背景音乐

    1
    2
    3
    4
    5
    6
    public void StopBGM()
    {
    if (bgmSource == null)
    return;
    bgmSource.Stop();
    }
  4. 暂停背景音乐

    1
    2
    3
    4
    5
    6
    public void PauseBGM()
    {
    if (bgmSource == null)
    return;
    bgmSource.Pause();
    }
  5. 设置背景音乐大小

    不论背景音乐音效源是否存在,都记录这个设置的值到bgmVolume​,当背景音乐正在播放,或者背景音乐开始播放,就使用bgmVolume​调整音量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //背景音乐播放组件
    private AudioSource bgmSource = null;
    //背景音乐大小
    private float bgmVolume = 0.1f;

    private MusicManager() { }

    public void PlayBGM(string name)
    {
    //动态创建播放背景音乐的组件,并且不会因为过场景而移除
    //保证背景音乐在过场景时也能播放
    if (bgmSource == null)
    {
    GameObject obj = new GameObject("BGM");
    GameObject.DontDestroyOnLoad(obj);
    bgmSource = obj.AddComponent<AudioSource>();
    }
    //根据传入的背景音乐名字,来播放背景音乐
    ABResManager.Instance.LoadResAsync<AudioClip>("music", name, (clip) =>
    {
    bgmSource.clip = clip;
    bgmSource.loop = true;
    bgmSource.volume = bgmVolume;
    bgmSource.Play();
    });
    }

    public void ChangeBGMVolume(float value)
    {
    bgmVolume = value;
    if (bgmSource == null)
    return;
    bgmSource.volume = bgmVolume;
    }

使用示例

准备两个音乐,放到Assets/Editor/music​文件夹下,以便于读取和打包

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private float v = 0.1f;
private float oldV = 0.1f;

private void OnGUI()
{
if (GUILayout.Button("播放背景音乐"))
{
MusicManager.Instance.PlayBGM("Begin");
}
if (GUILayout.Button("播放背景音乐2"))
{
MusicManager.Instance.PlayBGM("Fight");
}
if (GUILayout.Button("停止背景音乐"))
{
MusicManager.Instance.StopBGM();
}
if (GUILayout.Button("暂停背景音乐"))
{
MusicManager.Instance.PauseBGM();
}

v = GUILayout.HorizontalSlider(v, 0, 1);
//当值改变时,才执行改变音量方法
if (oldV != v)
{
MusicManager.Instance.ChangeBGMVolume(v);
oldV = v;
}
}

通过点击屏幕上的绘制的按钮和滑动条,监听音乐变化

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 音乐音效管理器
/// </summary>
public class MusicManager : BaseManager<MusicManager>
{
//背景音乐播放组件
private AudioSource bgmSource = null;
//背景音乐大小
private float bgmVolume = 0.1f;

private MusicManager() { }

public void PlayBGM(string name)
{
//动态创建播放背景音乐的组件,并且不会因为过场景而移除
//保证背景音乐在过场景时也能播放
if (bgmSource == null)
{
GameObject obj = new GameObject("BGM");
GameObject.DontDestroyOnLoad(obj);
bgmSource = obj.AddComponent<AudioSource>();
}
//根据传入的背景音乐名字,来播放背景音乐
ABResManager.Instance.LoadResAsync<AudioClip>("music", name, (clip) =>
{
bgmSource.clip = clip;
bgmSource.loop = true;
bgmSource.volume = bgmVolume;
bgmSource.Play();
});
}

public void StopBGM()
{
if (bgmSource == null)
return;
bgmSource.Stop();
}

public void PauseBGM()
{
if (bgmSource == null)
return;
bgmSource.Pause();
}

public void ChangeBGMVolume(float value)
{
bgmVolume = value;
if (bgmSource == null)
return;
bgmSource.volume = bgmVolume;
}
}