如何扩大我的世界/级别的大小以包含更多游戏对象,而又不会对玩家造成延迟?
我正在为资产商店创建资产。它是一个随机的程序世界生成器。只有一个主要问题:世界规模。
我不知道如何扩大世界以容纳更多物体/瓷砖。
约500x200的图块。
我想创建一个至少大小为4200x1200块的世界,而没有滞后峰值。
这么多)
谣言是您需要我没有的Unity Pro)
位置(这比仅留下障碍物造成更多的滞后)。
附加信息:
地形被分成几块。它是2d,并且我在所有实心砖/块上都有盒子对撞机。玩家可以挖掘/放置积木。我并不担心关卡最初加载所花费的时间,而是担心游戏进行时的流畅性-玩时不会出现延迟现象。
question on Unity Forums
最佳答案
如果要将每个图块存储为单独的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
的方法。
当您对表示添加或移除拼贴的二维数组进行更改时,将更新块,后者是用于表示拼贴的实际GameObject。通过迭代存储在块中的图块数据,将可能基于二维数组中每个图块的位置生成顶点网格。如果visible
为false,则完全不为其生成任何顶点。
单独使用此网格物体可以用作对撞机,但看起来不会像任何东西。还必须生成恰好是texturePos
的UV坐标。当Unity然后显示网格时,它将显示纹理图集的特定点,该特定点由网格的UV坐标定义。
这样做的好处是可以大大减少GameObject,减少Unity的纹理批处理,减少内存使用,对任何图块进行更快的随机访问,因为它没有任何MonoBehaviour开销,并且确实有很多额外的好处。
关于unity3d - 如何在Unity中创建更大的世界/关卡而不增加延迟?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32147152/