MathExtensions

8 阅读2分钟

概述(Overview)

MathExtensions 是一个轻量级的 数学与向量运算扩展方法 静态类,位于 PFGameFramework.Library 命名空间。

当前主要提供以下功能:

  • 高精度四舍五入(使用 MidpointRounding.AwayFromZero 规则)
  • Vector3 常用操作的简洁扩展方法(角度、归一化、线性插值)

这些方法旨在让代码更简洁、可读性更强,尤其适合在 Unity 项目中频繁使用的向量计算场景。

依赖

  • System(Math.Round)
  • UnityEngine(Vector3 相关方法)

方法一览(API Index)

方法名扩展类型返回类型主要功能典型用途
MathRoundstaticdouble四舍五入保留指定小数位(AwayFromZero)精确数值显示、物理计算结果处理
AngleBetweenVector3float计算两个向量之间的夹角(度)朝向判断、旋转角度计算
ToNormalizedVector3Vector3返回向量的单位向量(归一化)方向向量、单位化速度/力
LerpToVector3Vector3从当前向量线性插值到目标向量平滑移动、插值动画、过渡效果

方法详情

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);
}