Как воспроизвести звук при Destroy(gameObject)
Имеется следующая функция. При касании персонажа об объект (монета), то он уничтожается. Нужно, чтобы при уничтожении проигрывал звук "mainSound"
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class money : MonoBehaviour
{
public int countC; // установим цену нашей монеты (т.е. какое количество монет будет прибавляться при сборе определенной монеты)
[SerializeField] private AudioSource mainSound;
void OnTriggerEnter2D(Collider2D col)
{
// триггер монеты, реагирует при взаимодействии с монетой (при входе игрока в триггер нашей монеты)
money_cat.money += countC; // добавляем монеты в указанную ссылку
GameObject.FindGameObjectWithTag("Player").GetComponent<money_cat>().TextMoney.text = money_cat.money.ToString(); // вывод количеста монет на экран
Destroy(gameObject);
mainSound.Play();
}
}
Ответы (1 шт):
Вы уничтожаете объект, использующий AudioSource. Решения:
Не уничтожать объект, а просто сделать
disableи уничтожить его после того, как мелодия проиграется (надо узнать длину трека проигрывания предварительно, конечно)Создать глобальный объект с различными аудио ресурсами игры и проигрывать звук оттуда
Перед уничтожением объекта, создать (инстанциировать) пустой объект, прикрепить туда AudioSource и проиграть звук. Большой недостаток в этом: каждый instantiate и destroy сильно сказывается на fps и пустышку с звуком так-же придётся уничтожить по завершению
Использовать
AudioSource.PlayClipAtPoint static function(AudioSource.PlayClipAtPoint). Эта функция создаётaudio source, но автоматически уничтожается, после того как клип проиграется
Также метод Destroy, вторым параметром принимает значение, задержку уничтожения объекта. Поэтому вторым параметром можно указать длину проигрываемого звука и вызвать его к примеру так:
GetComponent<Renderer>().enabled = false; // суперкласс для всех видов рендера
GetComponent<Collider>().enabled = false; // суперкласс для всех видов коллайдеров
mainSound.Play();
Destroy(gameObject, mainSound.clip.length);