如何扩大我的世界/等级的大小以包含更多游戏对象而不会给玩家造成延迟?
我正在为资产商店创建资产。它是一个随机的程序世界生成器。只有一个主要问题:世界规模。
我无法弄清楚如何扩大世界以获得更多的物体/瓷砖。
我想创建一个至少大小为4200x1200块的世界,没有滞后峰值。
其他信息: 地形被分成几个块。它是2d,我在所有实心瓷砖/块上都有盒子对撞机。玩家可以挖掘/放置积木。我并不担心最初加载关卡所花费的时间,而是玩游戏时游戏的流畅程度 - 玩游戏时不会出现高峰。
答案 0 :(得分:1)
如果您将每个磁贴存储为单个GameObject,请不要这样做。使用纹理图集和“数据”数据'无论何时挖出或放置瓷砖,都要生成每个块的外观。
还要确保禁用,甚至可能删除不在播放器可见范围内的任何块。如果您可以计算出一次需要的最大块数,那么对象池将在这里有很大的帮助,只需在它们离开屏幕时回收块。
详情:
关于最佳生成有很多话题,所以我将发布此链接(http://studentgamedev.blogspot.co.uk/2013/08/unity-voxel-tutorial-part-1-generating.html)它向您展示如何在3D空间中进行,但原则基本上是如果不是更容易2D空间相同。以下只是概述可能涉及的内容,沿着这条路走下去将带来巨大的好处,但需要大量的工作才能实现。我在答案的最后部分包含了所有好处。
每个图块都可以构成一个简单的结构,其中包含int id
,vector2d texturePos
,bool visible
等字段,这是最简单的形式。然后,您可以将这些切片存储在每个块中的二维数组中,但为了使它们更加节省内存,您可以将texturePos
存储在程序的其他位置,并编写一个方法来获取texturePos
id
。
当您对表示添加或删除图块的2维数组进行更改时,您将更新块,这是用于表示图块的实际GameObject。通过迭代存储在块中的瓦片数据,将有可能基于二维阵列中的每个瓦片的位置生成顶点网格。如果visible
为假,则不要为其生成任何顶点。
这个网格本身可以用作对撞机,但不会像任何东西。还需要生成恰好是texturePos
的UV协议。当Unity显示网格时,它将显示纹理图集的特定点,由网格的UV co-ords定义。
这样做的好处是可以显着减少游戏对象,为Unity提供更好的纹理批处理,更少的内存使用,更快的随机访问任何磁贴,因为它没有任何MonoBehavi开销,以及真正的大量额外好处。