Привет, продолжаем разбираться с микрофоном в Unity. Мы остановились на том, что получаем аудиоданные в наш массив из 256 значений. Следующим шагом рассчитаем среднее значение громкости. Среднее из 256 значений получить легко, и вы это умеете, я уверен, но вот код:
{
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 будет выглядеть следующим образом:
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. Следующим шагом может являться спектральный анализ звуковых данных. Но это занятие для другого тутора. Ах да, прикладываю исходники файлов:
https://dl.dropboxusercontent.com/u/3975965/Blog/MicrophoneInput.cs - MicrophoneInput.cs
https://dl.dropboxusercontent.com/u/3975965/Blog/SpawnByLoudness.cs - SpawnByLoudness.cs
Комментариев нет:
Отправить комментарий