【问题标题】:Grid/Block Terrain GameObject网格/块地形游戏对象
【发布时间】:2020-04-15 17:55:05
【问题描述】:

我正在尝试学习 Unity,但作为一名专业开发人员,我在 C# 方面拥有丰富的经验,所以这个问题完全是关于如何在 Unity 中表示模型。

我正在尝试构建一个具有更细粒度高度的基于块的地形,我的模型看起来像这样:

[
    {
        "x":0,
        "y":0.2,
        "z":0,
        "type": "grass"
    },
    {
        "x":1,
        "y":0.3,
        "z":0,
        "type": "grass"
    },
    {
        "x":0,
        "y":0.1,
        "z":1,
        "type": "stone"
    },
    {
        "x":1,
        "y":0.4,
        "z":1,
        "type": "stone"
    }
]

我看到了 2 个选项:

  1. 为每个块创建一个立方体。
  2. 从上方观察时,为组合在一起的所有块的暴露表面构建网格。

1 似乎很容易做到,但可能很慢,而 2 似乎是更好的方法,但我不知道如何为每个块应用不同的纹理。

【问题讨论】:

    标签: c# unity3d gameobject


    【解决方案1】:

    根据您是在制作某种 Minecraft 世界还是只是一个简单的体素地形,您可以有不同的解决方案。

    一个简单的解决方案是使用四边形而不是立方体: 一个立方体由 6 个四边形组成,您可以为然后暴露的表面创建每个四边形,而不是创建每个立方体,这样可以保持性能,并且如果是简单的地形,则易于实现。

    如果您想要像 Minecraft 那样更复杂的结构,您可以实现更复杂的算法,以优化的方式创建(和更新)每个多边形,例如 Greedy Meshing 算法。 Here 是一个 Unity 实现。

    您还可以查看 Unity 的 DOTS,其中实体组件系统承诺性能,同时拥有大量对象。

    example video 使用 Unity DOTS + Greedy Meshing 的外观。

    编辑

    我刚刚找到了一个使用 Unity 的 DOTS 创建 Minecraft 风格世界的 GitHub 存储库:

    Voxel Game Prototype in Unity ECS

    【讨论】:

    • 那么为每个暴露的边创建一个四边形并为其应用纹理?这与为每个块创建立方体是否存在相同的问题,但由于额外的游戏对象而更是如此?
    • 它的多边形较少,所以可能是另一回事。但是,是的,它不是最好的解决方案。因此,如果您有更复杂的结构,请检查贪婪网格算法或实体组件系统,两者都是更好的选择。
    • 快速浏览了 DOTS,看起来像是一个重大的变化,所以在我深入研究之前需要花时间阅读文档/观看教程。假设我使用它,几个具有四边形的实体是否大致具有与具有相同多边形数量的单个网格的性能相同?
    • DOTS 这确实是一个重大的变化,但取决于项目是否值得。关于您的问题,我不是 100% 确定,但我认为具有四边形的多个实体将比具有相同数量多边形的单个网格具有更好的性能。因为它们共享相同的网格数据。但同样,我不能完全确定,遗憾的是我不是 DOTS 专家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2022-11-14
    相关资源
    最近更新 更多