目录
- [1. Vector2.Angle](#1. Vector2.Angle)
- [2. Vector2.SignedAngle](#2. Vector2.SignedAngle)
- [3. 核心区别总结](#3. 核心区别总结)
- [4. 注意事项](#4. 注意事项)
- [5. 常见误区](#5. 常见误区)
在 Unity 中,Vector2.SignedAngle 和 Vector2.Angle 都是用于计算两个向量之间夹角的静态方法,但它们的返回值范围和方向性有本质区别。
1. Vector2.Angle
作用:计算两个向量之间的最小夹角(无符号)。
返回值:float,范围 0° 到 180°(始终为正值)。
特点:只关心角度大小,不关心旋转方向(顺时针/逆时针)。
csharp
Vector2 from = new Vector2(1, 0);
Vector2 to = new Vector2(0, 1);
float angle = Vector2.Angle(from, to); // 结果是 90°
2. Vector2.SignedAngle
作用:计算从 from 向量旋转到 to 向量的有符号夹角。
返回值:float,范围 -180° 到 180°(负值表示顺时针旋转)。
特点:包含方向信息,在 2D 中通常用顺时针为负、逆时针为正(因为 Unity 使用左手坐标系,Z 轴朝屏幕内)。
csharp
Vector2 from = new Vector2(1, 0);
Vector2 to = new Vector2(0, 1);
float signedAngle = Vector2.SignedAngle(from, to); // 结果是 90°(逆时针)
to = new Vector2(0, -1);
signedAngle = Vector2.SignedAngle(from, to); // 结果是 -90°(顺时针)
3. 核心区别总结
| 特性 | Vector2.Angle | Vector2.SignedAngle |
|---|---|---|
| 返回值范围 | 0° ~ 180° | -180° ~ 180° |
| 是否带方向 | 否(始终正值) | 是(正/负表示方向) |
| 应用场景 | 只需角度大小(如 UI 元素间的距离感) | 需要旋转方向(如转向目标、角度差判断) |
4. 注意事项
如果传入的向量为零向量,两个方法都会返回 0(Unity 不会报错,但结果无意义)。
两者的计算都基于点积和叉积(SignedAngle 通过叉积的 Z 分量判断方向)。
5. 常见误区
误区:认为 SignedAngle 就是 Angle 加上正负号。
正解:SignedAngle 直接计算有符号值,而 Angle 只返回绝对值。两者在大于 180° 时的表现不同(SignedAngle 会折叠到 -180~180 范围,Angle 始终返回锐角或钝角)。
如果你需要计算任意角度(0~360°),可以这样处理:
csharp
float angle360 = (Vector2.SignedAngle(from, to) + 360) % 360;