代码之家  ›  专栏  ›  技术社区  ›  Philipp Lenssen

不在大厅时,为带LoadBalancingClient的可用Unity Photon房间投票?

  •  1
  • Philipp Lenssen  · 技术社区  · 5 年前

    使用Unity、C#和Photon(PUN2),我已经让用户连接到一个房间,但是现在想要(在该用户不离开房间的情况下)检索一个当前可用的其他Photon房间的列表,包括他们当前的在线用户数(通常只能在大厅中进行会前或会后会合)。Photon support告诉我需要使用LoadBalancingClient创建第二个客户机,但我不知道具体如何创建。基本的Connect-PollAvailableRoomsAndOnlineCounts-Disconnect类和过程的代码框架是什么?谢谢!

    0 回复  |  直到 5 年前
        1
  •  0
  •   Philipp Lenssen    5 年前

    同时找到了答案。下面是我的助手类photonroompller.cs的框架代码:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Photon.Pun;
    using Photon.Realtime;
    using ExitGames.Client.Photon;
    
    public class PhotonRoomPoller : MonoBehaviourPunCallbacks
    {
        // Creates a second Photon peer to poll online room counts info.
        // A second peer is necessary as one otherwise while in a Room can't join
        // the Lobby, needed to get the room list. API at
        // doc-api.photonengine.com/en/pun/v2/class_photon_1_1_realtime_1_1_load_balancing_client.html
    
        Action<List<RoomInfo>> callback = null;
        LoadBalancingClient client = null;
    
        public void GetRoomsInfo(Action<List<RoomInfo>> callback)
        {
            this.callback = callback;
    
            client = new LoadBalancingClient();
            client.AddCallbackTarget(this);
            client.StateChanged += OnStateChanged;
            client.AppId = PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime;
            client.AppVersion = PhotonNetwork.NetworkingClient.AppVersion;
            client.ConnectToRegionMaster("us");
        }
    
        void Update()
        {
            if (client != null)
            {
                client.Service();
            }
        }
    
        void OnStateChanged(ClientState previousState, ClientState state)
        {
            // Debug.Log(state);
            if (state == ClientState.ConnectedToMaster)
            {
                client.OpJoinLobby(null);
            }
        }
    
        public override void OnRoomListUpdate(List<RoomInfo> infos)
        {
            if (callback != null)
            {
                callback(infos);
            }
            client.Disconnect();
        }
    
    }
    

    用法,例如:

    PhotonRoomPoller roomPoller = gameObject.AddComponent<PhotonRoomPoller>();
    roomPoller.GetRoomsInfo
    (
        (roomInfos) =>
        {
            AddContent(roomInfos);
            Destroy(roomPoller);
        }
    );
    

    需要特别注意 match all needed settings (尽管很多也可以保持为空或未定义,例如gameVersion)。