Voiceイントロ
目次
はじめに
Photon Voice 2はPhoton Voiceの後継です。以下の機能がアップデートされました:
- より優れたUnityコンポーネントを持つAPI。
- PUN2との互換性
- 柔軟性:PUN2から切り離されたので、Photon Realtime、Photon Bolt、Photon Chat、さらにスタンドアロンでも使用できるようになりました。
- WebRTCベースの新しいDSP(デジタルシグナルプロセッサー)
- 更新された新しいデモ
Photon Voice 2は、こちらからUnity Asset Storedでダウンロードおよびインポートできます。
対応プラットフォーム
- Windows
- UWP
- macOS
- Linux
- Android(64ビットへの対応についてはこちらをご覧ください。
- iOS
- PlayStation 4(特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについては こちらをご覧ください。)
- PlayStation 5 (特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについては こちらをご覧ください。)
- Nintendo Switch (特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについてはこちらをご覧ください。)
- MagicLeap(Lumin OS、特別なアドオンが必要です。こちらからダウンロードしてください。Magic Leapについてはこちらをご覧ください。)
- HoloLens 2 (ARM64には特別なアドオンが必要です。 こちらからダウンロードしてください。)
- Xbox One (特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについてはこちらをご確認ください。)
- XboxシリーズXおよびXboxシリーズS (特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについては こちらをご覧ください。)
インストール手順
Unityの2018.4.22f1以上のバージョンが必要です。
Photon Voice 2は こちらのUnityアセットストアからダウンロードおよびインポート可能です。
Photon Voice 2パッケージにはPUN2が含まれます。 PUN 2はPhoton Realtime Unity SDK、Photon Chat、Photon Unityライブラリに依存するため、Photon Realtime Unity SDKを含みます。 必要に応じてプロジェクトからPUN2のクリーンアップ or Photon Chatのクリーンアップ が可能ですが、その他の部分がPhoton Voiceの作動に必要です。
他のPhotonパッケージとの互換性を維持するため、また円滑なアップデートを保証するため、PhotonアセットをルートPhotonフォルダ("Assets\Photon")から移動しないよう推奨します。
Photon Voice 2はPUN Classicと互換性がありません。 Photon Voice ClassicはPUN Classicと共に使用しますが、これらのパッケージは今後なくなる予定です。
クリーンインポート
すでにPUN 2を含むプロジェクトにPhoton Voice 2をインポートする場合、バージョンの不適合によるコンフリクトエラーを防ぐため、事前にPhotonアセットをクリーンアップすることを推奨します:
- 別のPhotonパッケージ(例:Photon Bolt)を使用していない場合には、"Assets\Photon"フォルダを削除してください。
- 別のPhotonパッケージをインポート済みの場合には、以下のフォルダを削除してください:
- "Assets\Photon\PhotonChat"
- "Assets\Photon\PhotonRealtime"
- "Assets\Photon\PhotonUnityNetworking"
- "Assets\Photon\PhotonLibs"
Photon Voice 2のアップデート後、または別のPhotonパッケージをインポート後に何らかの問題が発生し、クリーンインポートをおこないたい場合にも上記の手順に従ってください。
アップデート
Photon Voice 2の上位にPUN 2をインポートすることは推奨しません。 弊社は常にPUN 2のアップデート後にPhoton Voice 2の新しいバージョンをリリースするため、Photon Voice 2から最新のPUN 2を入手できます。
UnityアセットストアからPhoton Voice 2をアップデートする際に問題が生じた場合には、クリーンインポートをおこなってください。
主要コンポーネント
VoiceConnection
VoiceConnectionコンポーネントインスタンスは、シーンでvoiceクライアントをPhoton Serverに接続するために必要です。 ボイスの通信はルーム内でしか行えないため、VoiceConnectionを使用してマッチメイキングを行い、クライアントが確実にルームに参加できるようにします。
Recorder
Recorderは非常に重要なコンポーネントです。こちらに専用のページがあります。
Speaker
Speakerコンポーネントは、受信したオーディオストリームを再生します。 UnityのAudioSourceコンポーネントを利用しています。このコンポーネントは、ボイスストリームのコンテキスト外や、 作成イベントを介して受信されるストリームの情報を取得するまでは、あまり意味を持ちません。 そのイベントとイベントに含まれるデータは、ローカルのSpeakerコンポーネントをリモートのボイスストリームにリンクするために重要です。 次のセクションでは、Speakerの使用方法について説明します。
SpeakerFactory
SpeakerFactoryメソッドは、新しいリモートボイスストリーム情報を受信するたびに呼び出されます。 SpeakerFactoryの役割は、受信されるリモートボイスストリーム(Recorderコンポーネントインスタンスを介して送信される)をローカルのSpeakerコンポーネントインスタンスとリンクまたはバインドすることです。 リモートのボイスストリームとローカルのSpeaker、またはリモートのRecorderとローカルのSpeakerの間の一対一の関係に対応しています。 デフォルトでは、単一のSpeakerコンポーネントインスタンスを使用して複数の受信オーディオストリームを混ぜて再生することはできません。 Speakerは1つのRecorderに1度リンクされますが、同じオーディオストリームに複数回リンクすることはできません。 複数のSpeakerコンポーネントインスタンスを使用して単一の受信オーディオストリームを再生することもできません。
Factoryで、そのリモートボイスストリームから受信したオーディオフレームを再生するために使用されるSpeakerコンポーネントを返す必要があります。 新しいSpeakerコンポーネントを作成するか、古いSpeakerコンポーネントを再利用するか、またはnullを返して、そのリモートボイスストリームによるすべての受信オーディオフレームの再生をスキップすることができます。
SpeakerFactoryメソッドに渡されるパラメーターは、オーディオストリームの発信元またはソースを識別するのに役立ちます。 SpeakerFactoryの本体のコードを使用して、リモートRecorderコンポーネントから発信される着信オーディオストリームから受信されるオーディオフレームを再生するための最適な候補Speakerコンポーネントを見つけます(または必要に応じて新しいものを作成します)。
SpeakerFactoryメソッドは3つのパラメーターを受け入れ、同じGameObjectにアタッチされたAudioSourceコンポーネントを使用して着信オーディオを再生するために使用されるSpeakerコンポーネントを返します。 SpeakerFactoryメソッドで受け入れられる3つのパラメーターは次のとおりです。
playerId
: オーディオストリームの発信元のプレイヤーのアクター番号。voiceId
: 同じplayerId
から発生するオーディオストリームの番号。userData
: オーディオストリームを送信しているRecorderコンポーネントに設定されたカスタムオブジェクト。
デフォルトのSpeakerFactory
SpeakerFactoryを明示的に設定していない場合は、デフォルトのVoiceConnection.SimpleSpeakerFactory
が使用されます。
デフォルトのVoiceConnection.SimpleSpeakerFactory
は、リモートボイスストリームごとにローカルにインスタンス化されたSpeakerが設定されることを保証します。
SpeakerPrefabを設定すると、そのプレハブはデフォルトの回転とデフォルトの位置で階層内のルートオブジェクトとしてインスタンス化されます。
それ以外の場合、新しいGameObjectが作成されます。
Speakerコンポーネントが接続されているGameObjectは、 "Speaker for Player {0} Voice#{1}"
と名前が変更され、 リモートボイスストリームが削除されると破棄されます。
## インタレストグループの使用法詳細説明
Photon VoiceはPhoton Realtimeの"インタレストグループ"を使用して、異なる「ボイス会話」に属する相互に排他的な「ボイスチャネル」を切り離しています。
「聞く相手」を選択する
各アクターは、興味のあるインタレストグループに登録する必要があります。 デフォルトで、すべてのアクターはボイスのブロードキャストについてグローバルインタレストグループとみなされる、インタレストグループ0をリッスンするようになっています。 他のグループに送信されたボイスを聞くには、送信先のグループに登録する必要があります。 一度登録したグループから登録解除することもできます。 これらすべての操作方法は以下の通りです。:
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(groupsToRemove, groupsToAdd);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(groupsToRemove, groupsToAdd);
「話す相手」を選択する
各アクターは、どのインタレストグループに音声を送信するか決定する必要があります。 送信先となるインタレストグループは以下のように設定します。
recorder.InterestGroup = targetGroup;
ユースケース
全てのケースにおいて、常にデフォルトのインタレストグループ0をリッスンしています。同時に Recorder
コンポーネントごとにボイスを単一のインタレストグループに送信できます。
ユースケースは3つのカテゴリに分類できます:
1. シングルグローバルグループ
同時に単一のグループを1つ使用して、すべてのクライアントとすべての Recorder
コンポーネントにボイスを送信する場合は、このグローバルグループに設定・切替を行うショートカットがあります。
// PUN統合なし:
voiceConnection.Client.GlobalInterestGroup = targetGroup;
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.GlobalInterestGroup = targetGroup;
この場合、ChangeAudioGroups
を呼び出したりPhotonVoiceRecorder.AudioGroup
を設定する必要はありません。システムが行います。
注:
targetGroup
が0
と等しい場合は、デフォルトの挙動になります。 変更を加えたり設定をリセットしない限り、グローバルグループとして明示的に設定する必要はありません。targetGroup
が0
と等しくない場合でも、同グループに送信されたボイスストリームを受信します。- すべての
Recorder
コンポーネント送信はグローバルに設定された同じターゲットグループを使用します。
2. シングルグループをリッスンする
これは、以下が許可されている点でひとつ前のカテゴリとは異なります:
Recorder
ごとに別のターゲットグループを設定する- リッスンするグループは、話すグループとは別の可能性があります。
A. デフォルトグループ
// A. すべてのグループから登録解除します。グループが変更されていない場合は任意です。
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], null);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], null);
// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;
B. 他のグループ
// A.リッスンするグループに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });
// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;
3. 複数のグループをリッスンする
A. 既存のグループすべてをリッスンする
// A.既存のグループすべてに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(null, new byte[0]);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, new byte[0]);
// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;
あとで、この呼び出しの後に生成されたグループに登録する必要があります。
B. グループのAリストをリッスンする
// A. グループのカスタムリストに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], new byte[0] { groupToListenTo });
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], new byte[0] { groupToListenTo });
// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;
自分がリッスンしているグループ以外のグループに話すことができます。
例 groupsToListenTo
はtargetGroup
を含めませんでした。
C. 可能なグループすべてをリッスンする
こちらは慎重に使用してください。使用されることのないグループにクライアントを登録してしまう可能性があります。
using System;
using System.Linq;
// [...]
byte[] allByteValues = Enumerable.Range(1, 255).SelectMany(BitConverter.GetBytes).ToArray();
// A.すべてのグループに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(null, allByteValues);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, allByteValues);
// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;
PUNなしでPhoton Voiceを使用する方法
簡単な方法
- シーンにVoiceConnectionコンポーネントを追加し、「Don't Destroy On Load」を有効にします。
VoiceConnection.Settings
でAppSettingsを設定します。- シーンにRecorderを追加して、プロパティを更新し、
VoiceConnection.PrimaryRecorder
に割り当てます。 Recorder.TransmitEnabled
をtrue
に設定し (Unity Editorのインスペクタ―でチェックを入れます)、音声転送を有効化します。- Speakerプレハブ(Speakerコンポーネントのあるプレハブ)を追加し、
VoiceConnection.SpeakerPrefab
に割り当てます。 - ルームに参加します。参加するには、Photon Realtimeのマッチメイキングオペレーションのいずれかを使用してください(たとえば、"ConnectAndJoin.cs"ユーティリティスクリプトを参照してください)
高度なオプション
- VoiceConnectionコンポーネントをシーンに追加します。
VoiceConnection.Settings
にAppSettingsを設定します。- シーンにRecorderを追加し、プロパティを更新して、
VoiceConnection.PrimaryRecorder
に割り当てます。 3.a. 任意でRecorder.TransmitEnabled
を有効にして、準備ができたらすぐに送信を開始します。 3.b. 自分の声を聞くために、任意でRecorder.DebugEchoMode
を有効にします (ローカルスピーカーをリンクする必要があります。ステップ 4 を参照)。 - スピーカーコンポーネントをリモートオーディオストリームとリンクする方法を決定する:
4.a. 任意でSpeakerFactoryメソッドを実装し、コードで
VoiceConnection.SpeakerFactory
に割り当てる。 4.b. デフォルトのSpeakerFactoryを使用する場合は、オプションでSpeaker prefab(Speakerコンポーネントを持つプレハブ)を追加し、それをVoiceConnection.SpeakerPrefab
に割り当てる。 - ルームに参加します。これにはPhoton Realtimeのマッチメイキング操作を使用します(例として "ConnectAndJoin.cs "ユーティリティスクリプトを参照)。
- [3.a.で有効にしていない場合] ルームに入ったら、
Recorder.TransmitEnabled
をtrue
に設定して、送信を開始します。 - [3.b.で有効にしていない場合] 任意で、自分の声を聞くために、送信するレコーダーの
Recorder.DebugEchoMode
を有効にします。
PUNを削除する方法
PUNなしでPhoton Voiceを使用する場合は、PUNをプロジェクト内に保持するか、単に削除することができます。 これを行うためのショートカットがEditor上にあります:"Window" -> "Photon Voice" -> "Remove PUN"。
または、次の手順に従って手動で実行できます。
- Demos\DemoVoicePUNフォルダを削除する
- Photon\PhotonVoice\Code\PUNフォルダを削除する
- Photon\PhotonUnityNetworkingフォルダを削除する
4."Project Settings" - > "Player"> "Other Settings"> "Script Define Symbols"で、「
PHOTON_UNITY_NETWORKING
」、「PUN_2_X_OR_NEWER
」、「PUN_2_OR_NEWER
」が削除されていることを確認する。
Asset StoreからPhoton Voice 2をインポートすることで、いつでもファイルを元に戻すことができます。
Photon Chatを削除する方法
Photon ChatなしでPhoton Voiceを使用する場合は、Photon Chatをプロジェクト内に保持するか、単に削除することができます。 これを行うためのショートカットがEditor上にあります:"Window" -> "Photon Voice" -> "Remove Photon Chat"
または、"Photon\PhotonChat"フォルダーを削除して、手動で行うことも可能です。
Asset StoreからPhoton Voice 2をインポートすることで、いつでもファイルを元に戻すことができます。