You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中碰撞触发时音效无法播放问题求助

问题:子弹碰撞时音效无法播放,仅Awake阶段可正常播放

我之前遇到过这个问题,现在又出现了。试了各种方法都没法让音效播放,只有在Awake阶段音效能正常响。

我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public int speed = 5;
    public GameObject Particle;

    public AudioSource src; 

    void OnTriggerEnter2D(Collider2D coll)
    {
        if(coll.gameObject.tag == "Enemy")
        {
            src.Play();
            Instantiate(Particle, transform.position, transform.rotation);
            
            Destroy(coll.gameObject);
            Destroy(this.gameObject);
        }
        if (coll.gameObject.tag == "Wall")
        {
            src.Play();
            Destroy(this.gameObject);
            Instantiate(Particle, transform.position, transform.rotation);

        }
    }
}

已添加Audio Source组件

已在子弹对象上挂载Audio Source组件,且已正确赋值音频剪辑,Play On Awake未勾选,音量设置正常。


解决方案

问题核心是:调用src.Play()后立刻销毁了子弹对象,AudioSource依附的GameObject被销毁,音效根本来不及播放。以下是几种可行的解决方式:

1. 延迟销毁子弹对象

将直接销毁的代码改成延迟销毁,等待音效播放完毕后再销毁:

// 替换原代码中的Destroy(this.gameObject)
Destroy(this.gameObject, src.clip.length);

src.clip.length是音频剪辑的总时长,这样能保证音效完整播放后再销毁子弹。

2. 使用独立的音效播放对象

创建一个仅包含AudioSource的预制体,在碰撞时实例化这个预制体来播放音效,音效播放完毕后自动销毁预制体:

// 先在Inspector面板中赋值这个预制体
public GameObject audioPlayerPrefab;

// 在OnTriggerEnter2D方法中替换src.Play()为以下代码
GameObject audioObj = Instantiate(audioPlayerPrefab, transform.position, transform.rotation);
AudioSource tempSrc = audioObj.GetComponent<AudioSource>();
tempSrc.Play();
Destroy(audioObj, tempSrc.clip.length);

这种方式下,音效由独立对象播放,即使子弹立刻被销毁,也不会影响音效播放。

3. 检查AudioSource的关键设置

再次确认你的AudioSource组件:

  • 确保Play On Awake未勾选(防止自动播放干扰)
  • Loop未勾选(除非需要循环音效)
  • Volume数值大于0,且未被静音
  • 音频剪辑(Audio Clip)已正确赋值且无损坏

内容的提问来源于stack exchange,提问作者Qatawneh Razvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:48:25