在2d游戏项目案例(金山打字)中,当我们销毁字母游戏对象时,如果我们使用Audio Source组件播放销毁音效会发现,当我们按下字母销毁物体时,音效并没有如我们预想的一样进行销毁后播放,这是因为游戏对象被销毁了,那么游戏对象所绑定的所有组件都会被销毁,导致无法播放音效,为解决这个问题,博主给大家介绍一种方法,如下:
采用static void PlayClipAtPoint(AudioClip audioClip,Vector3 position,float volume=1.0f),虽然播放的是3D音效,但依旧可以实现我们的功能,因为使用AudioSource.PlayClipAtPoint()播放声音,会在层级面板自动生成一个名为"One shot audio"的物体,播放完后自动删除,但还是存在音量较小的问题,解决音量的问题,因为PlayClipAtPoint()的音效大小与摄像机的位置有关,我们只需要把Main Camera的高度给调低即可,相机越靠近背景图层,音量越大。代码如下:
public AudioClip audioClip;
public float speed;
public string alphabet;
public static int score = 0;
void Start()
{
//speed = Random.Range(0.8f, 1.5f);//简单
speed = Random.Range(3f, 5f); ;//中等
}
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.down * Time.deltaTime * speed);
if (Input.GetKeyDown(alphabet))
{
AudioSource.PlayClipAtPoint(audioClip, Vector3.zero, 1.0f);//播放音效
Destroy(this.gameObject);
score++;
}
if (transform.position.y < -3.5f)
{
Destroy(this.gameObject);
}
}
再给大家介绍一下播放2D音效的函数:static void PlayOneShot(AudioClip audioClip,float volume=1.0f),但PlayOneShot()不像PlayClipAtPoint()一样,PlayOneShot()需要实例化对象才可以实现,即需要绑定AudioSource组件,这样又回到了最初我们未解决上述问题的状态,针对销毁音效不可行,下面是该函数的使用规范:
public AudioClip audioClip;
public AudioSource audioSource;
audioSource.PlayOneShot(audioClip, 1.0f);//需放入函数中