現在UnityでAndroidアプリを作成していて、機能の一つにスマホのマイクから取得した音をトリガーにオブジェクトの色を変えるというプログラムを作成しています。
参考にしたサイトはこれです。↓
https://qiita.com/ELIXIR/items/ff503d48c24092c05843
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ifClap : MonoBehaviour { [SerializeField, Range(0f, 20f)] float m_gain = 1f; // 音量に掛ける倍率 float m_volumeRate; // 音量(0-1) // Use this for initialization void Start() { AudioSource aud = GetComponent<AudioSource>(); if ((aud != null) && (Microphone.devices.Length > 0)) // オーディオソースとマイクがある { string devName = Microphone.devices[0]; // 複数見つかってもとりあえず0番目のマイクを使用 int minFreq, maxFreq; Microphone.GetDeviceCaps(devName, out minFreq, out maxFreq); // 最大最小サンプリング数を得る aud.clip = Microphone.Start(devName, true, 2, minFreq); // 音の大きさを取るだけなので最小サンプリングで十分 aud.Play(); //マイクをオーディオソースとして実行(Play)開始 } } // Update is called once per frame void Update() { if (m_volumeRate > 0.75f)//ある程度大きい音を検出するとランダムな色に変わる { Color randomColor = new Color(Random.value, Random.value, Random.value, 1.0f); this.GetComponent<Renderer>().material.color = randomColor; } } // オーディオが読まれるたびに実行される private void OnAudioFilterRead(float[] data, int channels) { float sum = 0f; for (int i = 0; i < data.Length; ++i) { sum += Mathf.Abs(data[i]); // データ(波形)の絶対値を足す } // データ数で割ったものに倍率をかけて音量とする m_volumeRate = Mathf.Clamp01(sum * m_gain / (float)data.Length); } }
PC上でこのプログラムをテストする分には、ラグが発生せずオブジェクトの色が変化するのですが、Android上で動かしてみると、1~2秒ほどのラグが発生してしまいます(複数の端末でテストしたところ、すべての端末でラグが発生しました)。
このラグをなくすためにAudioManagerの設定のDSP Buffer Sizeをいじってみたのですが、それでもうまくいきません。Unity上の設定の見直し、またコードの見直しがあれば教えて欲しいです。
また、ラグを発生させずにオブジェクトの色を変化させられる場合もありました。その方法が一度アプリをバックグラウンドの状態にし数秒経過させたのちに、アプリをバックグラウンドから復帰させるとラグがなくなるというものです(なぜこうなるかは全くわかりません)。
あなたの回答
tips
プレビュー