この記事は、WebGLでのボイスチャットを実現するVoice Proに関する記事です。
Voice Proのデモをそのままビルドしてもマイクがうまく作動しない
PUN2とVoice Proをそのままインポートして、PUN2の設定を済ませた後、
FrostweepGames/VoicePro/Examples/Demo/VoiceDemo.scene
を開いて、VoiceProオブジェクトのDebug Echo
にチェックをつけて、エディタ上で再生すると、Rキーを押しながら話すと、自分の声が返ってきます。うまく動作していますね。
次にこのシーンをBuild & Runしてみて、Rキーを押しながら話すと、声が返ってこない...
これはマイクがうまく動作できていないのです。
Microphoneのリフレッシュが必要
Voice ProはMicrophone Proを使用しています。そのMicrophone Proのデモとしてこちらが提示されています。
右上のマイクリストに注目してください。
マイクを許可する前は、Microphone 1
と表示されています。
しかし、マイクを許可した後、Refresh Devicesを二回押すと各々のマイク名に更新されます。
そこで、マイクを許可していても、Microphone 1になっている間はマイクが動作しません
ちゃんとリフレッシュしてMicrophone1からちゃんとしたマイク名に更新する必要があるんですね。
そこでどうリフレッシュするのか。
このデモのリフレッシュ部分のスクリプトを抜粋します。
private void RefreshMicrophoneDevicesButtonOnclickHandler()
{
//マイクリストの更新
CustomMicrophone.RefreshMicrophoneDevices();
if (!CustomMicrophone.HasConnectedMicrophoneDevices())
return;
//ポップダウンリストの更新
devicesDropdown.ClearOptions();
devicesDropdown.AddOptions(CustomMicrophone.devices.ToList());
DevicesDropdownValueChangedHandler(0);
}
このCustomMicrophone.RefreshMicrophoneDevices();
を差し込めばいいんですね。
デモのスクリプトを改善
デモのスクリプトを改善して下記のようにしました。
改善部分を強調しています。
using FrostweepGames.Plugins.Native;
using FrostweepGames.VoicePro;
using UnityEngine;
public class VoiceTest : MonoBehaviour
{
public Recorder recorder;
public Listener listener;
public bool isRecording;
void Update()
{
//録音
if (Input.GetKeyDown(KeyCode.R) && !isRecording)
{
StartRecord();
}
else if (Input.GetKeyUp(KeyCode.R) && isRecording)
{
StopRecord();
}
///////////////////////////////////////////////////////
//【リフレッシュ】
if (Input.GetKey(KeyCode.F))
{
Debug.Log("Refresh");
//マイクリストのリフレッシュ
CustomMicrophone.RefreshMicrophoneDevices();
//リストの中の最初の項目にマイクをセット
recorder.SetMicrophone(CustomMicrophone.devices[0]);
}
///////////////////////////////////////////////////////////////////
}
public void StartRecord()
{
if (CustomMicrophone.HasConnectedMicrophoneDevices())
{
recorder.SetMicrophone(CustomMicrophone.devices[0]);
isRecording = recorder.StartRecord();
Debug.Log("Record started: " + isRecording);
}
else
{
recorder.RefreshMicrophones();
}
}
public void StopRecord()
{
isRecording = false;
recorder.StopRecord();
Debug.Log("Record ended");
}
}
この例ではFキーを押すとリフレッシュされます。
マイクの許可をしたのち、Fキー連打してからだとRキー押すと話せるようになります。