如何在不增加延迟的情况下在Unity中创建更大的世界/级别?

时间:2015-08-21 18:31:07

标签: unity3d random size lag large-data

如何扩大我的世界/等级的大小以包含更多游戏对象而不会给玩家造成延迟?

我正在为资产商店创建资产。它是一个随机的程序世界生成器。只有一个主要问题:世界规模。

我无法弄清楚如何扩大世界以获得更多的物体/瓷砖。

  • 我已经生成了高达2000x500瓦片的世界,但是它非常严重。
  • 不会影响游戏速度的最大尺寸世界是 大约500x200瓦。
  • 我用较小的块生成了相同大小的世界:1/4大小(它不会影响你可以生成多少个图块)

我想创建一个至少大小为4200x1200块的世界,没有滞后峰值。

  • 我看过对象池(它似乎不能帮助我 那么多)
  • 我看过LoadLevelAsync(我真的不知道如何使用它, 并且传闻你需要Unity Pro,我没有)
  • 我尝试根据播放器设置块有效或无效 位置(这导致比仅仅留下块更多的滞后)。

其他信息: 地形被分成几个块。它是2d,我在所有实心瓷砖/块上都有盒子对撞机。玩家可以挖掘/放置积木。我并不担心最初加载关卡所花费的时间,而是玩游戏时游戏的流畅程度 - 玩游戏时不会出现高峰。

question on Unity Forums

1 个答案:

答案 0 :(得分:1)

如果您将每个磁贴存储为单个GameObject,请不要这样做。使用纹理图集和“数据”数据'无论何时挖出或放置瓷砖,都要生成每个块的外观。

还要确保禁用,甚至可能删除不在播放器可见范围内的任何块。如果您可以计算出一次需要的最大块数,那么对象池将在这里有很大的帮助,只需在它们离开屏幕时回收块。

详情:

关于最佳生成有很多话题,所以我将发布此链接(http://studentgamedev.blogspot.co.uk/2013/08/unity-voxel-tutorial-part-1-generating.html)它向您展示如何在3D空间中进行,但原则基本上是如果不是更容易2D空间相同。以下只是概述可能涉及的内容,沿着这条路走下去将带来巨大的好处,但需要大量的工作才能实现。我在答案的最后部分包含了所有好处。

每个图块都可以构成一个简单的结构,其中包含int idvector2d texturePosbool visible等字段,这是最简单的形式。然后,您可以将这些切片存储在每个块中的二维数组中,但为了使它们更加节省内存,您可以将texturePos存储在程序的其他位置,并编写一个方法来获取texturePos id

当您对表示添加或删除图块的2维数组进行更改时,您将更新块,这是用于表示图块的实际GameObject。通过迭代存储在块中的瓦片数据,将有可能基于二维阵列中的每个瓦片的位置生成顶点网格。如果visible为假,则不要为其生成任何顶点。

这个网格本身可以用作对撞机,但不会像任何东西。还需要生成恰好是texturePos的UV协议。当Unity显示网格时,它将显示纹理图集的特定点,由网格的UV co-ords定义。

这样做的好处是可以显着减少游戏对象,为Unity提供更好的纹理批处理,更少的内存使用,更快的随机访问任何磁贴,因为它没有任何MonoBehavi开销,以及真正的大量额外好处。