//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Sunday, December 24, 2017 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class MonitorVoiceWin : Window { [SerializeField] Slider m_VoiceSlider; float m_VoiceTime = 9.0f; float m_CheckVolumeInterval = 0.2f; public static AudioSource audioSource; float m_Time; float m_CheckVolumeTime = 0f; #region Built-in protected override void BindController() { } protected override void AddListeners() { } protected override void OnPreOpen() { m_Time = 0.0f; m_CheckVolumeTime = 0.0f; m_VoiceSlider.value = 0; } protected override void OnAfterOpen() { } protected override void OnPreClose() { } protected override void OnAfterClose() { } #endregion protected override void LateUpdate() { base.LateUpdate(); m_Time += Time.deltaTime; m_CheckVolumeTime += Time.deltaTime; if (m_Time >= m_VoiceTime) { m_Time = 0.0f; CloseImmediately(); return; } if (m_CheckVolumeTime > m_CheckVolumeInterval) { m_VoiceSlider.value = Mathf.Min(Volume, 5); } } float[] samples = new float[128]; public int Volume { get { try { if (Microphone.IsRecording(null) && audioSource != null && audioSource.clip != null) { int sampleSize = 128; int startPosition = Microphone.GetPosition(null) - (sampleSize + 1); if (startPosition < 0) { return 1; } audioSource.clip.GetData(samples, startPosition); var wavePeak = 0f; for (int i = 0; i < sampleSize; i++) { if (wavePeak < samples[i]) { wavePeak = samples[i]; } } return (int)(Mathf.Abs(wavePeak) * 5f) + 1; } } catch (Exception) { } return 0; } } } }