unity3d Unity中未播放音频

ffx8fchx  于 2023-03-19  发布在  其他
关注(0)|答案(6)|浏览(251)

我正试图编写一个脚本,当你击中敌人时,它会播放声音,问题是我不能让它播放声音,它看到音频源,但我的脚本不会将剪辑传递给它。
下面是我目前拥有的代码:

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();
        }
    }
}

你怎么让音频源播放声音?因为连我的队友都不知道要这么做

l2osamch

l2osamch1#

我正在编写一个脚本当你击中敌人时会发出声音
使用碰撞检测+碰撞器而不是更新功能来检测命中,然后播放音频:

void OnCollisionEnter(Collision collision)
{
    soundSource.Play();
}

如果是2D游戏,则使用OnCollisionEnter2D
我无法让它播放声音,它看到音频源,但我的脚本不会将剪辑传递给它。
音频不能在Unity中播放的原因有很多。你的声音不能播放不是因为你把它放在Update函数中。它不是Update函数的原因是因为你用if (!soundSource.isPlaying)保护了它,所以只有当第一个正在播放时它才会再次播放。

无法在Unity中播放音频的原因:(从可能到不可能)
1AudioClip未分配。

这是您的音频剪辑

public AudioClip hurtSound;

如果hurtSound没有在编辑器中或通过代码赋值或初始化,Unity不会抛出任何错误,它只是不播放。
只需将音频拖到您的hurtSound插槽中,您应该可以听到声音。有时,音频参考丢失,所以只需再次重复此步骤以重新创建参考。

2.编辑器被静音。如果编辑器被静音,它将不会发出任何声音,但构建应该有声音。检查并禁用编辑器上的静音。

3.每帧播放一次声音。这种错误并不少见,它会导致AudioSource没有时间反复播放音频。

  • 此错误的示例 *:
private void Update()
{
    soundSource.Play();
}
  • 可能的修复 *:

播放前先检查音频是否正在播放。(在此问题的代码中执行了此操作,正确!)

private void Update()
{

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

4. AudioSource所连接的游戏对象已被破坏。这也是常见的。如果AudioSource所连接的游戏对象已被破坏,音频将无法播放。

修正是将AudioSource附加到不破坏的游戏对象上。一个空的游戏对象是可以的。
或者,您可以播放音频,等待它播放完毕,然后销毁它:

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

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

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

5AudioSource所连接的游戏对象已停用。

如果具有Audiosource的游戏对象被停用,音频也会停止。不要停用AudioSource游戏对象。有关可能的解决方法,请参阅**#4**。

6。代码甚至没有执行。

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

private void Update()
{

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

如果在Console选项卡中看不到该日志,则代码没有执行。

  • A.脚本没有附加到游戏对象。将其附加到游戏对象:*

  • B.脚本连接的游戏对象未激活。请从编辑器激活它:*

  • C.脚本未启用,启用:*

7AudioSource已静音或音量为0

8AudioListener组件不存在。这是非常不可能的,因为它是自动连接到您的相机。检查它是否被错误地删除,然后重新连接到相机。它必须连接到相机,而不是任何其他对象。

9.音频错误。请替换为其他音频。
10. Bug。转到 * 帮助 * ---〉* 报告错误.. * 菜单,然后提交错误报告。

这就是如果上面的一切都失败了该怎么做。这不太可能是问题所在,但在操作系统大更新时可能会发生。

bgibtngc

bgibtngc2#

你需要在场景中有一个AudioListener,并且还要检查3D声音设置,最常见的事情是将AudioListener连接到主摄像机。
检查场景中是否存在AudioListener以及AudioSource的设置

x759pob2

x759pob23#

还有一件事,可以导致它的音高设置-我有我的0 -我可以看到音频播放在混音器-但没有声音会听到-移动音高回到1 -一切工作良好。

nom7f22z

nom7f22z4#

只是为了帮助其他人,像ash a提到的音高设置实际上可以导致一些奇怪的错误,我的音频源的音高被设置为-1,因为我有一个机械,点增加sfx音高通过点击东西连续。使用AudioSource.PlayClip在点允许声音播放,但我然后删除AudioSource.PlayClipAtPoint使用缓存的AudioSource,确保球场初始化在1F时,我想游戏的声音发挥和所有工作的预期。

puruo6ea

puruo6ea5#

我通过在主摄像头的位置播放AudioSource.clip来解决这个问题,传入一个xyz都等于0Vector3来播放声音,但声音更安静,我从来没有让AudioSource.Play()工作。

AudioSource.PlayClipAtPoint(audioSource.clip, mainCamera.transform.position);
s71maibg

s71maibg6#

@Programmer提供的检查表帮助我排除了其他可能性,找到了另一个需要考虑的潜在问题...
如果您的音频在Unity编辑器中工作正常,但在构建版本中却不能正常工作,则可能是您使用OnValidate()将对AudioSource组件的引用存储在private字段中。
如何确认/修复:
1.启用“开发版本”,以便版本报告问题
1.当您尝试播放或以其他方式访问AudioSource时,构建日志显示NullReferenceException: Object reference not set to an instance of an object
1.使用OnValidate()[SerializeField]添加到任何私有变量集,以确保引用被序列化:

[SerializeField] private AudioSource audioSource;
void OnValidate()
{
    audioSource = GetComponent<AudioSource>();
}

相关问题