大家好,我正在开发一个类似PS1风格的回归型rogue-like游戏。基本上,它是Megabonk的 Melee 战斗和办公室设置。其中一个BOSS是一种巨大的3D光标。它的标志性攻击是拖拽经典的Windows蓝色选择框在地面上来捕获玩家。以下是快速技术分解如何处理在斜坡上扩展的区域而不会使CPU过载。
问题: 如果您尝试在拖拽时每帧缩放BoxCollider并尝试匹配不均匀的地面,PhysX引擎会讨厌您。您冒着被裁剪、错过OnTriggerStay调用和不必要的CPU负载来检查玩家是否在内部的风险。另外,制作UI样式的边框在3D网格上看起来很烦人。
解决方案:
1.Hit检测(纯数学, 无碰撞体) 我完全绕过了物理引擎来处理陷阱逻辑。由于盒子本质上是一种投影到3D平面的2D矩形,我只使用轴对齐的边界盒数学。当BOSS释放左键时,我计算玩家的位置和区域中心之间的差值:Vector3 diff = playerTransform.position - zoneCenterPosition; if (Mathf.Abs(diff.x) <= halfWidth && Mathf.Abs(diff.z) <= halfLength) { // 玩家被选中 } 结果:O(1)CPU成本。无需进行射线检测或盒子检测来进行碰撞检测。
2.动态中心 & 斜坡对齐 光标不从角拉动四边形。每帧在拖拽期间,中心点被重新计算为(锚点+光标位置)/ 2。为了使其完美地贴合不均匀的地面,我从中心点发射一个向下射线,抓住hit.normal并对齐四边形:transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * Quaternion.Euler(90f, 0f, 0f);
3.视觉效果(URP着色器) 绘制一致的白色边框在不断变化的尺寸的四边形(例如,2x10到30x30)通常会拉伸纹理。 我编写了一个自定义URP无纹理着色器,它使用step()函数基于UV计算边框。无需纹理,零拉伸,完全由GPU驱动。 float2 edge = step(i.uv, _BorderWidth) + step(1.0 - _BorderWidth, i.uv); float isBorder = saturate(edge.x + edge.y); half4 color = lerp(_BaseColor, _BorderColor, isBorder);
4.AI(预测拖拽) 如果BOSS只点击玩家当前位置,您就可以走出它。因此,BOSS计算你的速度向量(pos2 - pos1)/ Time,将锚点放在你的当前运动轨迹后面,并强制地拖拽光标到1.5秒后你预测的点。您被迫冲刺来逃脱。
评论 (0)