在此过程中,当点击开火按钮时,它会创建一个激光对象然后飞过屏幕,当它碰到坏人物体时,它会发出爆炸声并删除激光和坏人物体。 / p>
我不能让它播放爆炸声,但它会删除这两个对象并且不会抛出任何类型的错误。我把爆炸声贴在那个坏人身上,然后说在对象被摧毁之前扮演坏人的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 :(得分:2)
这里的问题是虽然AudioSource
成功播放(因为没有错误),但是它实际上在它的声音剪辑中实际上已经很远之前就被销毁了。在您开始播放之后,您Destroy()
会关联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可能更适用。