Выполните операцию, когда игрок входит в комнату

Я хочу создать многопользовательское приложение с помощью Photon (Pun2). После того, как игрок входит в комнату, я хочу скрыть некоторые кнопки и отобразить другие для всех игроков в этой комнате. На данный момент у меня есть такая функция:

public override void OnPlayerEnteredRoom(Player newPlayer)
     {
         print(newPlayer); // #02
         if (PhotonNetwork.CurrentRoom.PlayerCount == 2 && PhotonNetwork.IsMasterClient)
         {
             print(PhotonNetwork.CurrentRoom.PlayerCount + "/2 Starting game...");
 
             searchingBtn.SetActive(false); // hide this button
             findMatchBtn.SetActive(false); // hide this button
             scanningBtn.SetActive(true); // display this button
         }
     }

Но это не сработает, потому что только у одного из двух игроков кнопки изменятся, у другого они останутся прежними.

Я видел несколько примеров в Интернете, где в этой функции OnPlayerEnteredRoom она называется PhotonNetwork.LoadLevel(scene_index), но в этот момент я не хочу загружать другую сцену, я хочу остаться в текущей сцене и просто скрыть / отобразить некоторые кнопки. Это вообще возможно?

РЕДАКТИРОВАТЬ: вот окончательная версия

public override void OnJoinedRoom()
{
    Debug.Log("You joined the room.");
    Debug.Log(PhotonNetwork.CurrentRoom.PlayerCount);
    Debug.Log(PhotonNetwork.IsMasterClient);

    UpdateButtons();
}

public override void OnPlayerEnteredRoom(Player newPlayer)
{
    Debug.Log("Other players joined the room.");
    if (PhotonNetwork.CurrentRoom.PlayerCount > 1 && PhotonNetwork.IsMasterClient)
    {
        Debug.Log(PhotonNetwork.CurrentRoom.PlayerCount + "/2 Starting game...");

        UpdateButtons();
    }
}

private void UpdateButtons()
{
    searchingBtn.SetActive(false); // hide this button
    findMatchBtn.SetActive(false); // hide this button
    scanningBtn.SetActive(true); // display this button
}

person Tenzolinho    schedule 26.10.2020    source источник


Ответы (1)


Из документации Photon:

virtual void OnJoinedRoom ()
    //Called when the LoadBalancingClient entered a room, no matter if this client 
    //created it or simply joined.
virtual void OnPlayerEnteredRoom (Player newPlayer)
    //Called when a remote player entered the room. This Player is already added to 
    //the playerlist.

Обладая этим знанием, OnPlayerEnteredRoom вызывается только тогда, когда удаленный игрок присоединяется к комнате. Итак, чтобы решить вашу проблему, вам нужно будет вызвать свой код в OnJoinedRoom обратном вызове для локального клиента и OnPlayerEnteredRoom при подключении удаленного игрока.

Таким образом, ваш новый код должен выглядеть так:

public override void OnPlayerEnteredRoom(Player newPlayer)
{
     UpdateButtons(newPlayer);
}

public override void OnJoinedRoom(Player player)
{
    UpdateButtons(player);
}

private void UpdateButtons(Player player)
{
    if (PhotonNetwork.CurrentRoom.PlayerCount > 1 && PhotonNetwork.IsMasterClient)
    {             
        print(PhotonNetwork.CurrentRoom.PlayerCount + "/2 Starting game...");
 
        searchingBtn.SetActive(false); // hide this button
        findMatchBtn.SetActive(false); // hide this button
        scanningBtn.SetActive(true); // display this button
    }
}
person Beckam White    schedule 27.10.2020
comment
Привет, спасибо за ответ! Но функция переопределения OnJoinedRoom не получает никаких параметров, поэтому это не сработает. - person Tenzolinho; 27.10.2020
comment
Но я понимаю вашу точку зрения, отредактировал свой пост финальной версией. Большое спасибо за это! - person Tenzolinho; 27.10.2020
comment
@Tenzolinho О, моя ошибка. Просто используйте PhotonNetwork.LocalPlayer, чтобы получить ссылку на себя. Если это то, что вы ищете. - person Beckam White; 28.10.2020