既知の問題点
このページでは、Photonが様々なプラットフォーム上で使用される際の既知の問題点について記載します。
ここで焦点をあてるのは解決が不可能な問題、または回避策のない問題です。
一部の項目ではプラットフォームごとに問題のあるバージョンをリスト化し、他のバージョンを紹介します。
バックグラウンドで実行
モバイルプラットフォームでアプリケーションがバックグラウンドに移行すると、クライアントの接続を保持するためのメインメッセージループが一時停止されます。
以下が、この現象のおもな原因です:
- プレイヤーが「ホームボタン」を押した。
- 電話の呼び出しを受信した。
- 動画広告。
- アプリケーションでオーバーレイ表示を発生させる、サードパーティーのプラグイン(たとえばFacebookやGoogleなど)。
iOSでは、アプリケーションはバックグラウンドで接続を維持できません(詳細は、AppleのディベロッパーページでBackground Executionを参照してください)。アプリがバックグラウンドに切り替わったら、クライアントを切断するのが賢明といえるでしょう。
WebGLでは、PlayerTTLを設定し、タブにフォーカスが戻った際にセッションに再接続するのが賢明といえるでしょう。
多くの場合、ブラウザはバックラウンドでJSやWebAssemblyを実行しません。場合によっては、バックグラウンドで音声を再生することによって(たとえ聞き取れないものでも)、これを回避できます。
アプリケーションが、クライアントの切断タイムアウト(デフォルトでは10秒です)よりも長い間停止した場合には、クライアントは切断され、アプリケーションの「一時停止解除」後すぐに再接続する必要があります。 「タイムアウト切断」コールバックは、アプリケーションがバックグラウンドから復帰した後にのみトリガーされます。
ゲーム設計上、プレイヤーが数秒または数分後に戻ることが許容されている場合には、ゲームへの再接続や再参加が可能です。 アプリケーションの一時停止が解除された状態で、同じルームに同じアクター番号で再参加したい場合には、以下の点を考慮する必要があります:
- PlayerTTL: しばらく経過した後にプレイヤーが戻ってこられるよう、PlayerTTLの値を十分に高く設定してルームを作成する必要があります。
- EmptyRoomTTL: 最後に参加したプレイヤーのアプリケーションがバックグラウンドで実行されている場合、しばらくの間ルームをアクティブな状態に保つよう、EmptyRoomTTLの値を十分に高く設定してルームを作成する必要があります。
Unity
インポート時の無限コンパイルエラー
Unity Editorのバージョンによっては、誤った.slnや.csprojファイルを作成する場合があります。これは一時的な可能性があります。プロジェクトを再生成するには、Preferences 「External Tools」パネルのボタンをクリックしてください。
Unity Package ManagerからVisual Studio Editorパッケージを更新または再インストールしたい場合があるかもしれません。
この方法でもプロジェクト作成の問題を解決できます。
古いパッケージがローカルのオフラインキャッシュに残ってしまい、アセットが正常に更新されない場合があります。
これを修正するにはローカルでPhotonアセットパッケージを削除し、ダウンロードとインポートを再試行してください。
ローカルのUnityアセットストアのキャッシュフォルダのパスはここに記載されています.
Socket.SetSocketOptionでのArgumentException
IL2CPPビルドで、"ArgumentException: Value does not fall within the expected range.
at System.Net.Sockets.Socket.SetSocketOption"のエラーがでて接続に失敗するUnityの既知の問題がありました。これはWindows 10 SDK 10.0.19041.0がインストールされた際に発生しました。
影響のあったUnityバージョンは 2018.4.23f1、2019.4.0f1、2020.1.0b11、2020.2.0a13です。Unityのマイナーリリースでもより多くの影響がありました。
修正済みのバージョンは以下のとおりです: 2020.1.1f1、2019.4.5f1およびそれ以降、 2018.4.27もおそらく修正済みです2018.4.23での回避策はこちらに記載されています。
.Net 4.x使用時のUnity 2018.2ソケットのフリーズ
Unity 2018.2はMonoバージョンを使用していました。これはソケット経由通信をフリーズさせてしまうことがありました。メッセージサイズや頻度によって発生していました。
最終的に2019.2で修正され2018.3でもある時点から修正をされています。
Monoと.Net 4.xまたは.Net Standard 2.0を使用する場合は、2018.4.xまたは2019.4.xリリースの使用を推奨します。
RunInBackground
UnityのApplication.runInBackground
はモバイルプラットフォーム上ではサポートされていません。
その代わりに、アプリケーションがバックグラウンドやフォアグラウンドに移動した場合には、OnApplicationPause
メソッドが呼ばれます。
C#
void OnApplicationPause( bool pauseStatus )
{
if (pauseStatus)
{
// app moved to background
} else
{
// app is foreground again
}
}
IOS App Store への投稿の拒否
App Store への投稿が Apple チームによって拒否されることがあります。
Apple と解決しようとしましたが、現在ではこの現象はまだ稀に発生する可能性があります。通常、このようなケースではUDPがブロックされています。
新しいPhotonクライアントは、UDPが接続できない場合、自動的にTCPを使用するようにフォールバックします。
拒否されたことを訴える必要がありますが、疑問がある場合は、Appleのデベロッパーサポートに引き継ぐよう依頼してください。彼らのセットアップは通常UDPをサポートしています。
このヘルプのためのフォーラムでの議論を参照してください。
iOS IPv6
Unity 5.xは基本的にiOSのIPv6をサポートしているはずですが、一部のバージョン(5.4など)ではこの機能が壊れています。
サポートされているバージョンの一部:4.7.2, 5.1.5, 5.2.5, 5.3.4p4, 5.4.0p1 およびそれ以降 (Unityブログポストを参照)。
UWP / Windows ストア機能
Windows Storeが対象で、接続を試行する場合に例外が生じている際や、または以下のエラーが発生する場合について説明します:
このネットワークにアクセスするには、ネットワーク機能が必要です!
必要な機能を有効化するには、Unityの「Player Settings」-> 「Publisher Settings」 -> 「Capabilities」-> 「InternetClient」から設定をおこないます。
UWPアプリケーションは他のアプリケーションから分離されており、機能として同じWindowsインスタンス上で実行されているサーバーに接続することはできません。
「AppContainer Isolation」についてはMicrosoftのドキュメントを参照ください。
UWPエクスポート
UnityアプリケーションをUWPにエクスポートする場合、スクリプトのバックエンドとして.NETまたはIL2CPPを使用できます。アプリケーションをUnityから正常にエクスポートするため、Photon PUNまたはPhoton Realtime Unity SDKは正しいライブラリを選択するようすでに設定されています。もしエクスポート中に何らかのエラーが生じる場合には、該当のスクリプトバックエンドに対して正しいライブラリを使用しているか、確認してください。
Photon Voice
Android マイクパーミッション
通常、Androidプラットフォームを構築する際には、多くのパーミッションはUnityによって自動的にマニフェストファイルに追加されます。
Photon Voiceによって必要とされるパーミッションは以下の2つです:
android.permission.INTERNET
: UnityのPlayer Settingsによって、自動的に追加されます。android.permission.RECORD_AUDIO
: UnityのマイクAPIが使用されている場合に自動的に追加されます。
ただしAndroid Marshmallowの場合には、新たに導入されたパーミッションモデルが原因と思われる問題があります。
生成されたAPKにはandroid.permission.RECORD_AUDIO
パーミッションがなく、アプリケーションは音声を録音できません。
Android SDKレベル23が対象で、この問題を回避するには最新バージョンのUnityにアップデートしてください。
Unityのデフォルトの動作では、アプリケーションが開くとすぐにすべてのパーミッションをリクエストされます。
これを非有効化するには、"AndroidManifest.xml"ファイルに以下の1行を追加してください:
XML
<application <!-- your application's attributes --> >
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
</application>
もしこの追加をおこなった場合には、自分でマイクパーミッションをリクエストする必要があります。
リクエストしないとPhoton Voiceが機能しません。
こちらのプラグインを使用できます。
iOSマイクパーミッション
プロジェクトの「Player Settings」に「Microphone Usage Description」を追加する必要があります。以下のスクリーンショットのとおり、「Other Settings」から -> 「Configuration」セクションを開いてください。
または、UnityによってエクスポートされたXcodeプロジェクトで「Info.plist」へのNSMicrophoneUsageDescription
キーを追加する必要があります。
文字列の値で、そのアプリケーションでマイクを使用する理由を説明しなければなりません。 説明しない場合には、以下の結果が生じる可能性があります:
- ビルドサブミッションをAppleが却下
- クラッシュ
macOSマイクパーミッション
「"Microphone Usage Description」をプロジェクトの"Other Settings" -> "Configuration"以下の「Player Settings」に追加する必要があります。
これによりmacOSアプリケーションバンドルパッケージコンテンツのリストにNSMicrophoneUsageDescription
が追加されます。
希望があれば、手動で修正することもできます。
ただし、以下の権利付与を追加する必要がある場合もあります:
Plain Old Text
com.apple.security.device.audio-input
com.apple.security.device.microphone
詳細はこちらを参照してください。
こちらに失敗すると、以下の結果が生じる可能性があります。:
- クラッシュ
- マイクのサイレント失敗: 音声入力が記録されません。
Unityでのマイクの問題
Unityの一部のバージョンでは、Microphone.Start()がヌルポインタ例外、または0チャネルをスローする場合があります。 後者の場合には、以下の例外が生じる可能性があります。
後者の場合には、以下の例外が生じる可能性があります。ArgumentOutOfRangeException: モノまたはステレオにする必要があります
Unityの一部のバージョンでは、マイククリップから報告されるサンプル率が0となる場合もあります。
詳細は、Unity Issue Trackerのリンクを確認してください。Unityの一部のバージョンでは、Windowsでの入力デバイス切替が破損しています:どのUnityマイクデバイスを選択しても、録音にデフォルトのものが使用されます。
詳細は、Unity Issue Trackerのリンクを確認してください。
周波数の警告
以下のような警告が表示される場合があります:
MicWrapper does not support suggested frequency 48000 (min: 44100, max: 44100). Setting to 44100
この警告は、設定されたサンプリング率がハードウェアの制約によって使用できないことを意味しています。
Local voice #1 audio source frequency 44100 and encoder sampling rate 24000 do not match. Resampling will occur before encoding.
上記の警告はリサンプリング(理論上はパフォーマンスに影響します)に関するもので、マイクの周波数がエンコーダーの周波数と一致しない場合に表示されます。
上記からわかるとおり、可能な場合は常にマイクの周波数とエンコーダーの周波数を完全に一致させてください。
Opusエンコーダーは、受信シグナルに対していくつかの固定された周波数をサポートしています。
ローカル音声を作成する際には、これらの周波数から選択する必要があります。
さまざまな周波数のデータをローカル音声に入力するのは意味がありません。
このためキャプチャデバイスを設定する際には、そのデバイスにも同じ周波数を設定してください。
ただし、一部のデバイスでは任意の周波数が許容されません(たとえばAndroid)。 この場合には可能な限り近く、かつサポートされた周波数が設定されます。
ネイティブライブラリのアップデート
コードを使用して、Unity Editor内のプレイモードでネイティブライブラリファイルがロードされると、Editoを閉じない限りそのライブラリファイルはアンロードされません。
少なくとも1回はプレイモードに入ったことがあるため、もし後者がすでにメモリにロード済みの場合にネイティブライブラリファイルのインポートとアップデートを試行するとUnity Editorはエラーを投げます(以下のスクリーンショットを参照してください)。
Editor内またはEditor外から手動でネイティブライブラリファイルを削除しても、Editorがまだ開いている場合には問題は継続します。
このため、Photon Voiceをアップデートする場合には、Unity Editorを必ず再起動する点、またアップデート前にプレイモードに入らないようにする点に留意してください。
Android 64ビットのサポート
Photon VoiceはAndroid64ビットに互換性のあるライブラリを、バージョン1.18と2.4から提供しています。
サポート対象のUnity最小バージョンは、2017.4 LTSと2018.2です。
Android 64ビットをサポートするUnityバージョンの完全なリストや手順については、 こちらのリンクを参照してください。
iOSスピーカーの問題
UnityにはiOS(ほとんどの場合、iPhone)での既知の問題があり、ラウドスピーカーやその他の接続されたヘッドフォン、ヘッドセット、イヤーピースではなく「イヤースピーカー」(電話の通話に使用されるデバイスの前面最上部にあるスピーカー)がデフォルトの音声出力デバイスとして使用されます。
この問題は、「低音量」と呼ばれることもあります。
詳細は、Unity Issue Trackerのリンクを確認してください。
この問題を解決するには、以下を推奨します:
Photon Voice1を使用している場合には、Photon Voice2にアップグレードしてください。
PhotonをRecorder.MicrophoneTypeとして使用してください。
上記1と2が不可の場合には:
a. Unity 2018.3以降を使用している場合には、iOS Player Settingsから「Force iOS Speakers when Recording」を有効化できます。
b. 「UnitySpeakerFix」を使用してください。Unity Editorまたはコードから、
Recorder.SetIosAudioSessionParameters
メソッドを使用してiOS音声セッションパラメータを調整してください。プリセットから値を選択するか、または手動でカスタムの値を定義することができます。iOS音声セッションについては、こちらを参照してください。
iOSサイレント/着信音の切替とミュート
設計上、設定されている場合にはほとんどのiOS音声セッションカテゴリでミュートは許可されません。詳細情報は、こちらのTable B-1を参照してください。たとえば、デフォルトの音声セッション「PlayAndRecord (AVAudioSessionCategoryPlayAndRecord
)」を使用している場合(「ゲーム」プリセットによって設定)、ハードウェアを「Silent」に切り替えてもアプリケーションはミュートされず、ボリュームをゼロに下げることもできません。
WebGLサポート
WebGLは以下の理由によりサポート対象のプラットフォームとはなっていません。:
WebGLはスレッドでうまく作動せず、Photon Voiceのエンコーディングとデコーディングにスレッドを使用しているため。
UnityのマイクがWebGLでは使用できないため。
WebGLで作動するOpusコーデックライブラリビルドが必要であるため。
WebGL用のPhotonはWebSocketSecureプロトコルにのみ対応しているため。
Photon Voiceは、UDPを使用するほうが効率がいいです。
これらの理由により、WebGLプラットフォームのサポートを取りやめました。
Oculus OVR SDK
Oculus OVR SDKを使用している場合、「Can Own Microphone」を宇高にします。
このオプションはOculus OVR SDKにマイクのコントロールを許可し、Photon Voice Recorderがマイクに適切にアクセスできなくしてしまいます。
以下にあります。:
"LocalAvatarWithGrab" または "(+)LocalAvatar" GameObject -> "Ovr Avatar (Script)" コンポーネント -> "Can Own Microphone" チェックボックスからちぇっくを外します。
Oculus OVR SDKを使用している場合、「Can Own Microphone」を無効にする必要があります。
このオプションで、Oculus OVR SDKに独占的なマイクコントロールが与えられ、Photon Voice Recorderがマイクにアクセスしてしまうことをしっかりと防ぎます。
以下の手順で行います。
"LocalAvatarWithGrab" または "(+)LocalAvatar" GameObject -> "Ovr Avatar (Script)" component -> "Can Own Microphone" チェックボックスで、チェックを外します。
エコーまたはノイズ
まず、必ず最新のPhoton Voice 2にアップデートを行ってください。
エコーを引き起こしうる要因:
- 十分な距離を保たずに複数のデバイスを用いてテストを行うと、あるデバイスのマイク入力日かのデバイスのスピーカーからの出力をキャッチしてしまう。
- デバッグエコーを使用したテスト:
Recorder.DebugEchoMode
をtrue
に設定する - 同一のマシン上で複数のクライアントを使用してテストを行うこと。
エコーやノイズを減らすために:
- ネイティブオーディオインプットプラグイン: Photon マイクタイプを選択する。
- ソフトウェアオーディオプロセッシング(WebRTCベース): 同一のGameObjectにRecorderとしてアタッチされているWebRtcAudioDspコンポーネントでAEC / AEC MobileおよびNoiseSuppressionを有効にする。
ヘッドフォンの使用で問題が解決できる場合は、他のAppでもよくあるように、ユーザーにヘッドフォンを使用することでオーディオの質が良くなる旨メッセージを追加(例:splashscreenの後)しておくことを推奨します。
低音量
まず、音声が小さい問題の原因が入力にあるのか出力にあるのか確認します。
これは入力ソースとしてAudioClipファイル(このファイルのラウドネスに問題がないことの確認)を、そしてDebugEchoModeを使用して確認できます。
出力に問題がある場合は、スピーカーのボリュームを上げるか、出力オーディオデバイス関連の問題を解決する必要があります。
入力に問題があり、入力ソースがマイクの場合は以下を行います。:
ターゲットのプラットフォームによって以下を選択できます。:
- Photonマイクタイプを使用する。
- 使用中のRecorderコンポーネントの隣にWebRtcAudioDspコンポーネントを追加し(コンパイル時またはレコーダー開始する前のランタイム時)、「AGC(自動音量コントロール)」を有効にし、必要に応じて「AGC Compression Gain」を調整する。
- 使用中のRecorderコンポーネントの隣にMicAmplifierコンポーネントを追加し(コンパイル時またはレコーダー開始する前のランタイム時)、値を調整する。
高ピッチ
このセクションでは、繰り返し発生する再生に関する問題を説明するために最も一般的なキーワードとして「高ピッチ」と名付けましたが、他の再生に関する問題についても解決策を記載しています。また、音楽ストリーミングの再生遅延設定を調整する方法についてもご紹介しています。
Photon VoiceのSpeaker
再生時に数秒間、音程の変化に気づくと思いますが、これは追いつこうとしているためです。
これは、ネットワーク遅延の変動をより良く処理するために、オーディオプレーヤー (UnityAudioOut
) のコードを変更した結果です (これは 2.20 で発生しました)。
この問題に対処するため、v2.22では再生遅延を調整する複数のパラメータ値を追加しました。
高度な再生遅延設定(PlaybackDelaySettings
)をグローバルにおこなうにはPhotonVoiceNetwork.Instance.SetGlobalPlaybackDelaySettings
/ VoiceConnection.SetGlobalPlaybackDelaySettings
から、またはスピーカーごとに個別におこなうにはspeaker.SetPlaybackDelaySettings
でおこないます。
この設定はエディターから、またはコードでおこなえます。
再生遅延の設定は以下のとおりです:
MinDelaySoft
: 対象遅延の下限: オーディオプレーヤーはこの値以上の遅延を維持しようとします。デフォルトは200です。MaxDelaySoft
: 対象遅延の上限: オーディオプレーヤーはこの値以下の遅延を維持しようとします。デフォルトは400です。MaxDelayHard
: オーディオプレーヤーは遅延がこの値を超過しない点を保証します。デフォルトは1000です。
再生の挙動:
遅延が
MinDelaySoft
とMaxDelaySoft
の間の場合、何も発生しません。MaxDelaySoft
とMaxDelayHard
の間の場合、データは入力ストリームに追いつくようにリサンプリングされます。遅延が
MaxDelayHard
よりも大きい場合、目標値に設定されます(MinDelaySoft
とMaxDelaySoft
の平均。デフォルトでは(200 + 400) / 2 = 300です)。
条件:
MinDelaySoft
が0以上の場合。MaxDelaySoft
がMinDelaySoft
よりも大きい場合。MaxDelayHard
がMaxDelaySoft
以下の場合: リサンプリングは発生しません。
ヒント:
妥協点が見つかるまで遅延値を微調整することが、前提となっています。
- 最初のステップとして、
MaxDelayHard
<=MaxDelaySoft
を設定して再生時のリサンプリングを無効にします。これは特に音楽ストリーミングの場合に重要です。 - 一時停止を避けるには、遅延時間を長くすると一時停止は音声ではほとんど気づかれず、音楽でははっきりと聞こえるようになります。
- 音楽ストリーミングには、もっと高い
MinDelaySoft
(500-1000msで、それに応じてMaxDelaySoft
を調整する) をお勧めします。 - もう1つの試してみる価値のあるオプション:信頼性の高い送信(
Recorder.ReliableMode
を使って有効にします)、YouTubeは巨大な遅延で信頼性の高い送信をしています。 - 200、400、1000のデフォルトの組み合わせから始めて、次に200、400、400、400とし、その後、
MaxDelaySoft
>MinDelaySoft
を維持しながら、MinDelaySoft
を増加させてみてください。ステップは100ミリ秒や200ミリ秒、あるいは一度に2倍にすることもできます。
例:(200, 400, 400) -> (300, 600, 600) または (400, 800, 800) など。
もし問題が継続する場合:
- コメントを解除して、
//#define USE_ONAUDIOFILTERREAD
を実行してみてください。この再生メソッドは、OnAudioFilterRead
コールバックを介してUnityのビルトインオーディオパイプラインを利用するもので、3Dポジショニングはサポートしていません。 - また、再生用に独自の
IAudioOut
の実装を作成してSpeaker
で使用することもできます。
Photonマイクタイプを使用する場合のAndroid音量調整
There are four volume sliders on Android:
Androidには4つの音量スライダーがあります:
- メディア音量: 音楽、動画、ゲーム、その他のメディア。
- 通話音量: 通話時の他の人の音量。
通話時のみ利用可能です。 - 呼出音量: 電話呼出、通知。
- アラーム音量
オーディオセッションのモードに応じて、システムはどのスライダーをハードウェアボタンに割り当てるかを自動的に選択します。
詳細はこちらを確認してください。
Photonマイクタイプのレコーダーを使用する場合は、ハードウェアAECが使用できるように音声通話モードに切り替わります。
この場合、音量ボタンはCall volumeを調整します。
この音量は、Media volume で制御されるUnity出力には影響しません。
音量を変更する場合には、Media volume スライダーに変更することもできます。
また、WebRtcAudioDspでUnityのマイクタイプを使用することもでき、UnityのマイクタイプにはAEC、NoiseSuppression、AGC、さらに良いVADがあります。