在Unity中发声。 背景音乐。
Tulenber ⸱
3 July, 2020 ⸱
Intermediate ⸱
3 min ⸱
2019.4.1f1 ⸱
在某些时候,每个游戏开发人员都认为,为什么这么安静?
如果您的游戏不是围绕Osu!,Guitar Hero或Hotline Miami之类的声音构建的,那么您可能会发现自己已经准备就绪,几乎可以理解游戏的状况,然后您便可以理解:“出了点问题。”经过几分钟的思考,结果发现里面没有声音^_^许多人很少考虑游戏中如此重要的部分,因此可以在最后一刻回忆起它就不足为奇了。因此,让我们谈谈声音。
Unity中的声音
Unity的音频资产称为AudioClip
,其回放围绕两个组件AudioListener
和AudioSource
进行。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开始跟踪,停止和重新启动,随机化的功能。尽管每个这样的请求并不复杂,但这超出了本文的范围,因此让我们将其留待将来使用。 下次见!^_^
如果您喜欢这篇文章,可以为它提供支持