【问题标题】:Unity large,dynamic tile mapunity 大型动态平铺地图
【发布时间】:2017-02-19 23:10:17
【问题描述】:

我正在考虑制作城市交通模拟游戏,基于类似 simcity 的瓷砖地图。因为交通是主要组成部分,所以我不会详细描述城市,比如画所有的建筑物或其他。但我需要将城市划分为区和村。

我希望它们是随机生成的,基于瓦片地图系统 - 实际上这不一定是基于瓦片的,但我没有更好的主意来生成随机划分的区域。

问题是字面上有很多瓷砖。当然我不会把所有的瓦片都做成GameObjects,但是存储瓦片信息的数组就变成了4000x3000(对于1200万个瓦片)。没事吧?我认为这会严重拖慢游戏速度。

我搜索了很多生成平铺地图的方法,但这些平铺地图是用于 RPG 的。​​它们只是精灵和背景。

我的图块应该是动态变化的(可能是颜色,我正在用 3d 制作游戏,所以图块的高度可能会改变),并显示该图块的状态(城市的一个小区域)。什么方法可以更好地满足我的需求?

谢谢!

【问题讨论】:

  • 想想一个 4000x3000 像素的图像文件,也许会发现它们是如何处理这么多数据的?
  • 嗨用户,你不能在这里问。这是针对代码问题的。访问 gamedev.com,您将在数小时内得到很好的答案。
  • 嗨@Catwood。那是完全不相关的。 Unity3D(显然)拥有与基于瓷砖的游戏相关的整个系统和资产;它是一个游戏引擎。

标签: unity3d unity5


【解决方案1】:

简短的回答是您应该生成一个网格来表示您的图块。这将允许您将大量图块表示为单个游戏对象。

这并不像听起来那么麻烦。实际上,我最近自己也经历了这一点,并编写了一份关于如何做到这一点的分步指南,以及如何解决我在使用瓷砖时遇到的许多其他问题:

http://matthewlynch.net/2017/02/19/efficient-artefact-free-2d-tile-mapping-in-unity-5-5/

我要提到的唯一警告(本教程中对此进行了讨论,但没有直接解决)是您仍然应该以某种方式划分地图。

我不建议在单个网格中超过 100x100 的图块,事实上我建议将其进一步分解。但是一旦你掌握了 tile->mesh 渲染的基础知识并开始运行,这并不难。

【讨论】:

  • 你们真的需要了解和使用遮挡剔除,这是使用 3D 引擎的主要和核心部分。 (当然,遮挡剔除完全内置于 Unity 中;它们拥有一流的、行业领先的遮挡剔除)。
  • 遮挡剔除是将瓷砖渲染为网格的有力论据。 Unity(以及它下面的图形引擎)将剔除不可见的对象甚至顶点,但这只是图片的一部分。维护树中的 Unity 游戏对象仍然存在开销。即使您禁用树中的游戏对象,仍然存在开销。很容易看到。将 10,000 个精灵(作为单独的游戏对象)放入 Unity 场景中并查看性能。它直线下降。即使只有几百个可见。
  • 遮挡剔除也是我不建议创建 100x100 平铺网格的原因,而是将其分解为更合理的部分,代表屏幕上可以容纳多少平铺。与遮挡剔除算法一样先进,如果可以通过简单的位置检查来排除整个对象,它总是更快、更有效。
  • 对,这很平常:假设您建造了一个大型赛车场。这是 SOP,您必须将其分解成块,因此您的遮挡剔除有效。所涉及的工程正在计算运行的块大小。 (“通过简单的位置检查排除”-您不必这样做;OC比我们更好。它以数学上最佳的方式作为第一遍。)
  • 没错。对不起,我应该更清楚。我并不是建议手动位置检查来禁用。只是通过将其分解为更易于管理的块,内置的 OC 会更轻松。
猜你喜欢
  • 2014-09-05
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2011-06-26
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多