所以我目前正在Unity中開發一款恐怖游戲。目前我有一個(作業)系統,您的語音音量顯示在 UI 滑塊上。比如說你很安靜,這表明你在滑塊上很安靜。如果你響亮,它表明你有多響亮。
我有那個系統作業。但我一直在嘗試找出一種方法,以便如果您的音量(麥克風音量)超過一定水平或響度,就會發生事件。
所以說,我想用我的聲音來激活游戲物件。如果我聲音太大,它會觸發一個事件,激活那個游戲物件。我想要得到的基本上是一種方法,如果 UI 滑塊超過所述滑塊上的某個值,則觸發事件。
我在這里有代碼,顯示了我目前為這個系統擁有的所有腳本。我非常感謝您的幫助!
https://gist.github.com/AidenStickel/3a58f497d41cd44b320fecfcc5ea850d
(忽略標有“ScaleFromAudioClip”的腳本)
uj5u.com熱心網友回復:
這是一個有趣的功能。因此,我查看了您的初始檢測代碼并對其進行了一些修改以提供您要求的功能。
這是我想出的代碼:
public class AudioLoudnessDetection : MonoBehaviour
{
public event Action<float> BelowLowThreshold;
public event Action<float> AboveHighThreshold;
[SerializeField] private int _sampleWindow = 64;
[SerializeField] private float _lowThreshold;
[SerializeField] private float _highThreshold;
private AudioClip _microphoneClip;
private string _microphoneName;
private bool _listening;
private float _currentLoudness;
public float lowThreshold => _lowThreshold;
public float highThreshold => _highThreshold;
public bool isListening=> _listening;
public float currentLoudness => _currentLoudness;
void Awake ( )
{
_microphoneName = Microphone.devices [ 0 ];
_microphoneClip = Microphone.Start ( _microphoneName, true, 20, AudioSettings.outputSampleRate );
if ( _microphoneClip != null )
_listening = true;
else
this.enabled = false;
}
void Update ( )
{
_currentLoudness = GetLoudnessFromAudioClip ( Microphone.GetPosition ( _microphoneName ), _microphoneClip, _sampleWindow );
if ( _currentLoudness < _lowThreshold )
BelowLowThreshold?.Invoke ( _currentLoudness );
else if ( _currentLoudness > _highThreshold )
AboveHighThreshold?.Invoke ( _currentLoudness );
}
public static float GetLoudnessFromAudioClip ( int clipPosition, AudioClip clip, int sampleWindow )
{
var startPosition = clipPosition - sampleWindow;
if ( startPosition < 0 ) return 0;
var waveData = new float[sampleWindow];
clip.GetData ( waveData, startPosition );
//compute loudness
var totalLoudness = 0f;
for ( var i = 0; i < sampleWindow; i )
totalLoudness = Mathf.Abs ( waveData [ i ] );
return totalLoudness / sampleWindow;
}
}
我首先添加了一些屬性,最重要的是currentLoudness. 這是在每一幀期間計算的,因此無需專門呼叫方法來計算它。您可以在滑塊或其他任何您想知道麥克風響度的地方閱讀此屬性。有了這個屬性,就不需要GetLoudnessFromMicrophone.
還有價值觀,低門檻和高門檻。這些用于確定是否觸發了事件。這兩個事件是BelowLowThreshold和AboveHighThreshold。
代碼假設在游戲程序中麥克風不會改變,并快取到Microphone.devices [ 0 ]名稱以嘗試減少垃圾產生。
最后,您可以像這樣注冊這些事件:
public class Test : MonoBehaviour
{
[SerializeField] private AudioLoudnessDetection _loudnessListener;
void Start ( )
{
if ( _loudnessListener != null && _loudnessListener.listening )
{
// Uncomment if you'd also like to know if the loudness goes below a threshold.
// _loudnessListener.BelowLowThreshold = OnBelowThreshold;
_loudnessListener.AboveHighThreshold = OnAboveThreshold;
}
}
private void OnAboveThreshold ( float loudness )
{
// loudness above threshold.
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517273.html
標籤:C#unity3d
