如何生成一个随机数,并确保它对Unity中使用光子的每个人都是一样的



嗨,伙计们,我正在使用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内部的条件之外,但都不起作用。

如果有人能帮忙,那就太好了。顺便说一下,这个数独游戏是购买的,我正试图将其转换为多人游戏

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

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

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

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确保稍后加入的客户端也将接收到呼叫
  • 如果不首先接收随机值,就不可能开始游戏

最新更新