如何生成一个随机数并确保在 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 的每个人都相同?的主要内容,如果未能解决你的问题,请参考以下文章