团结& Photonengine。场景之后,Reaload加入了大堂,Createroom和Joardom函数,反复称为

发布于 2025-01-26 04:12:20 字数 2931 浏览 4 评论 0原文

我在使用Photon网络的测试项目的最后一步中遇到了问题。当您第一次连接并加入房间时,一切都没有错误。但是,完成比赛后,离开房间并使用LoadScene()出现错误:

Joinlobby操作(229)未调用,因为客户端尚未连接或尚未准备就绪,请访问端状态:joininglob< - 在OnConnectedTomaster()中

,我意识到ConnectusingSettings()方法和其他光子方法被称为多次。但是与大厅的连接发生了,我可以创建一个房间,但是我立即遇到了RereferenceException错误。

我已经看到了遇到同样问题的人的解决方案。由于事件而出现问题。无论这种情况发生在哪里,我都从事件中取消订阅,但这无济于事。还有什么可能导致这样的问题,因为我显然错过了一些阻止我在过渡期间完全关闭现场的东西?

抱歉,我的语言使用了Google翻译

代码: lobbymanager.cs

private void StartConnect()
{
     PhotonNetwork.NickName = master.GameSettings.NickName;
     PhotonNetwork.GameVersion = master.GameSettings.NickName;
     PhotonNetwork.ConnectUsingSettings();
     PhotonNetwork.AutomaticallySyncScene = true;
}
public override void OnConnectedToMaster()
{
     Debug.Log("Connected to server");
     if(!PhotonNetwork.InLobby) PhotonNetwork.JoinLobby();
}
public override void OnJoinedLobby()
{
     onConnected.Invoke();//This use for show UIElements on Canvas
}

JOINRANDOMROOM班级

public void OnClick_JoinRandomRoom()
{
     if (!PhotonNetwork.IsConnected) return;
              
     if (GameModeGlobalData.SelectedGameMode != null)
     {
           SetRoomOptions();
           PhotonNetwork.JoinRandomRoom(expectedRoomProperties, GameModeGlobalData.SelectedGameMode.MaxPlayers);
     }
}
    
public override void OnJoinRandomFailed(short returnCode, string message)
{
     Debug.Log("Join random failed: " + message + ". Room will be created...");
            _createRoomMenu.CreateAndJoinRoom();
}
    
public void SetRoomOptions()
{
     expectedRoomProperties[RoomData.GAME_MODE] = GameModeGlobalData.SelectedGameMode.GameModeName;
}

 
private void OnDisable()
{
      ShowPanels.RemoveAllListeners();
} 

createroom.cs

private ExitGames.Client.Photon.Hashtable _roomCustomProperties = new ExitGames.Client.Photon.Hashtable();
public void CreateAndJoinRoom()
    {
        if (!PhotonNetwork.IsConnected) return;
        if (GameModeGlobalData.SelectedGameMode != null)
        {
            RoomOptions roomOptions = GetCustomRoomOptions();
            roomOptions.CleanupCacheOnLeave = true;
            PhotonNetwork.CreateRoom(randomRoomName, roomOptions);
        }
    }
    public RoomOptions GetCustomRoomOptions()
    {
        RoomOptions options = new RoomOptions();
        options.MaxPlayers = _maxPlayer;
        options.IsOpen = true;
        options.IsVisible = true;

        string[] roomProperties = new string[]{ RoomData.GAME_MODE };
        _roomCustomProperties[RoomData.GAME_MODE] = GameModeGlobalData.SelectedGameMode.GameModeName;

        options.CustomRoomPropertiesForLobby = roomProperties;
        options.CustomRoomProperties = _roomCustomProperties;
        return options;
    }

该项目已经增长,我怪我自己在一开始就没有对其进行测试。认为这个阶段没有问题

I ran into a problem in the last step of a test project using Photon Network. When you first connect and join the room, everything goes without errors. However, after completing the match, exiting the room, and using LoadScene(), errors appear:

JoinLobby operation (229) not called because client is not connected or not yet ready, client state: JoiningLob <- in OnConnectedToMaster()

Through experience, I realized that the ConnectUsingSettings() methods and other Photon methods are called multiple times. But the connection to the lobby happens and I can create a room, but I immediately encounter MissingReferenceException errors.

I've seen a solution from guys who ran into this very same problem. The problems arose because of the events. Wherever this could happen, I unsubscribed from the events, but that doesn't help. What else can cause such problems, because I obviously missed something that prevents me from completely closing the scene during the transition?

Sorry for my language, used Google Translate

Code:
LobbyManager.cs

private void StartConnect()
{
     PhotonNetwork.NickName = master.GameSettings.NickName;
     PhotonNetwork.GameVersion = master.GameSettings.NickName;
     PhotonNetwork.ConnectUsingSettings();
     PhotonNetwork.AutomaticallySyncScene = true;
}
public override void OnConnectedToMaster()
{
     Debug.Log("Connected to server");
     if(!PhotonNetwork.InLobby) PhotonNetwork.JoinLobby();
}
public override void OnJoinedLobby()
{
     onConnected.Invoke();//This use for show UIElements on Canvas
}

JoinRandomRoom class

public void OnClick_JoinRandomRoom()
{
     if (!PhotonNetwork.IsConnected) return;
              
     if (GameModeGlobalData.SelectedGameMode != null)
     {
           SetRoomOptions();
           PhotonNetwork.JoinRandomRoom(expectedRoomProperties, GameModeGlobalData.SelectedGameMode.MaxPlayers);
     }
}
    
public override void OnJoinRandomFailed(short returnCode, string message)
{
     Debug.Log("Join random failed: " + message + ". Room will be created...");
            _createRoomMenu.CreateAndJoinRoom();
}
    
public void SetRoomOptions()
{
     expectedRoomProperties[RoomData.GAME_MODE] = GameModeGlobalData.SelectedGameMode.GameModeName;
}

 
private void OnDisable()
{
      ShowPanels.RemoveAllListeners();
} 

And CreateRoom.cs

private ExitGames.Client.Photon.Hashtable _roomCustomProperties = new ExitGames.Client.Photon.Hashtable();
public void CreateAndJoinRoom()
    {
        if (!PhotonNetwork.IsConnected) return;
        if (GameModeGlobalData.SelectedGameMode != null)
        {
            RoomOptions roomOptions = GetCustomRoomOptions();
            roomOptions.CleanupCacheOnLeave = true;
            PhotonNetwork.CreateRoom(randomRoomName, roomOptions);
        }
    }
    public RoomOptions GetCustomRoomOptions()
    {
        RoomOptions options = new RoomOptions();
        options.MaxPlayers = _maxPlayer;
        options.IsOpen = true;
        options.IsVisible = true;

        string[] roomProperties = new string[]{ RoomData.GAME_MODE };
        _roomCustomProperties[RoomData.GAME_MODE] = GameModeGlobalData.SelectedGameMode.GameModeName;

        options.CustomRoomPropertiesForLobby = roomProperties;
        options.CustomRoomProperties = _roomCustomProperties;
        return options;
    }

The project has grown, and I blame myself for not testing it at the very beginning. Didn't think there would be problems at this stage

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绝不服输 2025-02-02 04:12:20

对不起,这篇文章。它解决了。对于那些将来可能会遇到这种情况的人,除了取消订阅事件之外,还要检查所有从Monobehaviourpuncallbacks继承的类,以了解覆盖的()方法。
像这样:

public override void OnDisable()
{
     base.OnDisable();
}

这又将

PhotonNetwork.RemoveCallbackTarget(this);

从文档中调用:

请勿添加新的monobehaviour.onenablemonobehaviour.ondisable。相反,您应该覆盖这些并调用base.onenable and base.ondisable

我忘记了它,并使用了monobehaviour.ondisable

Sorry for this post. Its resolved. For those who may encounter this in the future, in addition to unsubscribing from events, check all classes that inherit from MonoBehaviourPunCallbacks for overridden OnDisable() methods.
Like this:

public override void OnDisable()
{
     base.OnDisable();
}

This in turn will call the

PhotonNetwork.RemoveCallbackTarget(this);

Also, from the documentation:

Do not add new MonoBehaviour.OnEnable or MonoBehaviour.OnDisable. Instead, you should override those and call base.OnEnable and base.OnDisable.

I forgot about it and used MonoBehaviour.OnDisable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文