0 支持
(120 ポイント)
編集

同じネットワークで複数プレイヤーの座標等の同期を実装するためにMUNを使っているのですが、サンプルとしてMUN技術情報ページを参考にプログラミング・チュートリアル<オフラインゲームのオンライン化>を実装しようとしたのですがルームから勝手に退出してしまうという不具合が生じています。

具体的には、ルームを作成した後二つのクライアントがルームに入室している状態で片方のプレイヤーが動かすと、数秒間(三、四秒間)くらいは位置やアニメーションは同期されているのですが、それ以降は同期されなくなって、動かしてから十数秒経つとルームから退出させられてしまいます。

ルームから退出していることに関してはコールバックのOnLeftRoomやOnDisconnectedFromServerを呼ばれたときにDebug.Logでコンソールに出力されるか試したところ、OnLeftRoomは呼ばれて、OnDisconnectedFromServerは呼ばれていないことから、ルームから退出しているだけでサーバから途中で切断していないのではないかと判断しました。

とりあえずチュートリアルのページの不具合の修正やコールバックの適用までは目を通して実装しているつもりなのですが、どうにもうまくいきません。これに関する内容などの解決方法やアドバイスがあれば教えていただきたいです。

私が使っているバージョンは以下の通りです。

Unity 2019.4.10f1

mun_2.8.0.unitypackage

チュートリアルのページはこちらになります。

http://www.monobitengine.com/doc/mun/contents/Tutorial/Introduction.htm

回答 1

0 支持
(3.8k ポイント)

いくつか質問があるのですが

1.単独でルームに入室して操作する場合、途中でルームから退室されることがありますか?

2.ルームから退室させられるのは「ホスト」「それ以外のクライアント」のどちらでしょうか?

3.「ルームを作成した後二つのクライアントがルームに入室している状態」で、ネットワークも含めたデバイスのパフォーマンスは正常な状態を維持されてるでしょうか?(PCであれば"リソース モニター"や"パフォーマンスモニター"などで安定動作が保たれているか確認してください)

4. 手順として「複数クライアントでのテストを再度実施し、プレイヤー操作が同期していることを確認する( http://www.monobitengine.com/doc/mun/contents/Tutorial/TestSucceededMultiPlay.htm ) 」まで進められたうえで確認されていますでしょうか?(途中までの段階であれば、チュートリアルは「オンライン化する上での躓きポイント」をアンチパターンとして紹介しているようなので、この段階まで進めてみてください)


付け加えて、単に MonobitNetwork.LeaveRoom() が不用意に呼び出されていることだけが原因であれば、https://is.gd/ua2LsS に記載されている呼び出し箇所をコメントアウトし、なおもルームから不用意に退室する現象が発生するか確認してみてください。


その上でルーム退室の現象が発生し続けるのであれば、プロジェクト一式、あるいは実行バイナリのエラーログ等を提供していただければ何かしら助言はできるかもしれません。

(120 ポイント)
ご回答ありがとうございます。質問の回答なのですが、

1.単独でルームに入室したときも途中でルーム退室させられます。

2.ルーム退出させられるのはホストとそれ以外のクライアントのどちらもです。

3.リソースモニターなどを確認した結果、デバイスのパフォーマンスは正常な状態を維持している感じでした。

4.「複数クライアントでのテストを再度実施し、プレイヤー操作が同期していることを確認する」まで進めた上で確認しました。

他にMonobitNetwork.LeaveRoom()の箇所をコメントアウトして試してみても勝手にルーム退出してしまいました。また、この現象が起きたときにエラーログ等が吐かれることはありませんでした。
(3.8k ポイント)
なるほどです。ちょっと問題切り分けてみましょうか。

1. Assets/Resources/Player.prefab の Inspector を開き、MonobitViewコンポーネントのチェックボックスをOFFにする。

→ プレイヤーの同期がとれなくなるが、これでルームから強制退出する問題が発生すれば MUNの設定ファイル、もしくはAssets/NetworkControl.cs に問題があるので、中身を確認してみる。

→ ルームから強制退出する問題が発生しなければ Player.prefab に問題があるので、2.へ

2. Assets/Resources/Player.prefab の Inspector を開き、MonobitViewコンポーネントのチェックボックスをONに戻し、Player の MonobitTransformView 、およびその下位オブジェクトの Dude の MonobitAnimatorView のチェックボックスをOFF にする。

→ これでルームから強制退出する問題が発生すれば MonobitView.RPC() の呼び出し部分に問題がある。ちょっと厄介なので、この場合には再度ご相談を。

→ ルームから強制退出する問題が発生しなければ Player の MonobitTransformView、または Dude の MonobitAnimatorView のいずれかがおかしいので、3へ。

3. Assets/Resources/Player.prefab の Inspector を開き、Player の MonobitTransformView  のチェックボックスだけ ON に戻す。(下位オブジェクトの Dude の MonobitAnimatorView のチェックボックスはOFFのまま。)

→ これでルームから強制退出する問題が発生すれば Player の MonobitTransformView に問題がある。ちょっと厄介なので、この場合には再度ご相談を。

→ ルームから強制退出する問題が発生しなければ Dude の MonobitAnimatorView に問題がある。こちらもちょっと厄介なので、この場合にも再度ご相談を。
(120 ポイント)
アドバイスで教えてくださったことを試してみました。

1を試した結果、プレイヤーの同期がとれず、ルームから強制退出する問題が発生しましたので、MUNの設定ファイル、NetworkControl.csを確認してみました。MUNの設定ファイルをバックアップをとりつつ、初期化した後もう一度設定し直してみたり、NetworkControl.csと同じ内容を別のスクリプトでもう一度試してみたりしたのですが、修正されませんでした。MUNの設定ファイルはアセットのMonobitUnityNetworkingのところを初期化しました。
他の2,3の内容を設定を戻したあとに試してみたのですが、同期や強制退出の問題が解決されることはありませんでした。

さらに問題を増やして申し訳ないのですが、もとのプロジェクトの設定ファイルやMonobitViewなどのスクリプトのインスペクターのチェックなどを戻して実行してみたのですが、次はルーム選択した後他のプレイヤー自体表示されなくなりました。片方はUnityのプロジェクトで試しているので、HIerarchyに相手のプレイヤーオブジェクトがあるか調べたのですがHierarchyにありませんでした。
これとは別に他の新規プロジェクトを立ち上げて、同じようにオフラインゲームのオンライン化を試してみたのですが、これも相手プレイヤーが表示されず、強制退出の問題が発生しました。
(3.8k ポイント)
編集
MonobitViewのチェックボックスを外した時点でオブジェクト生成&同期が不可能になるので、「1を試した結果、プレイヤーの同期がとれない」のは正常です。問題はMUNの設定ファイルとNetworkControl.cs だと思いますが、

・初期化は具体的にどういった操作を行ないましたか?(「アセットのMonobitUnityNetworkingのところを初期化した」、では分かりません。どのような手順で初期化していますでしょうか?)

・NetworkControl.cs の設定やスクリプト自体に問題がある場合、「NetworkControl.csと同じ内容を別のスクリプトでもう一度試してみた」のではなんの解決策にもなりません(同じことを再度繰り返しているだけなので)。

いずれにしても「どういった点に問題があるか」「どうすれば解決するか」を文面でやり取りすることは難しいと思いますので

Google(グーグル)ドライブ共有機能の使い方〜URLで気軽にファイルを共有しよう
https://ferret-plus.com/8610

の方法に則り、現状のプロジェクト一式をGoogleDriveを使って共有してください。
(120 ポイント)
GoogleDriveにアップロードしたプロジェクトはこちらになります。

https://drive.google.com/drive/folders/1lcf05RCmRKvdRTWYQ8935mf8pZL_VV2C?usp=sharing

手数おかけしますがよろしくお願いします。
(3.8k ポイント)
編集
GoogleDrive のダウンロード不具合のため回答が遅れました。データ拝見しましたが、特段問題はなさそうに思えます(上記で掛かれている問題について、いただいたデータを実行してみましたが、こちらの環境では同問題が発生しませんでした)。

ただし、気になる点がいくつかありますので、以下の点をご確認ください。

1. 先に
  https://is.gd/nSfl0K
 に記載された要領で、「バックグラウンドでの動作を有効に」してください。
 クライアントのバックグラウンド動作を許可されていないために通信が途切れ、当不具合が発生している可能性が非常に高いです。

2.  上記内容に問題ない場合、また不具合が修正されない場合、「ST_Test5/Assets 以外のフォルダ」について、一旦すべて削除してください。
  該当するフォルダは下記すべてです。
   ・ST_Test5/Library
   ・ST_Test5/LocalPackages
   ・ST_Test5/Logs
   ・ST_Test5/Packages
   ・ST_Test5/ProjectSettings
 削除したうえで(ST_Test5/Assetsのみを残したままで)UnityEditorを起動し、改めて
  https://is.gd/nSfl0K
 に記載された要領で、「バックグラウンドでの動作を有効に」した上でビルドして実行してみてください。

なお、GoogleDrive で共有されたファイルのうち、ST_Test5/Library 内のファイルについて、こちらの環境でのウィルススキャンソフトで感染が確認されました。(Norton 360 にて WS.Reputation.1:危険度中)誤検知である可能性もありますが、安全性を鑑み、「ST_Test5/Assets 以下の情報のみをダウンロード」し、こちらで動作確認しています。
その状態で問題なく動作しているため、問題がある箇所としたら上記2つが考えられますので、この内容で解決するかと思います。
(120 ポイント)
1と2に書かれている事柄を試してみたのですが、問題が解決しませんでした。何度もコメントを頂いて申し訳ないのですが、問題解決しないのでこちら側の環境等に問題があるのでしょうか。何か他に不具合が起こることに関して心当たりがあれば教えていただきたいです。
(3.8k ポイント)
なるほどです。そうなると環境依存だと思いますので、以下の項目を試してみてください。

1. ポートが開放されているかどうか確認してみる。

http://www.monobitengine.com/info/1158/
> サーバ種別 TCP接続ポート番号 UDP接続ポート番号
> mun_resolver 50040-50042 50040
> mun_proxy 50043-50045 50043
> mun_room 50046-50048 50046

ルームに入室処理がなされる = mun_room までの通信までは試みようとしている、と考えられるため、TCPポート50046~50048番、UDPで接続している場合にはUDPポート50046番が閉じている可能性があります。ポート開放されているか、お使いのPCおよびルータの設定を確認してみてください。

2. ファイアウォール経由での通信ログを確認してみる。
お使いのPCがWindowsであれば

https://www.haruru29.net/blog/how-to-get-windows-firewall-log/

上記サイトに記載されている方法を使って通信ログを取得して、どのような通信処理が行われているかを把握してみてください(別途ウィルススキャンソフトを使っているのであればそのログも含めて確認する必要があります)。ログの見方がわからない場合にはお使いのPC上で「ルームから強制退出された直後」の

%systemroot%\system32\LogFiles\Firewall\pfirewall.log

のログファイルをGoogleDriveなどで共有していただければ、何かしらアドバイスができる気がします。

MacPCであれば

https://is.gd/Ryw0xU

に記載されている「PrivateEye」というフリーウェアで通信ログの確認ができますので、そちらでご確認していただき、どういった状況になっているか調査してみてください。こちらについても見方がわからない場合、「ルームから強制退出される直後」のスクリーンショットをGoogleDriveで共有していただければ、何かしらアドバイスができる気がします。
(3.8k ポイント)
上記でも解決しない場合、少々難易度が高いのですが「オンプレミス版 MUN サーバのセットアップ」

(Windows)
1. http://www.monobitengine.com/doc/mun/contents/SetupServer/Introduction.htm
2. http://www.monobitengine.com/doc/mun/contents/SetupServer/Prepare_Win.htm
3. http://www.monobitengine.com/doc/mun/contents/SetupServer/Execute.htm
4. http://www.monobitengine.com/doc/mun/contents/SetupServer/ConnectToSelfServer.htm

(Mac)
1. http://www.monobitengine.com/doc/mun/contents/SetupServer/Introduction.htm
2. http://www.monobitengine.com/doc/mun/contents/SetupServer/Prepare_Mac.htm
3. http://www.monobitengine.com/doc/mun/contents/SetupServer/Execute.htm
4. http://www.monobitengine.com/doc/mun/contents/SetupServer/ConnectToSelfServer.htm

の手順に従い「自分のPC環境上でサーバを構築」してルームへの入室を試みれば、少なくとも『ネットワーク接続の原因によるルーム強制退出』はなくなるはずです。逆を言えば、この手順でうまくいった場合『ネットワーク接続に問題がある』ということが言えますので、お使いの通信プロバイダかルータ製造元に問い合わせるしかないかもしれません。
...