首页 > 解决方案 > Unity-游戏收藏品不播放音效

问题描述

我在收藏品上设置了一个脚本,如果当前对象由标记为“播放器”的对象触发,它应该播放声音,更新分数并自行销毁。现在,更新乐谱和销毁对象可以正常工作,但不会播放声音。我不太清楚为什么。这是代码:

    [SerializeField] private float cherries=0;
    [SerializeField] private Text score;
    [SerializeField] private AudioSource ad;
    

    private void Start() {
    }
    

    private void OnTriggerEnter2D(Collider2D collision) {
        if(collision.tag=="Player" ){
            ad.Play();
            cherries+=1;
            score.text=cherries.ToString();
            Destroy(this.gameObject);
        }

标签: unity3d

解决方案


如果您要在正在收集的对象上使用音频源,您需要确保它存在足够长的时间来播放剪辑。

    ad.Play();
     // Use delayed Destroy overload to give it time to play before the object is destroyed
    Destroy(gameObject, 1f);

但是,我建议使用 PlayOneShot(AudioClip) 将您的音频集中在单例音频管理器上,这样您就可以卸载音频剪辑的播放并让对象在应该被销毁时被销毁。

这是一个使用 AudioManager 的示例

public AudioManager : MonoBehaviour 
{
  public static AudioManager Instance {get; private set;}
  [SerializeField]
  private AudioClip _cherriesAudioClip; // Assign through inspector
  [SerializeField]
  private AudioSource _audioSource; // Assign through inspector

  void Awake()
  {
    // Make sure there isn't another instance already
    if (Instance != null)
    {
      Destroy(gameObject);
      return;
    }
    // Instantiate the static game object instance
    Instance = this;
    // Make sure it stays alive
    DontDestroyOnLoad(gameObject);
  }

  /// Call from another script to play your clip
  public void PlayCherriesPickup()
  {    
    _audioSource.PlayOneShot(cherriesAudioClip);
  }

然后你像这样使用静态实例从你的可收集脚本中调用它


    private void OnTriggerEnter2D(Collider2D collision) 
    {
      if(collision.tag=="Player" )
      {
        AudioManager.Instance.PlayCherriesPickup();
        cherries += 1;
        score.text=cherries.ToString();
        Destroy(gameObject); // No need to delay the destroy
      }
    }


推荐阅读