【问题标题】:Perform operation when a player enters the room当玩家进入房间时执行操作
【发布时间】:2021-06-09 00:58:24
【问题描述】:

我想使用 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
         }
     }

但这不起作用,因为只有 2 名玩家中的 1 名按钮会改变,而另一名玩家的按钮将保持不变。

我在网上看到一些例子,在这个函数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
}

【问题讨论】:

标签: c# unity3d multiplayer photon


【解决方案1】:

来自光子文档:

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
    }
}

【讨论】:

  • 您好,谢谢您的回答!但是覆盖函数OnJoinedRoom没有接收到任何参数,所以这不起作用。
  • 但是我理解你的意思,我用最终版本编辑了我的帖子。非常感谢!
  • @Tenzolinho 哦,我的错。只需使用PhotonNetwork.LocalPlayer 来获取对您自己的引用。如果那是您正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多