c# - 未在 Unity 中播放的音频

标签 c# unity3d

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

这是我目前拥有的代码:

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

你如何让音频源播放声音?因为连我的队友都不知道这样做

最佳答案

I am trying to program a script that when you hit an enemy it plays a sound



使用碰撞检测 + collider 而不是 Update 函数来检测命中然后播放音频:
void OnCollisionEnter(Collision collision)
{
    soundSource.Play();
}

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

I can't get it to play the sound it sees the audio source but my script won't pass the clip to it.



音频无法在 Unity 中播放的原因有很多。你的声音不会播放 而不是 因为你把它放在 Update 函数中。它不是像某些提到的 Update 函数的原因是因为你用 if (!soundSource.isPlaying) 保护它,所以它只会在第一个播放时再次播放。

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

1 . AudioClip 未分配。

这是您的音频剪辑
public AudioClip hurtSound;

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

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

enter image description here

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

enter image description here

3 .每帧播放声音。这个错误并不少见,它导致 AudioSource 没有时间一遍又一遍地播放音频。

此错误的示例:
private void Update()
{
    soundSource.Play();
}

可能的修复:

在播放之前先检查音频是否正在播放。(在这个问题的代码中这样做是正确的!)
private void Update()
{

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

4 . AudioSource 附加的游戏对象已被销毁。
这也很常见。如果 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 的 GameObject 被停用,音频也会停止。不要停用 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

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

A.Script 不附加到游戏对象。将它附加到一个游戏对象:

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。转到帮助 ---> 报告错误.. 菜单和文件以获取错误报告。

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

关于c# - 未在 Unity 中播放的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451295/

相关文章:

c# - 在 C# 中创建实例时重写抽象方法

javascript - 在 IE 浏览器中运行我的 MVC Web 应用程序时遇到数据表错误

c# - 从平面边缘 Unity 画线

c# - 生成1到3之间的随机数/包括1位小数

c# - 离线登录 Unity 3D 和 PHP Laravel

image - Unity UI以编程方式添加图像

c# - TypeScript 通过 ref 参数传递

c# - 菜单项和经典主题中的 WPF 复选框

unity3d - 如何使用 Unity 创建真实世界的 map ?

c# - Unity3D 中是否有一种方法可以检测游戏对象位于邮筒顶部以避免渲染它