首页 > 解决方案 > Unity Photon PUN 2 错误尝试连接

问题描述

我在这里遇到了 Photon 的 PUN 2 的问题。有时它可以工作,但其他时候却不行。自过去 2 周以来,它的工作并不顺利。在它变得更好之前,我加入了主人,然后加入了大厅,它允许我列出房间并毫无问题地加入它们。现在,我并没有对代码进行太多更改,我只是在错误开始后才更改它。现在,有时它加入了一个匹配,但另一个它没有,显示以下错误:

JoinRandomRoom failed. Client is not on Master Server or not yet ready to call operations. Wait for callback: OnJoinedLobby or OnConnectedToMaster.

我只有 2 台设备可以使用 PUN 在线测试,但是,即使我创建的房间不再工作,它似乎只是随机工作。如果您想检查它,这是我的代码:

void Start()
{
    PhotonNetwork.ConnectUsingSettings();
}

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

}
public override void OnJoinedLobby()
{
    //   /* print("Connected to lobby")*/;

}
public override void OnConnectedToMaster()
{
    //This shows a popup to let know the player that is connected 
    //PhotonNetwork.JoinLobby();
    base.OnJoinedLobby();
    GameObject.Find("IWifi").SetActive(false);
    print("Puga");
    StatePScript.IsShow = true;
    Connected = true;
    GameObject.Find("IOk").GetComponent<Image>().color = Color.white;
    print("IOKS Value is " + IOKS.Show);
    GameObject.Find("StatusText").GetComponent<Text>().text = "Connected!";
    GameObject.Find("StatusText").GetComponent<Text>().color = Color.green;
    A.Play();
    GameObject.Find("StatePanel").GetComponent<Animator>().SetBool("Show", false);
    IOKS.Show = false;
    GameObject.Find("IOk").GetComponent<Image>().color = new Color(0, 0, 0, 0);
    Connected = false;
    StatePScript.IsShow = false;
}

我有其他这样的光子脚本,即随机房间代码:

using UnityEngine.UI;
using Photon.Pun;
public class RandomBScript : MonoBehaviourPunCallbacks
{

    // Use this for initialization
    private Button B;
    void Start ()
    {
        B = GetComponent<Button>();
        B.onClick.AddListener(Clicker);
    }
    void Clicker()
    {
        PhotonNetwork.JoinRandomRoom();
        print("Random");
    }
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        base.OnJoinRandomFailed(returnCode, message);
        print(message);
    }
}

创建房间代码:

using Photon.Pun;
using Photon.Realtime;
public class CreateRoomS : MonoBehaviourPunCallbacks
{

    // Use this for initialization
    private Button B;
    private InputField IF;
    private InputField PlayerField;

public AudioSource A;
void Start ()
{
    B = GetComponent<Button>();
    PlayerField = GameObject.Find("PlayerInput").GetComponent<InputField>();
    IF = GameObject.Find("NameInput").GetComponent<InputField>();
    B.onClick.AddListener(Clicker);
}
private void Awake()
{

}
void Clicker()
{
    print("Trying To create a room...");
    if (IF.text.Length > 0 && IF.text.Length <= 20)
    {
        int PlayerAmount = Int32.Parse(PlayerField.text);
        RoomOptions roompos = new RoomOptions()
         {
            IsVisible = true, IsOpen = true, MaxPlayers = (byte)PlayerAmount
         };
        PhotonNetwork.CreateRoom(IF.text, roompos);
        print("RoomCreated!");
    }
    else
    {
        A.Play();
    }
}
public override void OnJoinedRoom()
{
    print("We are in a room");
    PhotonNetwork.LoadLevel("WaitScene");
}
public override void OnCreateRoomFailed(short returnCode, string message)
{
    base.OnCreateRoomFailed(returnCode, message);
}
public override void OnCreatedRoom()
{
    base.OnCreatedRoom();
    print("We created the room");
}
// Update is called once per frame
public override void OnConnectedToMaster()
{
    base.OnConnectedToMaster();
    print("Connected to the master");
}

最后,列出房间代码:

using Photon.Pun;
using Photon.Realtime;
using System.Reflection;
using System;
public class RooManager : MonoBehaviourPunCallbacks
{

    // Use this for initialization
    public GameObject roomPrefab;
    public Sprite Four, Two, Three;
    private string RoomName;
    private int PlayerAmount;
    private int MaxPlayers;
    private Image I;
    private Vector2 RoomVector;
    private bool Lock = false;
    public GameObject Content;
    private List<RoomInfo> RoomList;
    private bool IsntNull = false;
    private Dictionary<string, RoomInfo> cachedRoomList;
    private Dictionary<string, GameObject> roomListEntries;

    private void Awake()
    {
        GameObject.Find("StatePanel").GetComponent<Animator>().SetBool("Show", true);
        cachedRoomList = new Dictionary<string, RoomInfo>();
        roomListEntries = new Dictionary<string, GameObject>();
    }
    void Start ()
    {
        Content = GameObject.Find("Content").GetComponent<GameObject>();
        RoomVector = new Vector2(370, this.transform.position.y);      
    }
    void Rooming()
    {
        PhotonNetwork.JoinLobby();

    }
    private void ClearRoomListView()
    {
        foreach (GameObject entry in roomListEntries.Values)
        {
            Destroy(entry.gameObject);
        }
        roomListEntries.Clear();
    }

    private void UpdateRoomListView()
    {
        foreach (RoomInfo Item in cachedRoomList.Values)
        {
            RoomName = Item.Name;
            PlayerAmount = Item.PlayerCount;
            MaxPlayers = Item.MaxPlayers;
            RoomVector.y -= 100;
            GameObject RoomPrefab = Instantiate(roomPrefab, RoomVector, transform.rotation) as GameObject;
            if (Item.PlayerCount == 0)
            {
                Destroy(RoomPrefab);
            }
            print(PhotonNetwork.CurrentLobby.Name);
            RoomPrefab.transform.Find("RoomName").GetComponent<Text>().text = RoomName;
            RoomPrefab.transform.Find("PlayerInt").GetComponent<Text>().text = PlayerAmount.ToString();
            if (Item.PlayerCount == 0)
            {

            }
            if (Item.MaxPlayers == 4)
            {
                GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Four;
            }
            else if (Item.MaxPlayers == 2)
            {
                GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Two;
            }
            else if (Item.MaxPlayers == 3)
            {
                GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Three;
            }
            RoomPrefab.transform.SetParent(Content.transform);
        }
    }

    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        ClearRoomListView();
        UpdateCachedRoomList(roomList);
        UpdateRoomListView();
        print("Updated");
    }
    private void UpdateCachedRoomList(List<RoomInfo> roomList)
    {
        foreach (RoomInfo info in roomList)
        {
            // Remove room from cached room list if it got closed, became invisible or was marked as removed
            if (!info.IsOpen || !info.IsVisible || info.RemovedFromList)
            {
                if (cachedRoomList.ContainsKey(info.Name))
                {
                    cachedRoomList.Remove(info.Name);
                }

                continue;
            }

            // Update cached room info
            if (cachedRoomList.ContainsKey(info.Name))
            {
                cachedRoomList[info.Name] = info;
            }
            // Add new room info to cache
            else
            {
                cachedRoomList.Add(info.Name, info);
            }
        }
    }

此脚本为 photon 服务器中的每个房间实例化一个按钮。如果你点击一个按钮,你就加入了那个房间。正如我所说,有时它起作用,有时它不起作用,有时它有助于注释 PhotonNetwork.JoinLobby() 行,但这意味着你不会看到 romos。实际上,即使有或没有 JoinLobby() 行,它也不能很好地工作。

标签: c#unity3dphoton

解决方案


推荐阅读