C# Unity AudioSource无法播放剪辑

C# Unity AudioSource无法播放剪辑,c#,audio,unity3d,C#,Audio,Unity3d,我试图在用户拖动2D游戏对象时播放声音 游戏对象必须播放很多声音,所以我通过编程创建音频源,并通过inspector分配剪辑 public class Card: Monobehavior, IDraggable { public AudioClip tokenGrabClip; public AudioClip tokenReleaseClip; public AudioSource tokenGrab; public AudioSource tokenRel

我试图在用户拖动2D游戏对象时播放声音

游戏对象必须播放很多声音,所以我通过编程创建音频源,并通过inspector分配剪辑

public class Card: Monobehavior, IDraggable {
    public AudioClip tokenGrabClip;
    public AudioClip tokenReleaseClip;

    public AudioSource tokenGrab;
    public AudioSource tokenRelease;

    public AudioSource TokenGrab {
      get{ return tokenGrab; }
    }


    public virtual void Start() {
      tokenGrab = AddAudio (tokenGrabClip, false, false, 1f);
      tokenRelease = AddAudio (tokenReleaseClip, false, false, 1f);
   }

    public virtual AudioSource AddAudio(AudioClip clip, bool isLoop, bool isPlayAwake, float vol) {
    AudioSource newAudio = gameObject.AddComponent<AudioSource>();
    newAudio.clip = clip;
    newAudio.loop = isLoop;
    newAudio.playOnAwake = isPlayAwake;
    newAudio.volume = vol;
    return newAudio;
  }
}
没有声音播放,但我可以通过“检查拖动开始消息”看到我的控制台

知道我做错了什么吗?我可以在第一个代码块中看到使用我的方法分配给我的游戏对象的音频源,但我的音频剪辑没有分配给它们…

这不可能是go GameObject,
GetComponent()
TokenGrab
null
。如果其中任何一个为空,您将得到
NullException
错误。我排除这些可能性

看看你的代码,这些可能是你的音频不能播放的原因。从很可能到最少订购

1。您的
音频剪辑未从编辑器中分配

public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;
检查编辑器是否为这两个变量赋值

public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;
必须对场景中附加到任何游戏对象的每个
脚本执行此操作

如果未分配或为空,则不会出现任何错误。它根本不起作用


2。调用
Play()
后,您的
脚本及其所连接的游戏对象将被销毁。试着在你有这个功能的任何地方发表评论。再试一次。如果问题解决了,你必须通过将音频源移动到一个不需要销毁的空游戏对象来解决这个问题。

我只是在这里提出我的建议。我知道你不想循环剪辑。那你为什么不试试这样的

public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;

AudioSource      audioSrc;

void Start () {

    audioSrc = GetComponent<AudioSource> ();
}

public void PlayTokenGrabClip () {

    audioSrc.PlayOneShot (tokenGrabClip);
}

public void PlayTokenReleaseClip () {

    audioSrc.PlayOneShot (tokenReleaseClip);
}
公共音频剪辑;
公共音频剪辑tokenReleaseClip;
声源audioSrc;
无效开始(){
audioSrc=GetComponent();
}
公共无效播放片段(){
audioSrc.PlayOneShot(tokenGrabClip);
}
公共作废PlayTokenReleaseClip(){
audioSrc.PlayOneShot(tokenReleaseClip);
}

音频源
组件添加到您的
游戏对象
。通过编辑器将音频文件(
mp3
wav
)分配给
tokenGranClip
tokenReleaseClip
)。然后调用函数
PlayTokenGrabClip()
PlayTokenReleaseClip()
,在需要时播放相应的声音。

问题源于未更新预设。我曾公开在我的C#脚本中分配音频剪辑,然而,这种变化并没有立即反映在我的预设中。我不必更新许多预置,而是重新组织了资源在启动时的加载方式:

我使用
资源定义音频剪辑。加载(…)作为音频剪辑Awake()
中编写>并在
Start()
中创建音频源组件。由此,我可以通过C#将音频剪辑添加到我的音频源中

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类卡:Monobhavior,IDraggable{
公共图书馆柜台;
私人音频剪辑;
私人音频剪辑tokenReleaseClip;
私人音频源令牌抓取;
私人音频源令牌释放;
公共音频源令牌抓取{
获取{return tokenGrab;}
}
公共音频源令牌释放{
获取{return tokenRelease;}
}
公共虚拟void Start(){
tokenGrab=AddAudio(tokenGrabClip,false,false,0.5f);
tokenRelease=AddAudio(tokenReleaseClip,false,false,0.5f);
}
公共虚拟空唤醒(){
tokenGrabClip=Resources.Load(“音频/tokenGrab”)作为音频剪辑;
tokenReleaseClip=Resources.Load(“音频/令牌释放”)作为音频剪辑;
}
公共虚拟音频源AddAudio(音频剪辑剪辑、bool isLoop、bool isPlayAwake、float vol){
AudioSource newAudio=gameObject.AddComponent()作为AudioSource;
newAudio.clip=剪辑;
newAudio.loop=isLoop;
newAudio.playOnAwake=isPlayAwake;
newAudio.volume=vol;
返回新音频;
}
}

我建议将检查器置于调试模式(显示更多值),然后在调用
TokenGrab.Play()后立即调用
debug.Break()
。这将在该帧结束时暂停编辑器,以便您可以检查音频源并确认所有字段都符合预期。这可能是因为它正在“播放”,但听不见,这是一组完全不同的问题需要解决。@rutter在仔细研究并对我的代码进行第二次查看后,我们发现我们根本没有更新我们的卡预制件…解决方案是在唤醒中加载音频剪辑,然后启动音频源,这样所有声音都可以应用到每个预制卡上。谢谢你提醒我Debug.Break(),我完全忘记了。这个答案是我的#1解决方案中描述的问题。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Card : MonoBehaviour, IDraggable {



    public bool counter;

    private AudioClip tokenGrabClip;
    private AudioClip tokenReleaseClip;

    private AudioSource tokenGrab;
    private AudioSource tokenRelease;

    public AudioSource TokenGrab {
        get{ return tokenGrab; }
    }
    public AudioSource TokenRelease {
        get{ return tokenRelease; }
    }


    public virtual void Start() {
        tokenGrab = AddAudio (tokenGrabClip, false, false, 0.5f);
        tokenRelease = AddAudio (tokenReleaseClip, false, false, 0.5f);
    }

    public virtual void Awake () {
        tokenGrabClip = Resources.Load ("Audio/tokenGrab") as AudioClip;
        tokenReleaseClip = Resources.Load ("Audio/tokenRelease") as AudioClip;
    }


    public virtual AudioSource AddAudio(AudioClip clip, bool isLoop, bool isPlayAwake, float vol) {
        AudioSource newAudio = gameObject.AddComponent<AudioSource> () as AudioSource;
        newAudio.clip = clip;
        newAudio.loop = isLoop;
        newAudio.playOnAwake = isPlayAwake;
        newAudio.volume = vol;
        return newAudio;
    }
}