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

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

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

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

C#

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

Unity

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

Q&A

0回答

2231閲覧

PUN2 ゲーム開始後にルームに入れないようにしたい

Jejeje

総合スコア38

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

C#

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

Unity

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

0グッド

0クリップ

投稿2020/12/09 18:04

編集2020/12/12 16:02

現在UnityPUN2でオンライン対戦ゲームを制作しています
そしてランダムマッチを実装しているところなのですが、対戦終了後のルームにも参加してしまうという問題にあっています

具体的に説明しますと、ランダムマッチは1vs1の2人で対戦します。
戦車を動かして弾を発射し、弾に当たるとその戦車を非アクティブにしてゲーム終了となります。
ゲームが終了する地”もどる”ボタンが表示され、押すとルームから退出できます。

ルームから1人だけ退出してそのルームの人数が1人だけになったとき
ランダムマッチ検索するとその1人だけになったルームに入れてしまいます

これを防ぎたいです。

試してみたことは

ゲーム開始時に(正確に言うと開始直前)
RoomOptions roomOptions = new RoomOptions();
roomOptions.IsVisible = false;
roomOptions.IsOpen = false;

下記がランダムマッチングに使用しているロビー作成or参加からゲーム画面に遷移するまでの全スクリプトです

Home画面(ここでランダムマッチを選択するとCLauncher2.csが呼ばれPhotonに接続する)

↓RandomBattleシーンに遷移

RandomBattleシーン(RandomBattle.csが呼ばれPhotonNetwork.JoinOrCreateRoomする)

↓OnJoinedRoomするとRandomLobbyシーンに遷移

RandomLobbyシーン(RandomLobby.csが呼ばれ参加者が集まるまで待機する,PhotonNetwork.PlayerList.Length == 2になったら
roomOptions.IsVisible = false; roomOptions.IsOpen = false;
にしてゲーム画面に遷移)

CLauncher2.cs

C#

1using UnityEngine; 2using UnityEngine.UI; 3using UnityEngine.SceneManagement; 4using Photon.Pun; 5using Photon.Realtime; 6 7public class CLauncher2 : MonoBehaviourPunCallbacks 8{ 9 #region Public変数定義 10 11 12 //Public変数の定義はココで 13 14 #endregion 15 16 #region Private変数 17 //Private変数の定義はココで 18 #endregion 19 20 #region Public Methods 21 //ログインボタンを押したときに実行される 22 public void Connect() 23 { 24 //Photonに接続できていなければ 25 if (!PhotonNetwork.IsConnected) 26 { 27 PhotonNetwork.ConnectUsingSettings(); //Photonに接続する 28 Debug.Log("Photonに接続しました。"); 29 if (string.IsNullOrEmpty(PhotonNetwork.NickName)) 30 { 31 PhotonNetwork.NickName = "player" + Random.Range(1, 99999); 32 } 33 PhotonNetwork.LoadLevel("RandomBattle"); 34 } 35 else 36 { 37 //PhotonNetwork.ConnectUsingSettings(); 38 Debug.Log("Photonに接続しました2"); 39 PhotonNetwork.LoadLevel("RandomBattle"); 40 } 41 } 42 43 44 45 #endregion 46 47 void OnGUI() 48 { 49 //ログインの状態を画面上に出力 50 GUILayout.Label(PhotonNetwork.NetworkClientState.ToString()); 51 } 52 53}

RandomBattle.cs

C#

1using UnityEngine; 2using UnityEngine.UI; 3using UnityEngine.SceneManagement; 4using Photon.Pun; 5using Photon.Realtime; 6public class RandomBattle : MonoBehaviourPunCallbacks 7{ 8 private void Start() 9 { 10 // PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する 11 PhotonNetwork.ConnectUsingSettings(); 12 } 13 14 // マスターサーバーへの接続が成功した時に呼ばれるコールバック 15 public override void OnConnectedToMaster() 16 { 17 Debug.Log("接続Master"); 18 19 RoomOptions roomOptions = new RoomOptions(); 20 roomOptions.IsVisible = true; //ロビーで見える部屋にする 21 roomOptions.IsOpen = true; //他のプレイヤーの入室を許可する 22 roomOptions.MaxPlayers = 2; //入室可能人数を設定 23 24 // "room"という名前のルームに参加する(ルームが無ければ作成してから参加する) 25 PhotonNetwork.JoinOrCreateRoom("room", roomOptions, TypedLobby.Default); 26 27 } 28 29 30 // マッチングが成功した時に呼ばれるコールバック 31 public override void OnJoinedRoom() 32 { 33 //SceneManager.LoadSceneAsync("RandomLobby", LoadSceneMode.Single); 34 PhotonNetwork.LoadLevel("RandomLobby"); 35 } 36 37}

RandomLobby.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6using Photon.Pun; 7using Photon.Realtime; 8 9public class RandomLobbyUI : MonoBehaviourPun 10{ 11 bool go = true; 12 private float step_time; 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 if (!PhotonNetwork.IsConnected) //Phootnに接続されていなければ 18 { 19 SceneManager.LoadScene("MultiMode"); //ログイン画面に戻る 20 return; 21 } 22 23 PhotonNetwork.AutomaticallySyncScene = true; 24 go = true; 25 Debug.Log("PhotonNetwork.PlayerList.Length = " + PhotonNetwork.PlayerList.Length); 26 step_time = 0.0f; 27 28 } 29 30 // Update is called once per frame 31 void Update() 32 { 33 if (PhotonNetwork.IsMasterClient) 34 { 35 //Debug.Log("自分はマスター"); 36 37 38 if (go && PhotonNetwork.PlayerList.Length >= 2) 39 { 40 RoomOptions roomOptions = new RoomOptions(); 41 roomOptions.IsVisible = false; 42 roomOptions.IsOpen = false; 43 44 Debug.Log("roomOptions.IsVisible = " + roomOptions.IsVisible); 45 Debug.Log("roomOptions.IsOpen = " + roomOptions.IsOpen); 46 47 Debug.Log("PhotonNetwork.PlayerList.Length = " + PhotonNetwork.PlayerList.Length); 48 Debug.Log("2名参加ゲーム開始"); 49 50 step_time += Time.deltaTime; 51 if (step_time >= 3.0f) 52 { 53 PhotonNetwork.LoadLevel("RandomB"); 54 go = false; 55 } 56 57 } 58 else 59 { 60 Debug.Log("ゲーム開始できません"); 61 } 62 } 63 64 } 65 66 67} 68

ですが試してみたところ失敗でゲーム終了後の1人だけになったルームに入れてしまいました。

どうかアドバイスの方よろしくお願いします・・・

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

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

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

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

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

BluOxy

2020/12/10 04:49 編集

PhotonNetwork.CreateRoom ("CustomPropertiesRoom", roomOptions, null); のようにルーム作成時、ルームオプションを引数に渡しているでしょうか。
Jejeje

2020/12/10 08:24

この質問でも回答して頂き本当にありがとうございます。助かります。 カスタムプロパティ関連がよく分かっていないのでネットで探したものをそのまま利用している感じです RoomOptions roomOptions = new RoomOptions(); roomOptions.IsVisible = true; roomOptions.IsOpen = true; roomOptions.MaxPlayers = 2; // "room"という名前のルームに参加する(ルームが無ければ作成してから参加する) PhotonNetwork.JoinOrCreateRoom("room", roomOptions, TypedLobby.Default); このように書いているのですがこれは渡せているのでしょうか
BluOxy

2020/12/10 10:12

roomOptions.IsOpen = false; にしたのであれば、公式のドキュメントで下記のように書かれていますから、参加できないようになるのではないかと思います。 https://doc-api.photonengine.com/ja-jp/pun/current/class_room_info.html#a617c94cffce6c0adec48aa5302c2d92f それでも駄目であれば、 ・検索で類似の事象がないか探す ・事象が再現するUnityのバージョンや開発環境、最小限のコードを書いて質問に記載する(回答者が検証できるため)、もしくはサポートに聞く(サポートが検証できるため) 辺りを試されると良いかと思います。
Jejeje

2020/12/10 17:18

ゲーム画面(RandomB)に遷移するスクリプトの中でroomOptions.IsVisible = false;にしているのですが なぜか後から参加できてしまうのですよね。。。 下記に記載したものがそのコードです void Update() { if (PhotonNetwork.IsMasterClient) { if (go && PhotonNetwork.PlayerList.Length >= 2) { RoomOptions roomOptions = new RoomOptions(); roomOptions.IsVisible = false; roomOptions.IsOpen = false; Debug.Log("roomOptions.IsVisible = " + roomOptions.IsVisible); Debug.Log("roomOptions.IsOpen = " + roomOptions.IsOpen); PhotonNetwork.LoadLevel("RandomB"); go = false; } else { Debug.Log("ゲーム開始できません"); } } }
Jejeje

2020/12/10 17:23

見にくかったので質問を編集して記載しておきました
BluOxy

2020/12/11 03:36 編集

> このように書いているのですがこれは渡せているのでしょうか と実際のコードが食い違っているように見えます。 (JoinOrCreateRoomはどこで呼び出しているのか) > PhotonNetwork.JoinOrCreateRoom("room", roomOptions, TypedLobby.Default); を呼んでいるのは別のスクリプトでしょうか。 Visual Studioなどで開発しているのであれば、ブレークポイントなどのデバッグ機能で上を呼ぶ前のroomOptionsに意図した値が設定されているか確認してください。
Jejeje

2020/12/12 15:48

>(JoinOrCreateRoomはどこで呼び出しているのか) 見にくい記載で申し訳ございません JoinOrCreateRoomは,OnConnectedToMasterしたときに呼び出して、ルームをOpenにしています if (go && PhotonNetwork.PlayerList.Length >= 2) { RoomOptions roomOptions = new RoomOptions(); roomOptions.IsVisible = false; roomOptions.IsOpen = false; Debug.Log("roomOptions.IsVisible = " + roomOptions.IsVisible); Debug.Log("roomOptions.IsOpen = " + roomOptions.IsOpen); PhotonNetwork.LoadLevel("RandomB"); go = false; //goはbool変数です } はroomに2人マッチングしたら呼び出されるものです (マスター側とクライアント側が同時にゲーム画面に遷移するためのもの) それと同時にroomのOpenをfalseに上書きして入れなくさせようとしました PhotonNetwork.JoinOrCreateRoom("room", roomOptions, TypedLobby.Default); を呼ぶスクリプトと部屋のOpenをfalseにするのは別のスクリプトです ランダムマッチングに使用しているスクリプトを質問に追記しておきます
BluOxy

2020/12/14 10:06

RandomLobby.csのroomOptionsは何にも使われていませんので、都合よくRandomBattle.csで生成したルームは変更できません。 現在そのプレイヤーが入っているルームの情報はPhotonNetwork.CurrentRoomで取得できるようです。 https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_pun_1_1_photon_network.html#a71754de2cf0bd33cddd33198aa3d6696 戻り値の型はRoomです。なので、そのオブジェクトのIsVisibleプロパティとIsOpenプロパティをfalseにしたらどうでしょう。
BluOxy

2020/12/14 10:12

あとは…もし私の書いていることが難しく見えていたら、まずは独自でPUN2を使うのをやめてチュートリアルから始めた方が近道だと思います。もしチュートリアルが難しく感じるようであればまずはC#やオブジェクト指向言語的な基礎知識を得る所から、それが難しく感じるようであればプログラミングとはなんぞや…という所から。 とにかく、土台を固めてから始めないと「分からないことが分からない状態」となって、あまり幸せにはならないです。
Jejeje

2020/12/14 17:32

つまりRandomLobby.csなどからRandomBattle.cs内の関数を呼び出してIsVisibleプロパティとIsOpenプロパティをfalseにするということでしょうか?
BluOxy

2020/12/17 04:29 編集

そうではありません。現在そのプレイヤーが入っているルームの情報はPhotonNetwork.CurrentRoomで取得できるようなので、それを使えば解決しないかと提案しています。 それを使えば解決できると私が考えているのはドキュメントに下記のことが書かれているからです。 > Get the room we're currently in (also when in OfflineMode). Null if we aren't in any room. ドキュメントは基本的に嘘をつきませんから、内容を信じてよくそれぞれのクラスやメソッド・プロパティなどの使い方を読み、利用してみてはいかがでしょうか。 もしドキュメントを読んでも内容が難しく見えるようであれば、もう少し土台を固めた後に再挑戦した方が良いと思います。
Jejeje

2020/12/23 00:59

無事実装できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問