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

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

ただいまの
回答率

88.59%

Photonを使ってオンラインゲームを作りたい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,096
退会済みユーザー

退会済みユーザー

現状

photonのidを作ってアセットインポートしている
PUN2インポート
2つスクリプト試してみたがどちらもできなかった
1つ目は接続はできるけどbuild run してもう片方でみてみると部屋が作れていない
2つ目はエラーコードが出てしまってマスターサーバーに接続できない

実現したい事

ロビーシーンで部屋を作ってマッチングさせたい

エラーコード

NotImplementedException: The method or operation is not implemented.
Photon.Pun.PhotonNetwork.ConnectUsingSettings () (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:3136)
RoomListView.Start () (at Assets/Scripts/Online/RoomListView.cs:25)

CreateRoom failed. Client is on MasterServer (must be Master Server for matchmaking)but not ready for operations (State: PeerCreated). Wait for callback: OnJoinedLobby or OnConnectedToMaster.
UnityEngine.Debug:LogError(Object)
Photon.Pun.PhotonNetwork:CreateRoom(String, RoomOptions, TypedLobby, String[]) (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:1653)
RoomListView:OnCreateRoom() (at Assets/Scripts/Online/RoomListView.cs:71)

スクリプト

1つ目のコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;

public class NetworkManager : MonoBehaviourPunCallbacks
{
    // ログイン画面
    public GameObject loginUI;
    // 部屋リストを表示するドロップダウン
    public Dropdown roomLists;
    // 部屋の名前
    public InputField roomName;
    // ログアウトボタン
    public GameObject logoutButton;
    // プレイヤーの名前入力欄
    public InputField playerName;
    // ログインまでの情報を表示するテキスト
    private Text informationText;

    public object PhotonLogLevel { get; private set; }

    // Start is called before the first frame update
    void Start()
    {
        // PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する
        PhotonNetwork.ConnectUsingSettings();
        // ロビーに自動で入る
        PhotonNetwork.autoJoinLobby = true;
    }

    // Update is called once per frame
    void Update()
    {

    }

    // ロビーに入った時に呼ばれる
    public override void OnJoinedLobby()
    {
        Debug.Log("ロビーに入る");
        loginUI.SetActive(true);
    }

    // ログインボタンを押した時に実行するメソッド
    public void LoginGame()
    {
        // ルームオプションを設定
        RoomOptions ro = new RoomOptions()
        {
            // ルームを見えるようにする
            IsVisible = true,
            // 部屋の入室最大人数
            MaxPlayers = 2
        };

        if (roomName.text != "")
        {
            // 部屋がない場合は作って入室
            PhotonNetwork.JoinOrCreateRoom(roomName.text, ro, TypedLobby.Default);
        }
        else
        {
            // 部屋が存在すれば
            if (roomLists.options.Count != 0)
            {
                Debug.Log(roomLists.options[roomLists.value].text);
                PhotonNetwork.JoinRoom(roomLists.options[roomLists.value].text);
                // 部屋が存在しなければDefaultRoomという名前で部屋を作成
            }
            else
            {
                PhotonNetwork.JoinOrCreateRoom("DefaultRoom", ro, TypedLobby.Default);
            }
        }
    }

    // 部屋が更新された時の処理
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {

        Debug.Log("部屋更新");
        // 部屋情報を取得する
        RoomInfo[] rooms = PhotonNetwork.GetRoomList();
        // ドロップダウンリストに追加する文字列用のリストを作成
        List<string> list = new List<string>();

        // 部屋情報を部屋リストに表示
        foreach (RoomInfo room in rooms)
        {
            // 部屋が満員でなければ追加
            if (room.PlayerCount < room.MaxPlayers)
            {
                list.Add(room.Name);
            }
            if (room.PlayerCount >= room.MaxPlayers)
            {
                SceneManager.LoadScene("Online");
            }
        }

        // ドロップダウンリストをリセット
        roomLists.ClearOptions();

        // 部屋が1つでもあればドロップダウンリストに追加
        if (list.Count != 0)
        {
            roomLists.AddOptions(list);
        }
    }

    // 部屋に入室した時に呼ばれるメソッド
    public override void OnJoinedRoom()
    {
        loginUI.SetActive(false);
        logoutButton.SetActive(true);
        Debug.Log("入室");

        // InputFieldに入力した名前を設定
        PhotonNetwork.LocalPlayer.NickName = playerName.text;
    }

    // 部屋の入室に失敗した
    void OnPhotonJoinRoomFailed()
    {
        Debug.Log("入室に失敗");

        // ルームオプションを設定
        RoomOptions ro = new RoomOptions()
        {
            // ルームを見えるようにする
            IsVisible = false,
            // 部屋の入室最大人数
            MaxPlayers = 2
        };
        // 入室に失敗したらDefaultRoomを作成し入室
        PhotonNetwork.JoinOrCreateRoom("DefaultRoom", ro, TypedLobby.Default);
    }

    // ログアウトボタンを押した時の処理
    public void LogoutGame()
    {
        PhotonNetwork.LeaveRoom();
        loginUI.SetActive(true);
    }

    // 部屋を退室した時の処理
    public override void OnLeftRoom()
    {
        Debug.Log("退室");
        logoutButton.SetActive(false);
    }

}
2つ目のコード
using System.Collections.Generic;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(ScrollRect))]
public class RoomListView : MonoBehaviourPunCallbacks
{
    [SerializeField]
    private RoomListEntry roomListEntryPrefab = default; // RoomListEntryプレハブの参照

    private ScrollRect scrollRect;
    private Dictionary<string, RoomListEntry> activeEntries = new Dictionary<string, RoomListEntry>();
    private Stack<RoomListEntry> inactiveEntries = new Stack<RoomListEntry>();

    private void Awake()
    {
        scrollRect = GetComponent<ScrollRect>();
    }
    public void Start()
    {

        // PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する
//////////////////     25行目            //////////////////       
 PhotonNetwork.ConnectUsingSettings();
        // ロビーに自動で入る
        PhotonNetwork.autoJoinLobby = true;

    }
    // ロビーに入った時に呼ばれる
    public override void OnJoinedLobby()
    {
        Debug.Log("ロビーに入る");
    }

    // ルームリストが更新された時に呼ばれるコールバック
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        foreach (var info in roomList)
        {
            RoomListEntry entry;
            if (activeEntries.TryGetValue(info.Name, out entry))
            {
                if (!info.RemovedFromList)
                {
                    // リスト要素を更新する
                    entry.Activate(info);
                }
                else
                {
                    // リスト要素を削除する
                    activeEntries.Remove(info.Name);
                    entry.Deactivate();
                    inactiveEntries.Push(entry);
                }
            }
            else if (!info.RemovedFromList)
            {
                // リスト要素を追加する
                entry = (inactiveEntries.Count > 0)
                    ? inactiveEntries.Pop().SetAsLastSibling()
                    : Instantiate(roomListEntryPrefab, scrollRect.content);
                entry.Activate(info);
                activeEntries.Add(info.Name, entry);
            }
        }
    }
//////////////////      71行目                ////////////////////////
    public void OnCreateRoom()
    {
        PhotonNetwork.CreateRoom(
    null, // 自動的にユニークなルーム名を生成する
    new RoomOptions()
    {
        MaxPlayers = 2,
        CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() {
            { "DisplayName", $"{PhotonNetwork.NickName}Room" },
            { "Message", "Anyone can participate" }
        },
        CustomRoomPropertiesForLobby = new[] {
            "DisplayName",
            "Message"
        }
    }

         );
    }

    public void OnRandomMatch()
    {
        PhotonNetwork.JoinRandomRoom();
    }


    // ルームの作成が成功した時に呼ばれるコールバック
    public override void OnCreatedRoom()
    {
        Debug.Log("ルーム作成に成功しました");
    }

    // ルームの作成が失敗した時に呼ばれるコールバック
    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.Log($"ルーム作成に失敗しました: {message}");
    }
    // ランダムマッチングが失敗した時に呼ばれるコールバック
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        // ランダムに参加できるルームが存在しないなら、新しいルームを作成する
        PhotonNetwork.CreateRoom(null);
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る