如何生成一个随机数并确保在 Unity 中使用 Photon 的每个人都相同?

Posted

技术标签:

【中文标题】如何生成一个随机数并确保在 Unity 中使用 Photon 的每个人都相同?【英文标题】:How to generate a random number and make sure it is the same for everyone using Photon in Unity? 【发布时间】:2021-07-20 12:02:13 【问题描述】:

大家好,我正在使用 Unity 中的 Photon 将单人 Sudoko 游戏转换为多人游戏(现在是 2 人)。

数独游戏的基本逻辑是里面已经加载了300个谜题数据。选取一个 1 到 300 之间的随机数并加载相应的谜题。

但我面临的问题是,即使我已确保为客户端和主服务器获取相同的号码,但正在加载不同的谜题。

所以基本上我的脚本称为 MultiManager 附加到数独屏幕中的 MultiManager 游戏对象。脚本看起来像这样。

void Start()
                  
            PV = GetComponent<PhotonView>();
            
            if (PhotonNetwork.IsMasterClient)
            
                puzzleIndex = Random.Range(0, 300);
                PV.RPC("RPC_PuzzleIndex", RpcTarget.Others, puzzleIndex);
                  

            gameManager = FindObjectOfType(typeof(GameManager)) as GameManager;
            gameManager.PlayNewGame("easy");
        
 [PunRPC]
        void RPC_PuzzleIndex(int puzzleIndexNUmber)
        
            puzzleIndex = puzzleIndexNUmber;
        

所以在 GameManager 脚本中你有这些功能:

public void PlayNewGame(string groupId)
        
            // Get the PuzzleGroupData for the given groupId
            for (int i = 0; i < puzzleGroups.Count; i++)
            
                PuzzleGroupData puzzleGroupData = puzzleGroups[i];

                if (groupId == puzzleGroupData.groupId)
                
                    PlayNewGame(puzzleGroupData);
                    
                    return;
                
            

            
        

private void PlayNewGame(PuzzleGroupData puzzleGroupData)
        
            // Get a puzzle that has not yet been played by the user
            PuzzleData puzzleData = puzzleGroupData.GetPuzzle();

            // Play the game using the new puzzle data
            PlayGame(puzzleData);
        

在 PuzzleGroupData 类中你有这个功能:

public PuzzleData GetPuzzle()
        
return new PuzzleData(puzzleFiles[MultiManager.puzzleIndex], shiftAmount, groupId);
        

我不太明白发生了什么问题。我尝试使用其他变体,例如将随机数保持在 PhotonNetwork.isMasterClient 内部的条件之外,但不起作用。

如果有人可以提供帮助,那就太好了。顺便说一句,这个数独游戏是购买的,我正在尝试将其转换为多人游戏

【问题讨论】:

在我的情况下,我所做的是我从设备上本地创建了号码并将该号码发送到 Photon 的事件并接收到其他设备。 @Ankit 不正是 OP 试图做的吗?随机数在 Master 上生成并发送给其余用户 @derHugo 和 Chethan 你是对的,我为粗鲁的行为道歉。 【参考方案1】:

由于主人通常是房间里的第一个,所以第一个得到Start 的人也是我认为当RPC 被调用时你的其他客户端根本没有连接。

此外,还可能发生(实际上很可能)Start 在 RPC 有机会被接收之前被调用。

我宁愿等到你有价值后再做

void Start()
          
    PV = GetComponent<PhotonView>();
        
    if (PhotonNetwork.IsMasterClient)
    
        PV.RPC(name of(RPC_PuzzleIndex), RpcTarget.AllBuffered, Random.Range(0, 300));
    


[PunRPC]
void RPC_PuzzleIndex(int puzzleIndexNUmber)

    puzzleIndex = puzzleIndexNUmber;
    gameManager = FindObjectOfType(typeof(GameManager)) as GameManager;
    gameManager.PlayNewGame("easy");

这边

RpcTarget.AllBuffered 确保稍后加入的客户也会收到呼叫 如果不先收到随机值,就无法开始游戏

【讨论】:

我尝试使用它,但它不起作用。我认为的问题是,只要在主客户端上执行 start 方法,就会生成那里的随机数。但是在远程客户端上执行 start 方法的同时,它发现它不是主客户端,并且我可以反复看到 puzzleIndex=0 (这是默认值)相同的拼图正在加载远程客户端。远程客户端根本不等待 RPC 被调用 @ChethanVenkataramaiah 查看底部的更新。我认为这种方式更合适,不可能在收到价值之前就出现游戏明星;) 更新后的解决方案完美运行,非常感谢

以上是关于如何生成一个随机数并确保在 Unity 中使用 Photon 的每个人都相同?的主要内容,如果未能解决你的问题,请参考以下文章

求问一下 unity生成的项目如何在安卓运行? 谢谢

unity中怎么控制生成的prefab位置

Unity C# - 在一个点周围随机生成游戏对象

如何确保不重复随机生成的数字? [重复]

Unity3d在屏幕范围内随机生成一个圆

unity中怎么控制生成的prefab位置