如何在Unity中播放音效
目标:学习如何在 Unity 中播放音效。
所以我们想确保我们可以在视频游戏中播放我们想要的声音,但是我们如何才能实现这样的壮举呢?
首先,让我们了解它是如何工作的。如果你想让一个游戏对象发出声音,它需要音频源Audio Source组件。每个音频源都有一个音频剪辑Audio Clip,它作为参考保存,并且可以在任何给定时间播放。
我们的背景游戏对象,当前循环播放我们的背景剪辑。
上面的示例向我们展示了 Play On Awake 和 Loop 的工作原理。第一个,一旦对象出现在我们的游戏中,音频剪辑就会播放。另一个,顾名思义,循环音频剪辑,一遍又一遍地播放。这两种方法在背景音乐的情况下都非常有用,背景音乐从一开始就开始播放并循环播放。
将背景剪辑clip添加到我们的对象中。
Play On Awake 的另一个例子可以在我们的爆炸中看到。当我们摧毁小行星时,我们会实例化爆炸,爆炸创建时会播放自己的声音。
我们的爆炸预制件有自己的音频剪辑,并设置了“唤醒播放”,一旦出现在屏幕上即可播放。
与我们的背景音乐不同,这首音乐没有设置为循环播放,因为我们只想听到物体爆炸的声音,而不是在爆炸结束后重新启动爆炸声。我们还有爆炸预制件,可以在动画完成后自行摧毁。
private void Start()
{
Destroy(gameObject, 2.4f);
}
但是,如果在特定情况下而不是在对象出现时播放剪辑呢?嗯,Unity确实有这样的功能,而且很容易实现。这是为我们的激光器完成的。当玩家发射激光时,我们会为其播放声音,但仅在其发射时播放,以前从未播放过。
我们只需确保将剪辑clip附加到检查器中,并抓住播放器的音频源Audio Source组件的句柄。
将我们的音频源添加到播放器,并将激光声音剪辑添加到其中。
[SerializeField] private AudioClip _laserSoundClip;
private AudioSource _audioSource;
private void Start()
{
_audioSource = GetComponent<AudioSource>();
if (_audioSource == null)
Debug.LogError("Audio Source is NULL on the Player");
else
_audioSource.clip = _laserSoundClip;
}
private void FireLaser()
{
_canFire = Time.time + _fireDelay;
if (_isTripleShotOn)
{
Instantiate(_tripleShotPrefab, transform.position, Quaternion.identity);
}
else
{
Vector3 laserOffset = new(transform.position.x, transform.position.y + 1.05f, 0);
Instantiate(_laserPrefab, laserOffset, Quaternion.identity);
}
_audioSource.Play();
}
正如我们所看到的,当我们发射激光时,我们只需确保调用我们的音频源,以播放其附加的剪辑。
这将使玩家在射击激光时发出激光的声音。
但我们的 Powerups 无法做到这一点。当收集我们的能量时,如果我们尝试类似的方法,遗憾的是我们没有得到我们想要的结果。这是为什么 ?
嗯,对于我们的 Powerups,与其他对象不同,我们在收集它们后立即销毁它们,因此它们不能成为自己的音频源,因为它们在开始播放时会立即被删除。
同样,Unity 中的另一个强大功能是能够 PlayClipAtPoint。这允许我们实例化一个音频源,并在剪辑完成播放后处理它。
[SerializeField] private AudioClip _powerUpClip;
private void ActivatePowerUp(Player player)
{
AudioSource.PlayClipAtPoint(_powerUpClip, transform.position);
switch (_type)
{
case PowerUpType.TripleShot:
player.ActivateTripleShotPowerUp(_duration);
break;
case PowerUpType.Speed:
player.ActivateSpeedPowerUp(_duration);
break;
case PowerUpType.Shield:
player.ActivateShieldPowerUp();
break;
default:
break;
}
}