如何更改 Photon 中特定播放器的设置?

Posted

技术标签:

【中文标题】如何更改 Photon 中特定播放器的设置?【英文标题】:How to change settings for a specific player in Photon? 【发布时间】:2021-08-18 07:03:07 【问题描述】:

我正在制作一个简单的 Word Builder 类型的游戏(其中一个玩家输入一个单词,另一个玩家输入一个以第一个玩家单词的最后一个字母开头的单词),我正在努力做到这一点MasterClient 通过输入第一个单词开始游戏,然后他的 InputField 被禁用,第二个玩家的 InputField 被启用,他输入一个单词,反之亦然。

我尝试了多种方法,所有这些方法都来自我对 Unity 和 C# 的基本知识。例如,我认为肯定会起作用,但没有。

    public void ChangeTurn ()
    
        if (photonView.IsMine)
        
            inputField.enabled = false;
        
        else
        
            inputField.enabled = true;
        
    

简而言之,有没有办法做类似PhotonNetwork.PlayerList[0].inputField.enabled = false; 的事情?请告诉我是否有办法解决这个问题?我将永远感激不尽。

【问题讨论】:

这可能会给你一些方向,link 【参考方案1】:

您可以存储当前活动的Player.ActorNumber,并在主服务器上使用Player.GetNextFor

获取玩家的下一个玩家,按 ActorNumber (Player.ID) 排序。环绕。

当你把东西传给下一个玩家时很有用。例如:将回合传给下一位玩家。

比如

private int currentID;

...
    currentID = Player.GetNextFor(currentID).ActorNumber;
...

然后将其传输给每个人,例如通过RPC

...
    photonView.RPC(nameof(ChangeTurn), RpcTarget.All, currentID);
...

// This will be executed on all clients
[PunRPC]
private void ChangeTurn(int newID)

    // Simply check if the given newID matches your own ActorNumber
    inputField.enabled = PhotonNetwork.LocalPlayer.ActorNumber == newID;

所以大家在一起,例如像

// Store the ID of the currently active player
private int currentID;

// This is what a client has to call when he is done with his turn
private void EndTurn()

    // Tell only the masterClient that we are done
    // and he shall change the turn to the next player
   photonView.RPC(nameof(ChangeTurnOnMaster), RpcTarget.MasterClient);


// This will be executed on the MasterClient
[PunRPC]
private void ChangeTurnOnMaster()

    // Just to be really sure this is only done on the master client
    if(!PhotoNetwork.isMasterClient) return;

    // Get the next actor number
    // This wraps around so after reaching the last player it will again start with the first one
    currentID = Player.GetNextFor(currentID).ActorNumber;

    // Tell everyone the new active player ID
    photonView.RPC(nameof(ChangeTurn), RpcTarget.All, currentID);


// This will be executed on all clients
[PunRPC]
private void ChangeTurn(int newID)

    // Just in case let everyone store the active ID
    // this way you can also handle other things based on the ID later
    // And also deal with the case that the masterClient switches for some reason
    currentID = newID;

    // Simply check if the given newID matches your own ActorNumber
    inputField.enabled = PhotonNetwork.LocalPlayer.ActorNumber == newID;

【讨论】:

我已经尝试了几个小时,但我似乎无法让它工作,您能否在另一个答案中详细说明? @JamalH.A 添加了一些 cmets 和更完整的示例代码 .. 希望现在更清楚 ;) 做到了!太感谢了!最近几天回复我的帖子,你真的教会了我很多东西。另外,imgur.com/a/cPJcG6O

以上是关于如何更改 Photon 中特定播放器的设置?的主要内容,如果未能解决你的问题,请参考以下文章

从Particle Photon触发Android上的音频

如何使用 Youtube API 访问特定播放列表中的所有视频?

依次播放多个音频片段

在 vue 中构建音频播放器;如何在更改绑定后开始播放音频:src?

在 OSX 上更改 AVAudioPlayer 的输出设备

如何在 Swift 5 中使用 AV 音频播放器在特定时间间隔内快进或快退音频(如歌曲)?