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
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

×
  • Create New...