Jump to content

Unity скрипт разбиваемой лампочки (и проигрывание случайных звуков)


Recommended Posts

Unity Как разбить лампочку - сделаем разбивающуюся лампочку, которая проигрывает случайный вариант звука поломки.
 

 

 

Не забудьте переименовать скрипт в Lamp.cs

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// скрипт отвечает за разбитие лампочки
public class Lamp : MonoBehaviour
{
    // Ссылка на видеоурок по пользованию скриптом http://q32.pw/bpUZ
    // Скачать демосцену Lamp.unitypackage http://q32.pw/bpVa

    // игровые объекты, которые мы будем включать (выключать) при разбитии лампочки
    [Header("ГО для вкл/выкл при разбитии")]
    [Tooltip("Источник света для отключения при разбитии")]
    public GameObject lightLampGO; // источник света
    [Tooltip("Искры для включения при разбитии")]
    public GameObject sparksGO; // партикл искры
    [Tooltip("Звук искр")]
    public GameObject soundSparkingGO; // звук искрения
    [Tooltip("Звук разбивающейся лампочки")]
    public GameObject soundLampCrashGO; // звук бьющейся лампочки
    [Tooltip("Звук упавшего на землю стекла (установите источник звука (GameObject) на уровне пола")]
    public GameObject soundLampFallingGO; // звук упавшего на землю стекла

    // вышеописанные объекты будут иметь звуковой файл в AudioSource по умолчанию, если хотим
    // сделать несколько вариантов одного звука, проигрываемого рандомно, то используем массивы:

    [Header("Массивы с вариациями звука")]

    [Tooltip("Звук падающего стекла (несколько вариантов)")]
    public AudioClip[] soundLampFallingArray;

    [Tooltip("Звук искрения (несколько вариантов)")]
    public AudioClip[] soundSparkingArray;

    // массивы в инспекторе можно не задавать вообще, тогда будут проигрываться одни и те же
    // звуки по умолчанию без рандома

    private bool lampIsAlive = true; // информирует, цела ли лампа

    void Start()
    {
        // проверяем подключены ли переменные GameObject'ов в инспекторе
        if (lightLampGO == null) Debug.LogAssertion("Потерян объект - источник света");
        if (sparksGO == null) Debug.LogAssertion("Потерян объект - партикл искры");
        if (soundSparkingGO == null) Debug.LogAssertion("Потерян объект - звук искрения");
        if (soundLampCrashGO == null) Debug.LogAssertion("Потерян объект - звук бьющейся лампочки");
        if (soundLampFallingGO == null) Debug.LogAssertion("Потерян объект - звук упавшего на землю стекла");

        // проверяем есть ли звуки "по-умолчанию" в объектах со звуками
        if (soundSparkingGO.GetComponent<AudioSource>().clip == null) Debug.LogAssertion("Установите в компоненте AudioSource у soundSparking аудиофайл");
        if (soundLampCrashGO.GetComponent<AudioSource>().clip == null) Debug.LogAssertion("Установите в компоненте AudioSource у soundLampCrash аудиофайл");
        if (soundLampFallingGO.GetComponent<AudioSource>().clip == null) Debug.LogAssertion("Установите в компоненте AudioSource у soundLampFalling аудиофайл");

        // проверка, не удалили ли коллайдер
        if (GetComponent<Collider>() == null) Debug.LogAssertion("Не обнаружен компонент коллайдер");
        // проверка есть ли на коллайдере галочка "триггер"
        if (GetComponent<Collider>().isTrigger == false) Debug.LogAssertion("В коллайдере не стоит галочка isTrigger, мы не сможем обработать OnTriggerEnter (лампочка не разобьется)");
    }

    // когда какой-либо предмет попадает в лампочку
    private void OnTriggerEnter(Collider other)
    {
        if (lampIsAlive == true) // если лампа цела, то разбиваем ее, если уже разбита, то ничего не делаем 
        {
            lampIsAlive = false; // помечаем, как разбитую 

            lightLampGO.SetActive(false); // выкл свет

            sparksGO.SetActive(true); // вкл искры

            soundLampCrashGO.SetActive(true); // вкл звук бьющейся лампочки

            // выбираем из массива случайным образом звук искрения и проигрываем его
            PlayRandomSound(soundSparkingArray, soundSparkingGO);

            Invoke("LampFallingDelay", 0.5f); // задержка перед проигрыванием звука упавшего стекла
        }
    }

    // звук упавшего стекла
    void LampFallingDelay()
    {
        // выбираем из массива случайным образом звук падающего стекла и проигрываем его
        PlayRandomSound(soundLampFallingArray, soundLampFallingGO);
    }

    // Проигрываем случайный звук из массива
    void PlayRandomSound(AudioClip[] arraySound, GameObject audioSourceGO) // принимаем массив звуков и объект, откуда прозвучит
    {
        if (arraySound.Length > 0) // если массив имеет элементы в инспекторе (пусть и пустые)
        {
            // выбираем случайный элемент-аудиофайл звука из массива
            AudioClip randomSoundFromArray = arraySound[Random.Range(0, arraySound.Length)];

            if (randomSoundFromArray != null) // если аудиофайл не null
            {
                // присваиваем источнику звука новый аудиофайл
                audioSourceGO.GetComponent<AudioSource>().clip = randomSoundFromArray;
                //Debug.Log(gameObject.name + " - звук из массива успешно проигран: " + audioSourceGO.GetComponent<AudioSource>().clip);
            }
            else Debug.LogWarning("в массиве звуков в инспекторе есть пустые поля - (None (Audio Clip)), " +
                "мы не можем проиграть пустое поле, поэтому проигран звук по умолчанию в самом Audio Source. " +
                "Возможно, вы не заполнили массив звуков, либо удалили файлы с диска.");

        }
        else Debug.Log(arraySound + "В массиве нет ни одного элемента звуков для рандома, проигрывается звук по умолчанию из самого GameObject");

        audioSourceGO.SetActive(true); // вкл объект со звуком (проигрывание звука)
    }

}
// Советы - следите чтобы источник звука упавшего стекла был на уровне пола 
// Звуки должны быть настроены к проигрыванию по Awake, партикл искр тоже + партикл должен сам удаляться или отключаться (т.е. не быть Loop)

 

 

Link to post
Share on other sites
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Powered by Invision Community
Поддержка Invision Community в России

×
  • Create New...