【Unity】Vector2.SignedAngle和Vector2.Angle

目录

  • [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;