Как воспроизвести звук при 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);    
→ Ссылка