C# 音频不能统一播放

C# 音频不能统一播放,c#,unity3d,C#,Unity3d,我试图编写一个脚本,当你击中敌人时,它会播放声音,问题是我无法让它播放声音,因为它看到音频源,但我的脚本不会将剪辑传递给它 以下是我目前拥有的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Audio; public class makeanoise : MonoBehaviour { public AudioClip hurtSou

我试图编写一个脚本,当你击中敌人时,它会播放声音,问题是我无法让它播放声音,因为它看到音频源,但我的脚本不会将剪辑传递给它

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

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

您如何获得音频源来播放声音?因为连我的队友都不知道怎么做

你需要在场景中安装一个AudioListener,还需要检查3D声音设置,最常见的事情是将AudioListener连接到主摄像机上

检查场景中是否有任何内容以及您的设置

我试图编写一个脚本,当你击中敌人时,它会播放 声音

使用碰撞检测+碰撞器而不是更新功能检测碰撞,然后播放音频:

void OnCollisionEnter(Collision collision)
{
    soundSource.Play();
}
如果是2D游戏,请改用
OnCollisionInter2D

我不能让它播放声音,它看到音频源,但我的 脚本不会将剪辑传递给它

有很多原因导致音频不能统一播放。你的声音不会播放而不是,因为你把它放在
更新
函数中。它不是
更新
函数的原因是因为你用
if(!soundSource.isPlaying)
保护它,所以它只会在第一个doe播放时再次播放

音频无法在Unity中播放的原因(从可能到不可能)

1。未分配
音频剪辑

这是你的音频剪辑

public AudioClip hurtSound;
如果未在编辑器中或通过代码分配或初始化
hurtSound
,Unity不会抛出任何错误。它根本不起作用

只需将音频拖动到
hurtSound
插槽中,您就可以听到声音了。有时,音频引用会丢失,因此只需再次重复此步骤即可重新创建引用


2。编辑器处于静音状态。如果编辑器被禁用,则不会发出声音,但构建应该有声音。检查并禁用编辑器上的静音


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

这个错误的例子:

可能的解决方案:

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


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

修复方法是将
音频源
附加到不会破坏的游戏对象上。一个空的游戏对象就可以了

或者,您可以播放音频,等待音频播放完毕,然后将其销毁:

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
的游戏对象被停用,音频也将停止。不要停用
音频源
游戏对象。有关可能的解决方法,请参见#4


6。代码甚至没有执行

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

private void Update()
{

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

如果在控制台选项卡中看不到该日志,则代码不会执行

A.脚本未附加到游戏对象。将其附加到游戏对象:

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

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


7
音频源
已静音或音量为
0


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


9。音频不好。替换为另一个音频

10.Bug。转到“帮助”->“报告错误…”。。用于错误报告的菜单和文件


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

您确定您的声音不会在每一帧上反复播放,因此无法听到实际声音吗?不是每帧更新吗?它甚至没有将剪辑传递到源代码,但我会将其放在if语句中。我认为您在这里有一个设计错误,不是那么简单,但我认为播放声音if hit功能应该是敌人对象的一部分。只是一个建议,也许其他人有更好的想法。@Vulpex它应该是这样工作的。@Charleh是的,我确信它玩得不是很快,我只是再试了一次,它仍然无法使用编辑过的代码。默认情况下,相机有一个音频侦听器。你的游戏对象靠近相机吗?删除播放音频的脚本,留下长音频(如歌曲),并在音频源“唤醒时播放/启用”中设置,然后尝试将相机移动到离游戏对象越近的位置。你应该听。音频源是在2d空间播放的,无论离源有多远,你都会在音频源->空间混合(2d-3D)中听到itCheck的声音,一旦你听到声音,你必须对所有被击中和播放音频的行为进行编码。代码中有一个小的输入错误。那应该是
while(soundSource.isPlaying)
not
while(!soundSource.isPlaying)
不,我只想在它不播放的时候播放它,如果它是if(soundSource.isPlaying),它就不会执行代码,因为当声音源到达必须播放的代码时,它不会播放!soundsoure.isplaying,因为声源不可用playing@TheAmerica
IEnumerator playAudio()
{
    //Play Audio
    soundSource.Play();

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

    //Now, destroy it
    Destroy(gameObject);
}
private void Update()
{

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