大家好,我在 Unity 中开发了一套程序化的节点地图系统,想与大家分享如何解决 DAGs(有向无环图)中经典的“交叉路径”问题。目标是让它 100% 确定性(使用 “123” 的种子在 PC 或移动设备上始终生成相同的地图),同时确保线条不变成一团乱麻。

我的方法:

  1. 分层网格分配: 不再使用纯随机 X/Y, 而是将节点分配到严格的行中,但应用了一个基于 FNV-1a 散列的确定性 Vector2 jitter。
  2. 连接规则: 3 阶段路由。第一阶段保证每个节点向上移动。第二阶段保证每个节点都接收到路径。第三阶段添加 50% 的随机分支,但数学检查 (srcA < srcB && dstA > dstB) 来防止线条交叉。
  3. UI 渲染: 为了让它看起来好, 我放弃了 3D LineRenderers,写了一个自定义的 MaskableGraphic 来绘制 Cubic Bezier 曲线原生地在 Canvas 上。经过了很多试错,我最终清理了架构(添加零 GC 池化)并将其打包为 Unity Asset Store 的工具。如果有任何人正在构建一个牌组建造师或一个迷你游戏,并且想跳过 UI/数学头疼,我刚刚在这里发布了它(https://assetstore.unity.com/packages/slug/369136)。我很乐意与大家讨论图形数学或分享一些逻辑,如果有任何人正在与类似的进度系统打架!