在Unity中无法播放音频

13

我正在尝试编写一个脚本,当你攻击敌人时会播放声音,但问题是我无法让它播放声音,虽然它能够找到音频源,但我的脚本却无法将剪辑传递给它。

以下是我目前拥有的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;

public class makeanoise : MonoBehaviour
{
    public AudioClip hurtSound;
    public AudioSource soundSource;

    private void Update()
    {

        if (!soundSource.isPlaying)
        {
            soundSource.clip = hurtSound;
            soundSource.Play();
        }
    }
}

如何让音频源播放声音?因为甚至我的队友都不知道该怎么做。


你确定你的声音不是在每一帧都重复播放,因此实际上听不到任何声音吗?Update不是每一帧都会执行吗? - Charleh
它甚至没有将剪辑传递到源,但我会将其放在if语句中。 - The American Fox
我认为你在这里存在设计错误,虽然不是很熟悉Unity,但我认为“如果被击中则播放声音”的功能应该是敌人对象的一部分。这只是一个建议,也许其他人有更好的想法。 - Vulpex
@Vulpex 它应该像这样工作。 - The American Fox
@Charleh,是的,我确定它没有以非常快的速度进行播放,我刚刚再次尝试了一下,用编辑后的代码仍然无法工作。 - The American Fox
音频无法播放的原因有很多。我已经按照可能性顺序列出了大部分原因,以便您和未来遇到此类问题的人能够逐一检查。请确保按顺序检查它们。 - Programmer
7个回答

23
我正在尝试编写一个脚本,当你攻击敌人时会播放声音。
使用碰撞检测+碰撞器来检测碰撞,而不是使用Update函数,然后播放音频。
void OnCollisionEnter(Collision collision)
{
    soundSource.Play();
}

如果是2D游戏,请使用OnCollisionEnter2D

我无法让它播放声音,虽然它看到了音频源,但我的脚本不会将剪辑传递给它。

在Unity中,音频无法播放的原因有很多。您的声音不会播放不是因为您将其放在Update函数中。它之所以不是Update函数(正如一些人提到的那样),是因为您用if (!soundSource.isPlaying)保护它,因此只有在第一个播放完成后才会再次播放。

Unity中音频无法播放的原因:(从可能性高到低)

1.未分配AudioClip

这是您的AudioClip

public AudioClip hurtSound;

如果在编辑器或代码中未分配或初始化hurtSound,Unity不会抛出任何错误,只是不会播放声音。只需将音频拖到hurtSound插槽中,您就应该能听到声音。有时,音频引用会丢失,因此只需再次重复此步骤即可重新创建引用。

enter image description here


2.编辑器静音。如果编辑器被静音,它将不会有任何声音输出,但是构建应该有声音。检查并关闭编辑器的静音。

enter image description here


3.每帧播放声音。这个错误很常见,它导致AudioSource没有时间重复播放音频。

这个错误的例子:

private void Update()
{
    soundSource.Play();
}

可能的解决方案:

在播放音频之前先检查它是否正在播放。(在这个问题的代码中已经这样做了,是正确的!)

private void Update()
{

    if (!soundSource.isPlaying)
    {
        soundSource.Play();
    }
}

4. AudioSource所附加的GameObject已被销毁。 这种情况很常见。如果AudioSource所附加的GameObject被销毁,音频将无法播放。

解决方法是将AudioSource附加到不会被销毁的GameObject上。一个空GameObject就可以。

或者你可以播放音频,等待它播放完毕,然后再销毁它:

IEnumerator playAudio()
{
    //Play Audio
    soundSource.Play();

    //Wait until it's done playing
    while (soundSource.isPlaying)
        yield return null;

    //Now, destroy it
    Destroy(gameObject);
}

5. AudioSource所附加的游戏对象已被停用。

如果拥有AudioSource的游戏对象被停用,音频也会停止。不要停用AudioSource游戏对象。请参见#4以获取可能的解决方法。

enter image description here


6.代码甚至没有执行。

您必须确保Play代码正在执行。简单的Debug.Log函数调用足以确定这一点。

private void Update()
{

    if (!soundSource.isPlaying)
    {
        soundSource.clip = hurtSound;
        soundSource.Play();
        Debug.Log("Played");
    }
}

enter image description here

如果您在“控制台”选项卡中看不到该日志,则代码未执行。
A.脚本未附加到GameObject上。请将其附加到一个GameObject上:

enter image description here

B.脚本所附加的游戏对象未激活。请从编辑器中激活它:

enter image description here

C.脚本未启用。请启用它:

enter image description here


7. AudioSource 已静音或音量为 0

enter image description here


8. {{AudioListener}}组件不存在。这很不可能,因为它会自动附加到您的相机上。检查是否被错误删除,然后重新将其附加到相机上。它必须附加到相机而不是任何其他对象。

enter image description here


9.音频质量差。更换另一个音频。

10.Bug(程序漏洞)。前往“帮助” ---> “报告漏洞”菜单并提交漏洞报告。

如果上述所有方法都失败了,可以尝试以下操作。这很少见,但可能会在进行大型操作系统更新时发生。


你的代码中有一个小错别字。应该是 while (soundSource.isPlaying) 而不是 while (!soundSource.isPlaying) - PassetCronUs
@TheAmericanFox 这是回复我吗?你有检查过我的回答里面的内容吗? - Programmer
这真的帮助我找出了问题。我的me是2,但我必须改为GAME VIEW而不是SCENE VIEW...如果没有这些很棒的评论,我可能看不到它;]哦,在主例程之前---> using UnityEngine.Audio - Rich Engle
我还有一个不幸要补充。重新启动你的电脑。仅仅重启Unity是不够的。即使是构建也没有声音,直到我重新启动了电脑。 - Dirigible
哇,我有一个AudioSource,在调试器中可以看到并逐步执行将音量设置为0.75f并调用播放的代码... 它也有一个有效的剪辑,但仍然显示音量= 1f且isPlaying=false... Unity 2021.3.12f1... 这里可能有问题。 - Aaron Carter
显示剩余2条评论

1
你需要在场景中添加一个AudioListener,并检查3D声音设置,通常情况下将AudioListener附加到主摄像机上。
检查场景中是否有任何AudioListener以及AudioSource的设置。

你的游戏对象是否靠近相机?移除播放音频的脚本,留下一首长歌曲,并在音频源中设置“Play on Awake/Enable”,尝试将相机尽可能地靠近游戏对象。你应该能听到它。 - Chopi
音频源正在2D空间中播放,无论您离源有多远,仍然可以听到它。 - The American Fox
检查音频源 -> 空间混合(2D-3D) - Chopi
一旦你听到声音,你就需要编写所有被击中的行为和播放音频的代码。 - Chopi
我在一个2D游戏中遇到了声音问题,我们通过检查audiosource设置来解决了它,但我不记得我们如何配置所有组件了。 - Chopi
显示剩余3条评论

0
我通过在主摄像机的位置播放 AudioSource.clip 来解决了这个问题。传入一个 Vector3,其中 xyz 都等于 0,可以播放声音,但声音会更小。我从未让 AudioSource.Play() 正常工作过。
AudioSource.PlayClipAtPoint(audioSource.clip, mainCamera.transform.position);

0

只是为了帮助其他人,像ash提到的那样,音高设置实际上可能会导致一些奇怪的错误,我的音频源的音高设置为-1,因为我有一个机制,通过连续点击事物来增加sfx音高。在点上使用AudioSource.PlayClip允许声音播放,但然后我删除了AudioSource.PlayClipAtPoint以使用缓存的AudioSource,确保当我想要播放GameOver声音时,音高初始化为1f,所有都按预期工作。


0

@Programmer提供的清单帮助我排除了其他可能性,并找到另一个需要考虑的潜在问题...

如果您的音频在Unity编辑器中正常工作,但在构建中不起作用,则可能是因为您正在使用OnValidate()将对AudioSource组件的引用存储在private字段中。具体来说,Unity不会序列化私有字段中的值,除非明确指示

如何确认/修复:

  1. 启用“开发构建”,以便构建报告问题
  2. 当您尝试播放或以其他方式访问AudioSource时,构建日志显示NullReferenceException:Object reference not set to an instance of an object
  3. 添加[SerializeField]以确保序列化引用的任何私有变量都使用OnValidate()进行设置:
[SerializeField] private AudioSource audioSource;
void OnValidate()
{
    audioSource = GetComponent<AudioSource>();
}

build settings


0

还有一件事情可能会导致这种情况,那就是音高设置 - 我的设置为0 - 在混音器中可以看到音频正在播放 - 但听不到声音 - 将音高调整回1后,一切都正常了。


0
降落在这个老问题上,因为我遇到了同样的问题,但是这里的解决方案没有解决——我怀疑我的问题可能太明显了,以至于没有被包含在迄今为止给出的答案中,但有时候并不存在所谓的太明显的事情...
有一个全局项目音频级别,它被设置为0(我猜测我不经意间自己改变了它,因为这似乎是一个奇怪的默认值)。在2021.3版本中,可以通过编辑>项目设置>音频来进行更改,并且在顶部有一个全局音量设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接