概述(Overview)
MathExtensions 是一个轻量级的 数学与向量运算扩展方法 静态类,位于 PFGameFramework.Library 命名空间。
当前主要提供以下功能:
- 高精度四舍五入(使用 MidpointRounding.AwayFromZero 规则)
- Vector3 常用操作的简洁扩展方法(角度、归一化、线性插值)
这些方法旨在让代码更简洁、可读性更强,尤其适合在 Unity 项目中频繁使用的向量计算场景。
依赖:
- System(Math.Round)
- UnityEngine(Vector3 相关方法)
方法一览(API Index)
| 方法名 | 扩展类型 | 返回类型 | 主要功能 | 典型用途 |
|---|---|---|---|---|
| MathRound | static | double | 四舍五入保留指定小数位(AwayFromZero) | 精确数值显示、物理计算结果处理 |
| AngleBetween | Vector3 | float | 计算两个向量之间的夹角(度) | 朝向判断、旋转角度计算 |
| ToNormalized | Vector3 | Vector3 | 返回向量的单位向量(归一化) | 方向向量、单位化速度/力 |
| LerpTo | Vector3 | Vector3 | 从当前向量线性插值到目标向量 | 平滑移动、插值动画、过渡效果 |
方法详情
MathRound
/// <summary>
/// 保留指定的小数位数,采用四舍五入方式(五时向远离零的方向舍入)
/// 使用 Math.Round + MidpointRounding.AwayFromZero 规则
/// </summary>
/// <param name="number">要处理的数字</param>
/// <param name="decimaDigit">保留的小数位数(可为 0 或负数)</param>
/// <returns>四舍五入后的 double 值</returns>
/// <remarks>参考 MSDN:MidpointRounding.AwayFromZero - 五时向远离零的方向舍入</remarks>
public static double MathRound(double number, int decimaDigit)
示例:
double value = 3.1415926535;
double rounded = value.MathRound(4); // → 3.1416
double rounded2 = value.MathRound(2); // → 3.14
double rounded3 = 2.5.MathRound(0); // → 3(五向远离零)
double rounded4 = (-2.5).MathRound(0); // → -3
注意:
- 与默认 Math.Round(ToEven)不同,此处使用 AwayFromZero,更符合日常“四舍五入”直觉
- 负数同样向远离零方向舍入
AngleBetween
/// <summary>
/// 计算当前向量与目标向量之间的夹角(单位:度)
/// 结果范围 [0, 180]
/// </summary>
/// <param name="vector1">第一个向量(this)</param>
/// <param name="vector2">第二个向量</param>
/// <returns>两个向量之间的夹角(度)</returns>
public static float AngleBetween(this Vector3 vector1, Vector3 vector2)
等价于:Vector3.Angle(vector1, vector2)
示例:
Vector3 forward = transform.forward;
Vector3 toTarget = (target.position - transform.position).normalized;
float angle = forward.AngleBetween(toTarget);
if (angle < 45f)
{
Debug.Log("目标在视野前方");
}
ToNormalized
/// <summary>
/// 返回当前向量的单位向量(长度为 1)
/// 若向量长度为 0,则返回 Vector3.zero
/// </summary>
/// <returns>归一化后的向量</returns>
public static Vector3 ToNormalized(this Vector3 vector)
等价于:vector.normalized
示例:
Vector3 direction = (player.position - transform.position).ToNormalized();
rigidbody.velocity = direction * speed;
LerpTo
/// <summary>
/// 从当前向量线性插值到目标向量
/// t = 0 时返回当前向量,t = 1 时返回目标向量
/// </summary>
/// <param name="start">起始向量(this)</param>
/// <param name="end">目标向量</param>
/// <param name="t">插值因子 [0,1]</param>
/// <returns>插值结果向量</returns>
public static Vector3 LerpTo(this Vector3 start, Vector3 end, float t)
等价于:Vector3.Lerp(start, end, t)
示例(平滑跟随):
void Update()
{
transform.position = transform.position.LerpTo(target.position, Time.deltaTime * followSpeed);
}