unity 地图画格_[蛮牛译馆]UnityC#教程—六边形地图系列之创建网格(中)

本文介绍如何在Unity中创建六边形地图网格,包括移除单元格预设中的额外组件,使用列表动态管理顶点和三角形,以及处理六边形坐标系统的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原标题:[蛮牛译馆]UnityC#教程—六边形地图系列之创建网格(中)

书接上回

3. 渲染六边形

单元格都正确摆放了,我们可以开始着手陈列真正的六边形了。我们首先必须摆脱那些plane,所以从单元格prefab里移除除HexCell外的所有组件。

就像Mesh Basics教程中一样,我们使用一个简单的mesh来渲染整个网格。不过,这次我们不会预先决定有多少个顶点和三角形。取而代之,我们使用列表。

创建一个新的HexMesh组件来管理我们的mesh。它需要一个mesh过滤器和渲染器,有一个mesh,并有存有其顶点和三角形的列表。

为我们的网格创建一个带有该组件的字物体对象。它将自动获取一个mesh渲染器,但不会被分配材质。所以添加一个默认材质。

HexGrid如何找回它的hexmesh,就同它找到自己的画布一样。

网格被唤醒后,必须高速mesh来三角化它的单元格。我们必须事先确定hex mesh组件也已经被唤醒。犹豫Start稍后会被唤醒,所以写在它里面。

这个HexMesh.Triangulate方法将可在任何时刻被调用,甚至当单元格已经被三角化后。所以我们应该清理旧数据。然后在所有单元格循环,分别将其三角化。这之后,将产生的顶点和三角形注册到mesh中,以重新计算mesh发现来结束。

由于六边形是有三角形构成的,让我们创建一个简便的方法来添加一个三角形,给予三个顶点坐标。它简单地按顺序加上了顶点,同时还添加了这些顶点的指数来组成一个三角形。第一个顶点的指数等于定点列表在加入新顶点前的长度。所以在添加前记下它。

现在我们可以三角化单元格了。先从第一个三角形着手。它的第一个顶点是六边形的中心。另两个顶点是第一和第二个叫,与其中心关联。

成功了,那么循环六个三角形。

不能共享顶点吗?

不幸的是,产生了一个IndexOutOfRangeException。这是由于最后一个三角形试着去取第七个角,那个不存在的角。当然,它应该回卷去使用第一个角。或者,我们可以在HexMetrics.corners中复制第一个角,那样我们就不需要担心这个问题了。

六边形的坐标

再在六边形网格环境下看看单元格坐标。Z坐标显示正常,但是X坐标是曲折的。这是一种使我们的行偏移来覆盖矩形区域的副作用。

这些偏移坐标在与六边形相关时并不好处理。添加一个HexCoordinates结构,我们可以用它来转换成一个不同的坐标系统。将其序列化以使Unity能够储存它,从而允许他们在play mode中存活。同样,使用public只读属性使它们不可变。

添加一个静态方法来创建一系列使用常规便宜坐标的坐标。就现在,先逐字复制这些坐标好了。

同样添加方便的字符串转换方法。默认ToString方法会返回结构类型名,并不实用。覆写并在一行里返回坐标。同时添加一个方法来将不同坐标置于不同的行,因为我们已经在使用这样一种布局了。

现在我们可以为我们的HexCell组件添加一系列的坐标了。

矫正HexGrid.CreateCel来使它从新坐标中受益。

现在来解决X坐标的问题,使它们沿一条直的轴对齐。我们可以通过取消水平位移来做到。结果就是典型的轴向坐标。

这个二维坐标系统然我们用四个方向来描述运动和偏移。尽管如此,剩下的两个方向还需特殊处理。这显示出还有第三个维度。确实,如果我们水平翻转X唯独,我们就得到了消失的Y维度。

由于X和Y维度互为镜像,Z维度恒定的情况下一起添加它们的坐标总会产生相同的结果。事实上,如果你一起添加三个维度的坐标将会得到0。如果增加一个坐标,你将必须增加另一个。确实,这产生了6个可能的运动方向。这些坐标是立方体坐标,有由于它们是三维的,且拓扑学上也像一个立方体。

由于所有坐标叠加后为零,你总是可以通过另两维坐标导出剩下的一个由于我们总是存储X和Z坐标,那么我们就不需要再存储Y坐标了。我们可以囊括一个使用字符串方法能够将其推导出的属性。

监视器里的坐标

在play mode选中一个单元格。由于它显示,inspector不会显示它的坐标。只有HexCell.coordinates的前端标签被展示。

不过这不太重要,只是在坐标被显示时会显得更整齐。Unity通常不显示坐标是因为它们没被标记为序列化域。实现它,我们必须为X和Z明确定义序列化域。

X和Z坐标现在已被显示了,但是它们是可编辑的,而这是我们不需要的,因为坐标应该恒定。而且它们重叠着显示也是不太美观的。

我们可以通过为HexCoordinates类定义一个自定义属性来更好实现。创建一个HexCoordinatesDrawer脚本,将其置于Editor文件夹内作为仅供编辑器使用的脚本。

此类应该继承UnityEditor.PropertyDrawer并且需要UnityEditor.CustomPropertyDrawer属性来使它与正确的类关联。

Propertydrawer通过OnGUI方法渲染它们的内容。这一方法用提供屏幕矩形区域绘制,序列化数据和它属于的区域的标签。

从属性中提取x和z值并使用它们新的一系列的坐标。然后在特定位置绘制GUI标签,使用我们的HexCoordinates.ToString方法。

这显示了我们的坐标,但是现在字段名字不见了。这些名字通常由EditorGUI.PrefixLabel方法绘制。作为附加,它会返回一个与调整后的矩形,它与标签右侧对齐。

拓展阅读: UnityC#教程—六边形地图系列之创建网格(上)返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值