在我们的roguelite游戏《Tile Crawl》中,我们希望元进度系统能与众不同,于是将其设计成一颗可供探索的星球。但我们的闯关地图本身已经采用了六边形网格,为了保持一致性,我们同样希望这颗星球也由六边形构成。我们不想使用五边形,而是试图用等大的六边形实现全覆盖(尽管这在几何上不可能)。
那么具体如何实现呢?
实际上,这是一个放置了物体的平面。然后,根据摄像机位置,在着色器中重新计算顶点(所有物体必须共享相同的弯曲子图或着色器代码,并使用相同的参数值,以保证视觉一致性)。据我所知,这种技术也用于《动物森友会》,只是没有调得这么夸张。
好,这样我们就得到了一个弯曲后看起来像球体的平面。下一个挑战是让它能够正常旋转;实现方式是在摄像机保持静止的情况下,仅让平面在X轴和Y轴上移动。为了实现平面的循环,我额外生成了8个平面,每个平面都复制了物体,然后在跨越边界时进行传送(这部分肯定可以通过一些顶点魔法或减少克隆数量来做得更好)。
下一个挑战是阴影问题——顶点被重新计算了,但法线没有更新;要计算新的法线,需要获取顶点的两个相邻点,用相同的逻辑进行弯曲,并用结果计算新法线。这样甚至能让上方的云朵正确投下阴影。
最后要处理的是点击地图上的节点。由于物体的实际位置与视觉位置完全不同,直接用鼠标射线投射是行不通的。所以我用一个大型球体碰撞器检测鼠标在球面上的位置,然后反向计算它在平面上的对应位置,再找到半径内最近的节点。
还有一些工作尚未完成(特效支持很差,平面边缘的水波也存在一些伪影)。但在我看来,效果已经相当不错且足够独特了。
以上所有实现都是在Unity3D中完成的,但我相信同样的思路在任何引擎中都能奏效。
感谢阅读!如果你喜欢所看到的内容,不妨将《Tile Crawl》加入Steam愿望单!
评论 (0)