在Unity中发声。 背景音乐。

Tulenber 3 July, 2020 ⸱ Intermediate ⸱ 3 min ⸱ 2019.4.1f1 ⸱

在某些时候,每个游戏开发人员都认为,为什么这么安静?

如果您的游戏不是围绕Osu!,Guitar HeroHotline Miami之类的声音构建的,那么您可能会发现自己已经准备就绪,几乎可以理解游戏的状况,然后您便可以理解:“出了点问题。”经过几分钟的思考,结果发现里面没有声音^_^许多人很少考虑游戏中如此重要的部分,因此可以在最后一刻回忆起它就不足为奇了。因此,让我们谈谈声音。

Unity中的声音

Unity的音频资产称为AudioClip,其回放围绕两个组件AudioListenerAudioSource进行。AudioListener是一个行为类似于麦克风的组件。它会拾取场景中的所有声音,然后通过扬声器播放它们。 AudioSource-负责在现场播放声音。

因此,为了使游戏具有声音,您需要将AudioListener组件添加到场景中的某个对象,通常,摄影机成为这样的对象。应当注意,您不能添加多个侦听器。另外,您需要为所有声音再现对象添加AudioSource组件。

您可以将带有声音的作品分为三组:

  • 背景音乐-我们将在本文中介绍
  • UI声音-一种可接受的方法是将AudioSource组件添加到必要的UI元素,并将声音播放绑定到其UI事件
  • 场景中的声音-该组比UI元素复杂,因为它需要用于向动态对象添加声音的附加机制。可能的声音的整个范围可能很大,因此提前列出它们是很成问题的。与该小组合作需要单独的机制和单独的文章 ^_^

目标

添加播放背景音乐的机制。几首曲目应该一个接一个地播放,并可能在它们之间增加延迟。提供使声音静音的可能性(例如,播放广告)。

实作

我们将使用单例作为音乐处理程序的基础。您可以在上一篇文章中阅读有关单例的更多信息。

要使声音静音,我们使用一个变量来跟踪静音和返回声音的事件计数。

 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KhtMusicManager : KhtSingleton<KhtMusicManager>
{
    // 音轨之间的延迟
    public int newTrackDelay = 0;
    // 曲目清单
    public List<AudioClip> musicAudioClips = new List<AudioClip>();

    // 播放音乐的来源
    private AudioSource _musicAudioSource = null;

    // 用于静音
    private int _muted = 0;

    protected override void Awake()
    {
        // 设置单例
        base.Awake();
        DontDestroyOnLoad(gameObject);

        // 添加组件以播放音乐
        _musicAudioSource = gameObject.AddComponent<AudioSource>();
    }
    
    // 在第一帧更新之前调用开始
    void Start()
    {
        // 开始播放音乐
        StartCoroutine(PlayBackgroudMusic());
    }

    // 使音乐静音
    public static void Mute()
    {
        // 检查单例
        if (ReferenceEquals(Instance, null))
        {
            return;
        }

        // 如果声音没有静音
        if (Instance._muted == 0)
        {
            Instance._musicAudioSource.mute = true;
        }
        Instance._muted++;
    }

    // 打开声音
    public static void TurnOn()
    {
        // 检查单例并跳过负计数器
        if (ReferenceEquals(Instance, null) || Instance._muted == 0)
        {
            return;
        }

        // 打开声音
        Instance._muted--;
        if (Instance._muted == 0)
        {
            Instance._musicAudioSource.mute = false;
        }
        
    }

    // 开始下一首
    IEnumerator PlayBackgroudMusic()
    {
        // 当前曲目索引
        int musicIndex = 0;
        // 播放音乐(如果存在)
        while (musicAudioClips.Count > 0)
        {
            // 开始下一首曲目的时间+延迟
            float waitTime = musicAudioClips[musicIndex].length + newTrackDelay;
            // 播放一次旋律
            _musicAudioSource.PlayOneShot(musicAudioClips[musicIndex]);

            // 使用当前曲目索引
            musicIndex++;
            if (musicIndex >= musicAudioClips.Count)
            {
                musicIndex = 0;
            }

            // 延迟启用下一首曲目
            yield return new WaitForSeconds(waitTime);
        }
    }
}

结论

给定的实现展示了Unity中实现声音较低的入门级。该系统在基本级别上非常简单。但是,如有必要,您可以使用更高级的组件来混合声音和应用效果(例如,进入隧道时更改汽车发动机的声音)。第三方库的使用也是一种常见的解决方案。回到我们的实现,我们可以突出显示我们要添加的功能:通过id开始跟踪,停止和重新启动,随机化的功能。尽管每个这样的请求并不复杂,但这超出了本文的范围,因此让我们将其留待将来使用。 下次见!^_^


如果您喜欢这篇文章,可以为它提供支持



Privacy policyCookie policyTerms of service
Tulenber 2020