如何在 PhotonNetwork.JoinRandomRoom() 函数调用时不加入私人房间或有投注金额的房间

How not to join private room or room with bet amount on PhotonNetwork.JoinRandomRoom() function call

我正在使用 PUN2 统一开发多人赛车游戏。我想创建 2 种类型的房间。第一种类型是玩家创建一个房间,其中有一些限制,包括最大玩家数、圈数和下注金额(可以称为私人房间或加入房间的价格)。第二种是免费房型。为此,我使用了 JoinRandomRoom() 函数。所以问题是,当我使用 JoinRandomRoom() 函数时,它加入了第一种类型的房间(甚至没有支付价格)。现在我想为这种类型的房间定义约束是,当 JoinRandoomRoom() 函数调用时,如果没有可用的可用房间,则不得允许它加入第一种类型的房间,它会创建一个新房间。

我发现了 JoinRandomRoom() 函数的 2 个重载,但无法理解如何使用它们。我还发现一件事,在创建第一种类型的房间时,我可以在房间名称的开头添加一些额外的字符串,例如“私人”一词,这样我就可以检查这些房间,但不知道如何通过这些条件加入 JoinRandomRoom() 函数,如果房间名称以单词 private 开头,请不要加入该房间并创建一个新房间。

你可以filter rooms for JoinRandomRoom

在您的用例中,我将简单介绍一个自定义 属性 - 确保它也暴露在大厅中 - 称为例如RANDOM 您只在随机房间中设置,而不是在私人或“付费”房间中设置。

=> 您可以明确加入私人房间和付费房间,但仅限那些通过 JoinRandomRoom.

设置了 RANDOM 属性 键的房间

然后您可以简单地进行过滤,例如

private const string RANDOM_PROP_KEY = "RANDOM";
private const byte RANDOM_PROP_VALUE = 42;

private readonly Hashtable randomCustomRoomProperties = new Hashtable { { RANDOM_PROP_KEY, RANDOM_PROP_VALUE  } };
private readonly string [] exposedProperties = new []{ RANDOM_PROP_KEY };

private readonly RoomOptions randomRoomOptions = new RoomOptions
{  
    customRoomProperties = randomCustomRoomProperties,
    customRoomPropertiesForLobby = exposedProperties,
    // ...
};

public void JoinRandomRoom()
{  
    // filter using the expected properties and 0 for ANY max player amount
    PhotonNetwork.JoinRandomRoom(expectedCustomRoomProperties, 0););
}

void IMatchmakingCallbacks.OnJoinRandomFailed(short returnCode, string message)
{
    // No room found matching the filters -> create new
    Debug.LogWarning($"Join random failed with {returnCode} - \"{message}\"\n\n->Instead creating a new random room");
    // Create room using the random properties and NULL for the name so Photon creates a random GUID
    PhotonNetwork.CreateRoom(null, randomRoomOptions);
}

void IMatchmakingCallbacks.OnJoinedRoom()
{
    // joined a room successfully

    // Could be both, random or paid => check if has cost here
}