Vector2.Angle 的 bug
获取角度 ,官方提供了 Vector2.Angle 来得值,他的值是在 0 ,180之间
原始代码是
1 2 3 4 | public static float Angle(Vector3 from , Vector3 to) { return Mathf.Acos(Mathf.Clamp(Vector3.Dot( from .normalized, to.normalized), -1f, 1f)) * 57.29578f; } |
注意最后一个是 180/ 3.1415926... = 57.29578f;正常角度是 360,所以我们可以先 做出 -180,180之间
你可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | float angle_180(Vector2 from , Vector2 to) { Vector3 v3; Vector3 v3_from = new Vector3( from .x, from .y, 1); Vector3 v3_to = new Vector3(to.x , to.y , 1); v3 = Vector3.Cross(v3_from, v3_to); if (v3.z > 0) { return Vector2.Angle( from , to); } else { return -Vector2.Angle( from , to); } } |
也可以这样写
1 2 3 4 5 6 7 8 | float VectorAngle(Vector2 from , Vector2 to) { float angle; Vector3 cross = Vector3.Cross( from , to); angle = Vector2.Angle( from , to); return cross.z > 0 ? -angle : angle; } |
0,360之间可以这样写
1 2 3 4 | if (angle < 0) { angle = 360 + angle; } |
但是,我今天要说的不是这些,这些百度都可以知道。
我说的是 Vector2.Angle 的 bug以上的操作,仅仅对于 起始点0,0 有效,如果起始点 其他坐标,那么 他将会有误差
那么我们改怎么做呢?
这样写,可以没有误差,注意 initPosition是目标坐标
1 2 3 4 | Vector2 v2 = (mousePosition - initPosition).normalized; float angle = Mathf.Atan2(v2.y, v2.x)*Mathf.Rad2Deg; if (angle < 0) angle = 360 + angle; |
参考老外聊天,这个问题也是我 发现后 google 找的。
http://answers.unity3d.com/questions/444414/get-angle-between-2-vector2s.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!