既知の問題点
このページでは、Photonが様々なプラットフォーム上で使用される際の既知の問題点について記載します。
ここで焦点をあてるのは解決が不可能な問題、または回避策のない問題です。
一部の項目ではプラットフォームごとに問題のあるバージョンをリスト化し、他のバージョンを紹介します。
バックグラウンドで実行
モバイルプラットフォームでアプリケーションがバックグラウンドに移行すると、クライアントの接続を保持するためのメインメッセージループが一時停止されます。
以下が、この現象のおもな原因です:
- プレイヤーが「ホームボタン」を押した。
- 電話の呼び出しを受信した。
- 動画広告。
- アプリケーションでオーバーレイ表示を発生させる、サードパーティーのプラグイン(たとえばFacebookやGoogleなど)。
iOSでは、アプリケーションはバックグラウンドで接続を維持できません(詳細は、AppleのディベロッパーページでBackground Executionを参照してください)。アプリがバックグラウンドに切り替わったら、クライアントを切断するのが賢明といえるでしょう。
WebGLでは、PlayerTTLを設定し、タブにフォーカスが戻った際にセッションに再接続するのが賢明といえるでしょう。
多くの場合、ブラウザはバックラウンドでJSやWebAssemblyを実行しません。場合によっては、バックグラウンドで音声を再生することによって(たとえ聞き取れないものでも)、これを回避できます。
PUNには、可能な場合にはクライアントをサーバーに接続し続けるためのバックグラウンドのフォールバックスレッドがあります。
接続を保持するため、バックグラウンドスレッドは限定された時間、サーバーのみにACKを送信します。
デフォルトのバックグラウンドスレッドタイムアウトは60秒間です。この時間はPhotonNetwork.KeepAliveInBackground
を使用して変更できます。
バックグランドがタイムアウトすると、PUNはクライアントを切断します。
バックグラウンドへの移行前にクライアントがルームに参加した場合に、アプリケーションがフォアグラウンドになった直後にPUNは(必要に応じて)同じルームへの再接続と再参加を試行します。
PhotonAnimatorView and とTrigger
Animator Controllerの Triggerパラメータを使用していて「PhotonAnimatorView」を使って同期をおこないたい場合には、問題が発生しないよう処理方法を検討することが重要です。
- Triggerの性質上、Triggerはアニメーションイベントが開始した際にのみ有効化され、次の
Update()
の直前に非有効化されます。 - GameObject上のコンポーネントは、宣言された順に実行されます。
- 実行順序の設定を編集すると、GameObjectのコンポーネント上の実行順序に影響を及ぼします。
「PhotonAnimatorView」コンポーネントは、Triggerを起動するコード後に実行する必要があります。
このため、これはスタックの最下部に設定したほうが安全です。
あるいは、少なくともAnimator.SetTrigger(...)を使用してTriggerを起動するコンポーネントの
下に設定してください。
「PhotonAnimatorView」Inspectorは、様々なパラメータの最新値を表示します。
true
となるべき時にTriggerが的確にtrue
になっているかを、パブリッシュ前でもチェックすることができます。
true
になっていない場合には、この特定のTriggerがネットワーク上で同期されていない可能性があります。
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は正しいライブラリを選択するようすでに設定されています。もしエクスポート中に何らかのエラーが生じる場合には、該当のスクリプトバックエンドに対して正しいライブラリを使用しているか、確認してください。
スクリプトバックエンドとして.NETを使用している場合には、Photon3Unity3D.dllが/Assets/Plugins/Metro/ディレクトリから使用されている点を確認してください。
スクリプトバックエンドとして IL2CPPを使用している場合には、Photon3Unity3D.dllが/Assets/Plugins/ディレクトリから使用されている点を確認してください。