среда, 10 декабря 2014 г.

Работа с микрофоном в Unity. Часть 2.


Привет, продолжаем разбираться с микрофоном в Unity. Мы остановились на том, что получаем аудиоданные в наш массив из 256 значений. Следующим шагом рассчитаем среднее значение громкости. Среднее из 256 значений получить легко, и вы это умеете, я уверен, но вот код:

float GetAveragedVolume()

    float[] data = new float[256];
    float a = 0;
    audio.GetOutputData(data,0);
    foreach(float s in data)
    {
        a += Mathf.Abs(s);
    }
    return a/256;
}


Теперь давайте добавим несколько глобальных переменных в наш класс. Первую можно использовать для настройки выходного значения, а вторую для хранения среднего значения (для последующего использования). Я сделаю их глобальными, чтобы к ним можно было получить доступ из другого скрипта. Добавьте следующие строки перед функцией Start. 

public float sensitivity = 100;
public float loudness = 0;


Мы практически закончили. Все что нам осталось, это обновить функцию Update, в которой мы будем звать нашу функцию получения среднего и сетить в нашу loudness переменную. Проделаем мы это путем вызова функции получения среднего и умножения её результата на переменную sensitivity. Функция Update будет выглядеть следующим образом:

void Update(){
    loudness = GetAveragedVolume() * sensitivity;
}

Ну вот и все. Теперь вы сможете получить значение громкости с вашего микрофона и использовать внутри вашей игры. Например для изменения цвета, звука или чего-то подобного. Следующим шагом надо сделать Null объект и приатачить к нему сделанный скрипт. В конце статьи будет полный листинг скрипта. Давайте еще проделаем небольшой мув и сделаем спавн объектов при достаточном значении громкости. 

Спавн по звуку

Давайте сделаем спавн (генерацию) объектов по достижению какого-то заданного уровня громкости. Назовем этот скрипт SpawnByLoudness. Для начала заведем 3 глобальных переменных, которые мы собираемся использовать для связи нашего объекта слушающего микрофон к нашей точке спавна, для определения объекта, который будем спавнить, а также значения порога (громкости), при достижении которого будет происходить спавн. Также используем одну приватную переменную для хранения нашего написанного ранее скрипта. 

using UnityEngine;
using System.Collections;

public class SpawnByLoudness : MonoBehaviour {
    public GameObject audioInputObject;
    public float threshold = 1.0f;
    public GameObject objectToSpawn;
    MicrophoneInput micIn;

    void Start() {

    }

    void Update() {
    }
}

В функции Start мы проверим, чтобы все необходимые параметры были установлены и инициализированы верно. Для начала мы добавим сообщение об ошибке, в том случае, если не был выбран префаб.

if (objectToSpawn == null)
    Debug.LogError("You need to set a prefab to Object To Spawn -parameter in the editor!");

Далее мы получим доступ к нашему аудиобъекту, сначала проверив, установлен он или нет (поискав с помощью GameObject.Find, в этом примере объект называется MicMonitor). Затем получим доступ к нашему MicrophoneInput:

if (audioInputObject == null)
    audioInputObject = GameObject.Find("MicMonitor");
micIn = (MicrophoneInput) audioInputObject.GetComponent("MicrophoneInput");

Эти строчки завершают нашу функцию Start. В функции Update наша задача - следить за изменением параметра loudness и сравнивать его с threshold. Если сравнение успешно, то мы будем спавнить наш объект и масштабировать его путем добавления loudness к каждой оси Scale

void Update () {
    float l = micIn.loudness;
    if (l > threshold)
    {
        Vector3 scale = new Vector3(l,l,l);
        GameObject newObject = (GameObject)Instantiate(objectToSpawn, this.transform.position, Quaternion.identity);
        newObject.transform.localScale += scale;
    }
}


Чтобы проверить всё это дело, создадим пустой объект и аттачним скрипт к нему. Далее, сделайте префаб из объекта, который хотите спавнить и положите его в параметр objectToSpawn в редакторе. 

Теперь у вас есть базовые навыки работы с микрофоном в Unity. Следующим шагом может являться спектральный анализ звуковых данных. Но это занятие для другого тутора. Ах да, прикладываю исходники файлов:

Комментариев нет:

Отправить комментарий