Minecrafttypes游戏支持块

好的,从某种意义上说,我有一个类似于“我的世界”的游戏。 玩家可以逐块建立城堡。 我正在为我的游戏使用Unity3D和Photon Network,我想知道如果块有一个支持系统,我将如何处理检测。 这是有问题的游戏。 让我知道除了使用刚体我已经尝试过这样做了一些解决scheme,它有一个严重的networking性能问题。 谢谢

Youtube的游戏video

你为什么不实施一个孩子的父母系统? 如果块放置在相同types的块或支持的连接块旁边,则将新块作为子项添加。 这样它保持了父块相对的数据。 然后你可以删除那个孩子,如果说它被摧毁,并添加物理支持,所以你可以看到被毁坏的孩子块的孩子会发生什么。

我要做的是find每个块的邻居(除了上面的)。 然后,对于它的每一个邻居,find那块邻居。 然后,对于每个邻居,find下一个邻居,等等等等。最终你会发现所有连接的邻居都在一个父子架构树,比如user3667971提到。 如果有任何这些块连接到地面,那么你有支持。

请注意,如果你每帧都在做这个,那么效率很低。 我只会为每个块生成一次邻居列表,而user3667971的想法就是把它作为一个子树来创建一棵树,然后find整个树的父亲来testing地面。

你可以做一个部分更新你的世界。 每当你从你的世界放置/移除一个块,检查所有相邻的块。


如果你 BA顶部放置一个块A ,那么你检查A周围A所有边。 如果任何一个块(例如B )在正下方,一个在下面或者直接相邻(如果你想支持的话),然后放置块,它将会rest。 如果没有支持,它将开始下降。

 Checks required in pseudocode (No direct side-support, you'll figure it) function blockPhysics() List<Block> toUpdate = new List<Block>(); boolean isFalling = true; foreach( Block B near A ) //which is not falling at the moment if (Ay-1 == By && Math.abs(Ax - Bx) <= 1) //have block stay at position isFalling = false; else //remember B so we can tell him we are gone toUpdate.add( B ); end end if( isFalling ) //trigger our fall and handle it FIRST! fallDown(); //Your job to implement. You probably simply want to set a flag named canSupportOtherBlocks. //Then have every surrounding block do his own physic calculations. foreach( Block B in toUpdate ) B.blockPhysics(); end end end 

如果从块A下面删除B ,则从所有周围块中触发块物理。

 function remove() //we have to remove B first, otherwise this would disturb the Physics removeSelf(); foreach ( Block A near B ) A.blockPhysics(); end end 

这将触发B周围的任何块A再次检查它的支持。 这可能会触发一连串的积木下降。 但是,如果你建立一个倒金字塔并删除支持,你还期望什么呢?