2016-04-03 72 views
0

在這個程序中,當點擊火焰按鈕時,它會創建一個激光對象,然後飛過屏幕,當它碰到壞人對象時,它會播放爆炸聲並刪除激光和壞人的對象。AudioObject在GameObject被破壞之前不會播放

我不能讓它播放爆炸聲,但它確實刪除了兩個對象,並沒有拋出任何類型的錯誤。我把爆炸聲附加到了壞人身上,並且在物品被毀壞之前,扮演壞人的AudioSource

using UnityEngine; 
using System.Collections; 

public class LaserFire : MonoBehaviour { 

    public float laserSpeed = 10f; 

    // Use this for initialization 
    void Start() { 
     //when the shot is fired, play the sound effect for a shot fired 
     GetComponent<AudioSource>().Play(); 
    } 

    // Update is called once per frame 
    void Update() { 
     //moves the object across the screen over time 
     transform.Translate(0f, laserSpeed * Time.deltaTime, 0f); 
    } 

    void OnTriggerEnter2D(Collider2D hitObject) 
    { 
     //if the laser hits a bad guy, play the audio clip attached to the bad guy 
     hitObject.GetComponent<AudioSource>().Play(); 
     Destroy(hitObject.gameObject); 
     Destroy(gameObject); 
    } 
} 
+0

嗨,你有沒有讓你的問題得到解決?如果不是,請更新您的問題,以表明現有答案未能成功解答您的問題。謝謝! – Serlite

回答

1

這裏的問題是,雖然AudioSource成功打(因爲沒有錯誤),之前它實際上可以在其聲音片段走得很遠它被摧毀。剛開始播放後,您就可以與其相關聯的GameObject,這可以有效地立即停止播放。

爲了解決這個問題,可以考慮使用AudioSource.PlayClipAtPoint()

void OnTriggerEnter2D(Collider2D hitObject) 
{ 
    //if the laser hits a bad guy, play the audio clip attached to the bad guy 
    AudioSource hitAudio = hitObject.GetComponent<AudioSource>(); 
    AudioSource.PlayClipAtPoint(hitAudio.clip, transform.position); 
    Destroy(hitObject.gameObject); 
    Destroy(gameObject); 
} 

此方法將實例化一個臨時對象與AudioSource它,發揮它,並摧毀它播放結束一次。因此,如果你的規模增加,你應該留意這種方法的用法;它可能會由於生成垃圾而造成性能問題,因此object pooling可能更適用於此。

+0

對不起,延遲響應!由於某些原因,這不起作用。但是,當我註釋掉Destroy(hitObject.gameObject);你是對的,它確實發揮了聲音;但是即使創建臨時對象,它仍然不能播放。聲音剪輯是否應該不被存儲在被銷燬的對象上? – uofarob

+0

@uofarob啊,你是對的!對不起,我在考慮'PlayClipAtPoint()' - 我已經更新了我的答案,讓我知道這是否有幫助。 – Serlite

+0

這樣做!非常感謝! – uofarob