2016-04-03 4 views
0

In diesem Verfahren wird beim Klicken auf den Feuerknopf ein Laserobjekt erstellt, das dann über den Bildschirm fliegt. Wenn es das Objekt trifft, spielt es einen Explosionston und löscht den Laser und der Bösewicht Objekt.AudioSource wird nicht abgespielt, bevor GameObject zerstört wird

Ich kann es nicht erreichen, um einen Explosionston zu spielen, aber es löscht die zwei Objekte und wirft keine Art von Fehler. Ich befestigte den Explosionssound an den Bösewicht und sagte, dass der Bösewicht AudioSource spielt, bevor die Objekte zerstört werden.

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

Hallo, hast du jemals dein Problem gelöst? Falls nicht, aktualisieren Sie Ihre Frage, um anzugeben, wie die vorhandenen Antworten Ihre Frage nicht erfolgreich beantwortet haben. Vielen Dank! – Serlite

Antwort

1

Das hier Problem ist, dass, obwohl die AudioSource erfolgreich abgespielt wird (da es keine Fehler gibt), wird es zerstört wird, bevor es tatsächlich sehr weit in seiner Soundclip bekommen. Gleich nachdem Sie anfangen, es zu spielen, haben Sie Destroy() die zugehörige GameObject, die effektiv die Wiedergabe sofort stoppt.

Um dies zu adressieren, betrachten AudioSource.PlayClipAtPoint() mit:

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

Diese Methode wird ein temporäres Objekt mit dem AudioSource auf sie instanziiert, spielen, und es einmal die Wiedergabe beendet zerstören. Aus diesem Grund sollten Sie Ihre Verwendung dieser Methode im Auge behalten, wenn Ihre Skala zunimmt; es könnte möglicherweise Leistungsprobleme aufgrund des erzeugten Mülls verursachen, so dass object pooling dann möglicherweise zutreffender ist.

+0

Entschuldigung für die verzögerte Antwort! Dies funktioniert aus irgendeinem Grund nicht. Wenn ich jedoch Destroy (hitObject.gameObject) auskommentiere; Du hast recht, dass es dann den Ton spielt; Aber selbst wenn das temporäre Objekt erstellt wird, wird es immer noch nicht abgespielt. Sollte der Soundclip nicht auf dem zu zerstörenden Objekt gespeichert werden? – uofarob

+0

@uofarob Ah, du hast Recht! Tut mir leid, ich dachte an 'PlayClipAtPoint()' - Ich habe meine Antwort entsprechend aktualisiert, lass mich wissen, ob das hilft. – Serlite

+0

Das hat es geschafft! Vielen Dank! – uofarob

Verwandte Themen