掷骰子的更好方法

时间:2017-04-10 17:33:08

标签: animation unity3d unity5

我有一款需要玩家掷骰子的游戏。由于这是一个多人游戏,我目前这样做的方式是有6个动画(每个模具的结果为1)。当玩家点击按钮时,它会向我的服务器代码发送请求。我的服务器代码确定了芯片的结果并将结果发送给客户端。然后客户端播放相应的动画。

这可行,但有一些问题。例如,如果服务器发回两个相同的值(例如,两个6),则动画无法正常工作。由于两个动画是相同的,它们相互叠加,看起来只有一个骰子被滚动。

有更好的方法吗?使用" real"而不是动画。骰子?如果是这样,我总是需要确保"预先确定"骰子滚动的结果,在服务器上。我还需要确保骰子不会从桌子上掉下来或者撞到棋盘上任何其他玩家的棋子。

感谢任何想法。

2 个答案:

答案 0 :(得分:0)

您可以在服务器上模拟物理,在动画持续时间内跟踪骰子的位置和方向,然后将数据发送到客户端。我理解它的大量数据非常简单,但这是让你能够在所有客户端之间显得真实和同步的一种方式。

如果只有Unity的物理学是确定性的,那将会更容易。

答案 1 :(得分:0)

服务器只需要关心值结果,而不是运行物理计算。

设置12种不同的滚动动画:

  • 第一次死亡六次
  • 第二次死亡六次

每个人应始终以相同的建模面向上结束(起始位置不相关,只有结束位置)。对于后面的步骤,您可能希望调整模型的UV坐标以使用非常高或非常宽的纹理(或仅仅是正方形的切片)。所以不是 like this,而是全部在1-2-3-4-5-6行。

下一步是选择一个随机动画播放。您已经拥有运行给定动画的代码,只需将其设置为随机选择,而不是基于服务器的die-roll-value:

int animNum = Mathf.Floor(Random.Next()*6);

最后,有趣的一点。调整纹理,以便在动画完成时显示所需面部。我假设你沿着方形纹理的上边缘排列你的面孔。 Material.SetTextureOffset()

int showFace = Mathf.Floor(Random.Next()*6); //this value should come from the server
die.renderer.material.SetTextureOffset(1f/6 * showFace,0);

这将设置纹理偏移,使得所需的面将显示在顶部。您甚至可以在检查员中看到它发生变化。因为UV的排列使得每个面都使用下一个块,并且因为纹理将在到达边缘时环绕(除非纹理在其导入设置中设置为Clamp:你不想在这里这样做。)< / p>

请注意,这将导致实例化一个新的材质实例(性能不是很高)。如果您想避免这种情况,则必须使用a material property block代替。