よくある質問
どのPhoton製品を使用するべきでしょうか?
対象となるゲームやプロジェクトの特性によって異なります。
通常、弊社はFusion または
Quantumの使用を推奨しています。これらは、弊社のもっとも高度なクライアントソリューションです。
概要について、どちらの製品シートにも製品選びのための「Quadrant」が記載されています:
また、Photon CloudとPhoton Serverのどちらを選択すべきかは、こちらを参照ください。
ご不明点はお気軽にお問合せください。
Photon Cloud
Photon Cloudのステータスを確認する方法は?
Photon Cloudのステータスを確認するには、こちらを参照するか、Twitterで@photon_statusをフォローしてください。
最新のステータスについてお知らせします。
デフォルトのPhotonリージョンは?
少なくとも1つのリージョンが利用できる場合、クライアントはPhoton Cloudに接続可能となるべきです。
この点を保証するため、ディベロッパーが明示的に設定しない場合や「ベストリージョン」オプションを選択しない場合には、デフォルト値を設定するか、
またはデフォルト値を使用する必要があります。
デフォルト値はクライアントSDKによって異なります。
ネイティブSDKでは、OpGetRegionsでサーバーによって返されるリージョンリストのインデックス0の値です。
UnityおよびDotNet SDKでは、デフォルトのリージョンは「EU」とする必要があります。
一部のリージョンを無効にすることは可能ですか?
はい。
許可されたリージョンのリストを定義することにより、別の方法で機能します。
詳細は、Dashboardリージョンのフィルタリングを参照してください。
Photon Voice
会話をファイルに保存する方法は?
この質問には、2つに分けて回答します:
1. 受信音声ストリーム:
Photon Voiceのストリームは、ペアを使用して一意に識別されます:PlayerIdとVoiceIdです。
このペアによって、リモート音声ストリームのソースを推定できます:どのプレイヤーなのか、またどのレコーダーなのかという点です。
リモートストリーム用に3つのイベントをサブスクライブ可能です:
- PhotonVoiceNetwork.Client.OnRemoteVoiceInfoAction: 受信した情報とともに、新規でリモート音声ストリームが作成されます。
- PhotonVoiceNetwork.Client.OnAudioFrameAction: 特定のリモート音声ストリームから、音声フレームが受信されます。
- PhotonVoiceNetwork.Client.OnRemoteVoiceRemoveAction: リモート音声ストリームが終了し、破壊されます(転送が停止されます)。
受信リモート音声ストリームの全体を取得したい場合には、以下が可能です:
- そのストリーム向けにOnRemoteVoiceInfoActionハンドラー内でファイルを作成し、開きます。
- OnAudioFrameActionハンドラーで音声データのフレームを書き込みます。
- OnRemoteVoiceRemoveActionハンドラー内でファイルを保存し、閉じます。
ユーザーの入力に応じて、ファイルの開閉やOnAudioFrameActionのアップデートをおこなえます。
2.発信音声ストリーム:
発信音声ストリームについては、Voice.LocalVoiceAudio<T>.IProcessorを作成し、それをローカルの音声処理パイプラインに挿入することが可能です。
PhotonVoiceCreated Unityメッセージを受信するには、コンポーネントをPhotonVoiceRecorderと同じGameObjectにひもづける必要があります。
ローカルで録音された音声フレームはIProcessor.Processにあります。
デモはTestVoiceフォルダ内の「DelayProcessor.cs」で参照してください。
カスタム音声ソースを使用する方法は?
独自のカスタム音声ソースで作成された音声をPhotonVoiceRecorderで転送するには:
1つ目のアプローチ: 消費者がデータストリームを制御
AudioClipWrapperはこのアプローチのサンプルです。
これは、PhotonVoiceRecorder.AudioClipに割り当てられた音声クリップをストリーミングします。
- 音声ソースを読み込むクラスを作成し、 - ExitGames.Client.Photon.Voice.IAudioReaderインターフェースを実装します。例:- MyAudioReaderSource
- エディタで(またはコードで) - PhotonVoiceRecorderの- Sourceを- Factoryに設定します。
- アプリケーションの初期化中に、クラスのインスタンスをどこかに作成します( - PhotonVoiceRecorderが作成される前に):- C# - // MyAudioReaderSource is just an example, replace with your own class name and constructor PhotonVoiceNetwork.AudioSourceFactory = () => new MyAudioReaderSource();
- クライアントが音声ルームに接続され - PhotonVoiceRecorderが転送をおこなっている限り、カスタムの音声ソースインスタンス上で- IAudioReader.Read(float[] buffer)メソッドが呼び出されます(例- MyAudioReaderSource)。
 コールの周波数とバッファサイズは、カスタムの音声ソースインスタンスの- IAudioReader.SamplingRateプロパティによって返されるサンプル率に一致するよう調整されます。
2つ目のアプローチ: プロデューサーがデータストリームを制御
「AudioUtil.cs」内のToneAudioPusherは、このアプローチのサンプルです。
- この場合には - MyAudioPusherSourceなどの代わりに- ExitGames.Client.Photon.Voice.IAudioPusherインターフェースを実装するほうが、より便利です。
 既定のコールバックのみを保管する- IAudioPusher.SetCallbackメソッドを実装する必要があります。
- エディタ(またはコード)で - PhotonVoiceRecorderの- Sourceを- Factoryに設定します。
- アプリケーションの初期化中に、クラスのインスタンスを任意の場所に作成します( - PhotonVoiceRecorderが作成される前に):- C# - // MyAudioPusherSource is just an example, replace with your own class name and constructor PhotonVoiceNetwork.AudioSourceFactory = () => new MyAudioPusherSource();
- ストリーミング中に、保有しているサンプルすべてとともに、定期的に - IAudioPusher.SetCallbackを使用して(例えば- MonoBehaviour.OnAudioFilterReadから)コールバックセットを呼び出します。
 Photon Voiceがすべてのバッファリング作業をおこないます。
{% if Voice_v2 %}
会話をファイルに保存する方法は?
この質問については、2つに分けて回答します:
1. 受信音声ストリーム:
Photon Voiceのストリームは、ペアを使用して一意に識別されます:PlayerIdとVoiceIdです。
このペアによって、リモート音声ストリームのソースを推定できます:どのプレイヤーなのか、またどのレコーダーなのかという点です。
リモートストリーム用に3つのイベントをサブスクライブ可能です:
- VoiceConnection.RemoteVoiceAdded(RemoteVoiceLink): 受信した情報とともに、新規でリモート音声ストリームが作成されます。
- RemoteVoiceLink.FloatFrameDecoded(float[]): 特定のリモート音声ストリームから、音声フレームが受信されます。
- RemoteVoiceLink.RemoteVoiceRemoved: リモート音声ストリームが終了し、破壊されます(転送が停止されます)。
受信リモート音声ストリーム全体を取得したい場合には、以下が可能です:
- そのストリーム向けにRemoteVoiceAddedハンドラー内でファイルを作成し、開きます。
- FloatFrameDecodedハンドラーで音声データのフレームを書き込みます。
- RemoteVoiceRemovedハンドラー内でファイルを保存し、閉じます。
ユーザーの入力に応じて、ファイルの開閉やFloatFrameDecodedのアップデートをおこなえます。
2.発信音声ストリーム
発信音声ストリームについては、Voice.LocalVoiceAudio<T>.IProcessorを拡張してカスタムプロセッサを作成することが可能です。
ローカルで録音された音声フレームはIProcessor.Processにあります。
PhotonVoiceCreated Unityメッセージを受信するには、コンポーネントは Recorderと同じGameObjectにひもづける必要があります。
メソッド内で、LocalVoice.AddPreProcessor (転送前) またはLocalVoice.AddPostProcessor(転送後)を使用して、カスタムプロセッサーをローカルの音声処理パイプラインに挿入してください。
サンプルとして「WebRtcAudioDsp.cs」を参照してください。
カスタムの音声ソースを使用する方法は?
独自のカスタム音声ソースで作成された音声をRecorderで転送するには:
1つ目のアプローチ: 消費者がデータストリームを制御
AudioClipWrapperはこのアプローチのサンプルです。
これは、Recorder.AudioClipに割り当てられた音声クリップをストリーミングします。
- 音声ソースを読み込むクラスを作成し、 - Photon.Voice.IAudioReaderインターフェースを実装します。例:- MyAudioReaderSource
- エディタ(またはコード)で - Recorder.SourceTypeを- Factoryに設定します。
- アプリケーションの初期化中に、クラスのインスタンスを任意の場所に作成します( - Recorderが作成される前に):- C# - // MyAudioReaderSource is just an example, replace with your own class name and constructor Recorder.InputFactory = () => new MyAudioReaderSource();
- クライアントが音声ルームに接続され - Recorderが転送をおこなっている限り、カスタムの音声ソースインスタンス上で- IAudioReader.Read(float[] buffer)メソッドが呼び出されます(例- MyAudioReaderSource)。
 コールの周波数とバッファサイズは、カスタムの音声ソースインスタンスの- IAudioReader.SamplingRateプロパティによって返されるサンプル率に一致するよう調整されます(例- MyAudioReaderSource)。
2つ目のアプローチ: プロデューサーがデータストリームを制御
「AudioUtil.cs」内のToneAudioPusherはこのアプローチのサンプルです。
- この場合には - MyAudioPusherSourceなどの代わりに- Photon.Voice.IAudioPusherインターフェースを実装するほうが、より便利です。
 任意のコールバックのみを主に格納する- IAudioPusher.SetCallbackメソッドを実装する必要があります。
- エディタで(またはコードで) - Recorder.SourceTypeを- Factoryに設定します。
- アプリケーションの初期化中に、クラスのインスタンスをどこかに作成します( - PhotonVoiceRecorderが作成される前に):- C# - // MyAudioPusherSource is just an example, replace with your own class name and constructor Recorder.InputFactory = () => new MyAudioPusherSource();
- ストリーミング中に、保有しているサンプルすべてとともに、定期的に - IAudioPusher.SetCallbackを使用して(例えば- MonoBehaviour.OnAudioFilterReadから)コールバックセットを呼び出します。
 Photon Voiceは、バッファリング処理をすべておこないます。