質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4778閲覧

【Unity】Phtonで、エラーが出てルームから出れずに困っています。

kosho206

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/27 08:42

編集2020/07/27 09:26

こちら↓のサイトを参考にしながら、Photonによるネット対戦機能の実装を勧めています。
https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono1

今作っているゲームには、バトル用のシーンとスタート画面用のシーンの2つがあります。
そこで、ゲーム中にバトルシーンから抜けた時に、マッチングのルームからも抜けるようにしたいのですが、この処理が上手くできなくて困っています。
Photonのマッチングの処理では、サイトのコードをコピペして、以下のものを使っています。

using Photon.Pun; using Photon.Realtime; using UnityEngine; using UnityEngine.SceneManagement; // MonoBehaviourではなくMonoBehaviourPunCallbacksを継承して、Photonのコールバックを受け取れるようにする public class SampleScene : MonoBehaviourPunCallbacks { private GameObject Unkoman; private void Start() { // PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する PhotonNetwork.ConnectUsingSettings(); SceneManager.sceneUnloaded += OnSceneUnloaded; } // マスターサーバーへの接続が成功した時に呼ばれるコールバック public override void OnConnectedToMaster() { // "room"という名前のルームに参加する(ルームが無ければ作成してから参加する) PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default); Debug.Log("ルームに参加"); } // マッチングが成功した時に呼ばれるコールバック public override void OnJoinedRoom() { // マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する var StartPos = new Vector3(Random.Range(-10f, 10f), 4f, Random.Range(-10f, 10f)); Unkoman = PhotonNetwork.Instantiate("UnkomanEmpty", StartPos, Quaternion.identity); PhotonNetwork.Instantiate("UnkomanCamera", Unkoman.transform.position, Quaternion.identity); } void OnSceneUnloaded(Scene scene) { Debug.Log("Battleシーン終了"); PhotonNetwork.LeaveRoom(); } }

最後の関数でルームから抜ける処理を行っているのですが、エラーが出てルームから抜けることができません。
エラーの内容は
「現在のサーバ(MasterServer)では、LeaveRoom(254)の操作は許可されません。」
というものです。

自分で調べたりしたのですが、このエラー出てしまう原因が全くわかりません。
このエラーの対処法らしい情報がこちら↓のサイトにあったのですが、サイト通りのことを行っても変わらずエラーがでます。
https://forum.photonengine.com/discussion/15862/operation-setproperties-252-not-allowed-on-current-server-masterserver-on-demo

また、今回のエラーと関係があるかわかりませんが、1つだけ不可解なことがあります。
シーンから抜けた時に呼び出される関数内にDebug.Log("Batteシーン終了");がありますが、
このログが、バトルシーンからスタート画面のシーンに遷移する時に呼び出されるだけでなく、スタート画面からバトルシーンに遷移する時にも呼び出されています。
このコードはバトルシーンのObjにアタッチされているのですが、なぜスタート画面からバトルシーンに遷移するときにも呼び出されるのかわかりません。
そして、スタート画面からバトルシーンに遷移するときにもログが呼び出されてしまいますが、ゲームを実行してからまだバトルシーンを一度も開いたことがない状態で「スタート画面 → バトルシーン」の遷移を行う時だけはログが呼び出されません。
つまり、Unityエディターでスタート画面のシーンを開いて実行すると、その時は実行してからバトルシーンを一度も開いたことがない状態なので、「スタート → バトルシーン」の遷移を行っても最初の遷移だけはログが出力されません。
シーン遷移のコードSceneManager.LoadScene()の第2引数には何も書いていません。

今回のエラーは、この質問投稿に載せたスクリプトが原因ですか?
それとも、これとは別に僕が書いた他のスクリプトが原因である可能性が高いですか?

またもし前者なら、どんなコードに書き換えたらこのエラーが解決できるのかを教えて下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/07/27 08:55

直接関係があるのかは私には分かりませんが、OnSceneUnloadedの引数のsceneを確認してはどうですか? 「スタート画面からバトルシーンに遷移するとき」とのことですが、Unloadされたシーンは「スタート画面」だったりしませんか?
kosho206

2020/07/27 09:15

提案ありがとうございます スタート画面からバトルシーンに遷移する時は、スタート画面をUnloadしてバトルシーンをloadしているので、「スタート画面からバトルシーンに遷移するとき」にスタート画面をUnloadするのは当たり前なのではないですか? 僕は 「シーンUnload時に呼び出される関数はバトルシーンのObjにあるのにスタート画面をUnloadした時にもその関数が呼ばれるのはおかしい」 ということが言いたかったのですが、もしかすると僕は大きな認識の誤りをしてしまっていますでしょうか?
YAmaGNZ

2020/07/27 15:20

実際にどのようなコードでシーンのLoad、Unloadを行っているのか分かりませんし、私も詳しくないので想像ではありますが、実際にUnload、Loadをコールするタイミングとその動作が完了してイベントが発生するタイミングが異なるのではないですかね? Unloadが完了する前に、バトルシーンのLoadが行われ、イベントハンドラを登録した後Unloadが完了しているとか。 実際そのような動作をしているのであれば、OnSceneUnloadedの引数のsceneで識別して処理を行えば問題の現象が出ないとか考えられませんかね?
YAmaGNZ

2020/07/28 08:30

「二回目の」ってことは1回目に追加したイベントハンドラが残っていて呼び出されているとかないですか? OnSceneUnloadedの時に SceneManager.sceneUnloaded -= OnSceneUnloaded; とかしてみたら変わったりしませんかね?
kosho206

2020/07/28 08:58

ありがとうございます。 まさにその通りのことが起きていました。 コメントしていただいたコードを書いたら、二回目の「Play」ボタンを押した時にDebug.Log()が呼び出されなくなりました。 ありがとうございます。 今は依然として二回目の「Play」ボタンを押した時はネットワークオブジェクトが生成されない状態です。 しかしそれはシーン遷移の問題ではなくネットワークのサーバーへの接続などの処理の問題であり、それすらもここで聞いてしまうとこの質問がどんどん長引いてしまうため、一旦ここで閉めたいと思います。 第一段階は解決しました。 ありがとうございました。
guest

回答1

0

ベストアンサー

エラーの内容は
「現在のサーバ(MasterServer)では、LeaveRoom(254)の操作は許可されません。」
というものです。

これは、「というもの」では意味がなくて、エラーメッセージ等そのものをコピペしなければいけません。しかしこの問題の判断は簡単で、エラーの理由は**「Room に入っていないのに PhotonNetwork.LeaveRoom() を呼んだ」**からです。

なので実際のエラーを出すのは簡単で、出してみました。以下のエラーが出力されます。

text

1Operation LeaveRoom (254) not allowed on current server (MasterServer) 2UnityEngine.Debug:LogError(Object) 3Photon.Realtime.LoadBalancingClient:DebugReturn(DebugLevel, String) (at Assets/Photon/PhotonRealtime/Code/LoadBalancingClient.cs:2304) 4Photon.Realtime.LoadBalancingClient:CheckIfOpCanBeSent(Byte, ServerConnection, String) (at Assets/Photon/PhotonRealtime/Code/LoadBalancingClient.cs:2227) 5Photon.Realtime.LoadBalancingClient:OpLeaveRoom(Boolean, Boolean) (at Assets/Photon/PhotonRealtime/Code/LoadBalancingClient.cs:1688) 6Photon.Pun.PhotonNetwork:LeaveRoom(Boolean) (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:1918) 7NetworkGameManager:LeaveRoom() (at Assets/_101/NetworkGameManager.cs:120) 8UnityEngine.EventSystems.EventSystem:Update() (at E:/Program Files/Unity Editor/2019.3.11f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)

エラーメッセージに "MasterServer" とありますが、これはつまり Room のある GameServer には接続しておらず、現在は MasterServer とやり取りをしている、ということを表します。

また、以下の警告も出力されていると思います。

text

1PhotonNetwork.CurrentRoom is null. You don't have to call LeaveRoom() when you're not in one. State: Authenticating 2UnityEngine.Debug:LogWarning(Object) 3Photon.Pun.PhotonNetwork:LeaveRoom(Boolean) (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:1912) 4NetworkGameManager:LeaveRoom() (at Assets/_101/NetworkGameManager.cs:120) 5UnityEngine.EventSystems.EventSystem:Update() (at E:/Program Files/Unity Editor/2019.3.11f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)

つまり現在は部屋に入っていないことを表しています。

投稿2020/07/27 13:44

編集2020/07/27 14:43
bboydaisuke

総合スコア5308

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2020/07/27 14:33

間違いを見つけたため編集します...
kosho206

2020/07/28 08:20

次からエラーは全文乗せるようにします。すみません。 にも関わらず丁寧な説明ありがとうございます。 このエラーは、二回目の「Play」ボタンを押した時に発生していました。 なので、今回の質問の問題は、「スタート画面 → バトルシーン」のシーン遷移のときしか呼び出されないはずの関数が意図しない時にも呼び出されていることが原因であることがわかりました。 解決に向けてがんばります。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問