最近SSDがクラッシュしてUnityの環境を5.0.1から5.2にしなくてはならなかった事件があって悲しい思いをしています。
それで5.0.1を使ってた時はAudioSourceをMuteにしてても音量が取れた(気がする…)はずだったんですが、最近5.2にアップデートして急にできなくなって悩んでました。
検証してませんが
Unityでボイスチャットを作る話 - http://qiita.com/CST_negi/items/bf3bc0ede34bbcd2f7b2
と関係あるかも?
とりあえず対処法を見つけましたが正しいか微妙なため何かあったらコメントしてください。
ことの発端
マイクの音量を使って何かするプログラムを書きたかったので以下のURLを参考に書いてました。
http://unity-michi.com/post-396/
で、書いたコードが
using UnityEngine;
using System.Collections;
public class MicTest : MonoBehaviour
{
private new AudioSource audio;
void Start()
{
audio = GetComponent<AudioSource>();
audio.clip = Microphone.Start(null, true, 999, 44100); // マイクからのAudio-InをAudioSourceに流す
audio.loop = true; // ループ再生にしておく
audio.mute = true; // マイクからの入力音なので音を流す必要がない
while (!(Microphone.GetPosition("") > 0)) { } // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる
audio.Play(); // 再生する
}
void Update()
{
float vol = GetAveragedVolume();
Debug.Log(vol);
}
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.0f;
}
}
です。
今までだったら
前はこんな感じで適当にAddComponentしてできたはずなんですが、何故かDebug.Log(vol)で出力されるのは0のみ。
コードのコメントにもありますが、自分の声をマイクで拾ってそれをUnity上で再生させたくはないのでMute=trueにしてますが、その一方で音量自体はとりたかったので困っていました。
ちなみに、Mute=falseにすると音量はとれますが、自分の声が再生されてしまうので解決になってないなぁということです。
で、いろいろ調べてたんですが、結果から言うとこれは仕様っぽいです。AudioMixerに関わる話でした。
直し方
調べたらこの件に関するUnity知恵袋がヒットしました。
What happened to Mute on audiosource for microphone?
ここに書いてあることを元に無事直すことができました。
Mute=falseの時は音量がとれることを応用します。
①まず先ほどのMicTest.csのmute=trueをコメントアウトします。
void Start()
{
audio = GetComponent<AudioSource>();
audio.clip = Microphone.Start(null, true, 999, 44100); // マイクからのAudio-InをAudioSourceに流す
audio.loop = true; // ループ再生にしておく
//audio.mute = true; //←ここ // マイクからの入力音なので音を流す必要がない
while (!(Microphone.GetPosition("") > 0)) { } // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる
audio.Play(); // 再生する
}
こんな感じ。
ポイントは**-80.0dBになっている**ことです。
自分の声がUnity上で聞こえない状態で値がとれるようになりました。やったぜ。