Unity中3D方向等距判定的实现方案咨询
Unity中3D方向等距判定的实现方案咨询
我现在用Unity(C#)做一个方向对比系统,先给个简化的方向列表示例:
{Up, {0,1,0}}, {UpRight, {1,1,0}}, {UpRightForward, {1,1,1}}, {Right, {1,0,0}}, {Down, {0,-1,0}}
我的需求是让某些方向间的“距离”相等:比如从Up到UpRight,和Up到UpRightForward的步长应该一致。但用常规的角度计算的话,前者是45度,后者约54.7度,UpRight到UpRightForward又只有约35.3度——我知道这是正常的数学结果,但业务上我需要这些相邻方向的步长完全相等。
最开始我做了一个基于轴步进的系统,用下面的代码让每个“相邻”方向的步长为1:
float GetAxisDistance(Vector3 direction, Vector3 targetDirection) { direction = AxisNormalise(direction); targetDirection = AxisNormalise(targetDirection); return Mathf.Abs(direction.x - targetDirection.x) + Mathf.Abs(direction.y - targetDirection.y) + Mathf.Abs(direction.z - targetDirection.z); } Vector3 AxisNormalise(Vector3 direction) { if (direction == Vector3.zero) return Vector3.zero; return direction / Mathf.Max(Mathf.Abs(direction.x), Mathf.Abs(direction.y), Mathf.Abs(direction.z)); }
这个方案大部分情况能用,但还有两个我不满意的问题:
- Up到UpRightForward的距离算出来是2步,但我需要它是1步
- Up到Down的距离算出来是2步,但我需要它是4步
我现在在研究用相邻方向寻路的思路重构系统——比如从Up到Down需要走相邻方向的最短路径,最终得到4步的结果,但具体的数学逻辑还没完全理清楚。
有没有大佬能给点建议或者帮助?我完全可以调整方向的定义方式(毕竟我也知道{0,1,0}的长度和{1,1,0}不一样)。
备注:内容来源于stack exchange,提问作者Lord Flumph
相关产品推荐
相关产品推荐

