Unity的Mathf是处理数学运算的核心静态类,涵盖基础计算、三角函数、数值处理等常用功能,无需实例化即可调用。

核心功能分类

  1. 基础数学运算
  • 提供加减乘除外的拓展计算,比如绝对值(Abs)、取整(Round/ Floor/ Ceil)、最大值最小值(Max/ Min)。
  • 包含幂运算(Pow)、开方(Sqrt)、取模(Repeat)等常用操作。
  1. 三角函数与角度转换
  • 支持正弦(Sin)、余弦(Cos)、正切(Tan)及反三角函数(Asin/ Acos/ Atan/ Atan2)。
  • 提供角度与弧度互转(Deg2Rad/ Rad2Deg),解决Unity默认用弧度计算的需求。
  1. 数值限制与插值
  • 数值限制:Clamp限制值在指定范围,Clamp01强制值在0-1之间。
  • 插值计算:Lerp(线性插值)、SmoothDamp(平滑阻尼)、MoveTowards(匀速趋近),常用于动画、移动等渐变效果。
  1. 其他实用工具
  • 随机数:Random类虽常用,但Mathf的PerlinNoise可生成平滑随机值,适合地形、特效等场景。
  • 符号判断(Sign)、接近判断(Approximately,避免浮点数精度问题)。

关键使用要点

  • 所有方法均为静态,调用格式为Mathf.方法名(参数)
  • 浮点数计算需注意精度,优先用Approximately判断相等,而非直接用==
  • 插值类方法(如Lerp)需在Update中持续调用,才能实现渐变效果。

Unity Mathf 常用方法速查表

以下整理了开发中高频使用的 Mathf 方法,包含 方法说明、参数、用途、示例代码,按功能分类便于快速查阅,所有方法均直接通过 Mathf.方法名() 静态调用。

一、基础数值运算

方法名 参数说明 核心用途 示例代码
Mathf.Abs(float f) f:需要取绝对值的数值(int/float 均支持) 获取绝对值(解决负数转正需求) float result = Mathf.Abs(-3.5f); // 结果:3.5
Mathf.Round(float f) f:需要取整的浮点数 四舍五入取整 int result = Mathf.Round(2.3f); // 2Mathf.Round(2.6f); // 3
Mathf.Floor(float f) f:需要取整的浮点数 向下取整(直接舍弃小数部分) float result = Mathf.Floor(2.9f); // 2.0Mathf.Floor(-2.1f); // -3.0
Mathf.Ceil(float f) f:需要取整的浮点数 向上取整(小数部分非0则进1) float result = Mathf.Ceil(2.1f); // 3.0Mathf.Ceil(-2.9f); // -2.0
Mathf.Max(params float[] values) values:多个待比较的数值(支持2个或多个) 取多个数值中的最大值 float max = Mathf.Max(1.2f, 5.7f, 3.0f); // 5.7
Mathf.Min(params float[] values) values:多个待比较的数值(支持2个或多个) 取多个数值中的最小值 float min = Mathf.Min(1.2f, 5.7f, 3.0f); // 1.2
Mathf.Pow(float f, float p) f:底数;p:指数 计算 f 的 p 次方(如平方、立方) float square = Mathf.Pow(3, 2); // 9float cube = Mathf.Pow(2, 3); // 8
Mathf.Sqrt(float f) f:非负底数(f ≥ 0) 计算平方根 float root = Mathf.Sqrt(16); // 4
Mathf.Repeat(float t, float length) t:输入值;length:循环长度(length > 0) 循环数值(类似取模,但结果始终非负) float repeat = Mathf.Repeat(5.2f, 3); // 2.2Mathf.Repeat(-1.1f, 3); // 1.9
Mathf.Sign(float f) f:输入数值 判断数值符号(返回 -1、0 或 1) int sign1 = Mathf.Sign(-7.2f); // -1int sign2 = Mathf.Sign(3.1f); // 1

二、三角函数与角度转换

方法名 参数说明 核心用途 示例代码
Mathf.Deg2Rad 常量(无需参数) 角度转弧度(1度 = Deg2Rad 弧度) float rad = 90 * Mathf.Deg2Rad; // 1.5708 弧度(π/2)
Mathf.Rad2Deg 常量(无需参数) 弧度转角度(1弧度 = Rad2Deg 度) float deg = Mathf.PI * Mathf.Rad2Deg; // 180 度
Mathf.Sin(float rad) rad:输入角度(弧度制) 计算正弦值(返回 -1 ~ 1) float sin90 = Mathf.Sin(90 * Mathf.Deg2Rad); // 1.0
Mathf.Cos(float rad) rad:输入角度(弧度制) 计算余弦值(返回 -1 ~ 1) float cos0 = Mathf.Cos(0 * Mathf.Deg2Rad); // 1.0
Mathf.Tan(float rad) rad:输入角度(弧度制,避免 ±90° 附近值) 计算正切值 float tan45 = Mathf.Tan(45 * Mathf.Deg2Rad); // 1.0
Mathf.Asin(float f) f:输入值(-1 ≤ f ≤ 1) 计算反正弦值(返回弧度制,范围 -π/2 ~ π/2) float rad = Mathf.Asin(1); // π/2 弧度(90度)
Mathf.Acos(float f) f:输入值(-1 ≤ f ≤ 1) 计算反余弦值(返回弧度制,范围 0 ~ π) float rad = Mathf.Acos(0); // π/2 弧度(90度)
Mathf.Atan(float f) f:输入值 计算反正切值(返回弧度制,范围 -π/2 ~ π/2) float rad = Mathf.Atan(1); // π/4 弧度(45度)
Mathf.Atan2(float y, float x) y:y轴坐标;x:x轴坐标 计算向量(x,y)的反正切值(解决象限判断问题) float angle = Mathf.Atan2(1, 1) * Mathf.Rad2Deg; // 45度(第一象限)Mathf.Atan2(-1, -1) * Mathf.Rad2Deg; // -135度(第三象限)

三、数值限制与插值(动画/移动常用)

方法名 参数说明 核心用途 示例代码
Mathf.Clamp(float value, float min, float max) value:输入值;min:最小值;max:最大值 限制数值在 [min, max] 范围内 float clamped = Mathf.Clamp(5.2f, 1, 3); // 3Mathf.Clamp(-2.1f, 1, 3); // 1
Mathf.Clamp01(float value) value:输入值 限制数值在 [0, 1] 范围内(简化版 Clamp) float clamped = Mathf.Clamp01(1.5f); // 1Mathf.Clamp01(-0.3f); // 0
Mathf.Lerp(float a, float b, float t) a:起始值;b:目标值;t:插值系数(0 ≤ t ≤ 1) 线性插值(t=0返回a,t=1返回b,中间平滑过渡) // Update中调用,实现从2到5的1秒渐变
float speed = 1f;
currentValue = Mathf.Lerp(currentValue, 5, speed * Time.deltaTime);
Mathf.LerpUnclamped(float a, float b, float t) 同 Lerp,但 t 无范围限制 无限制线性插值(可超出 a/b 范围外推) float result = Mathf.LerpUnclamped(2, 5, 1.5f); // 6.5(超出目标值)
Mathf.SmoothDamp(float current, float target, ref float velocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime) current:当前值;target:目标值;velocity:当前速度(引用类型,需提前声明);smoothTime:平滑时间;maxSpeed:最大速度 平滑阻尼(带减速效果的渐变,适合相机跟随、数值缓冲) // 声明速度变量
private float velocity = 0;
// Update中调用
currentValue = Mathf.SmoothDamp(currentValue, targetValue, ref velocity, 0.3f);
Mathf.MoveTowards(float current, float target, float maxDelta) current:当前值;target:目标值;maxDelta:每次最大移动步长 匀速趋近目标值(避免超调) // 每秒移动2个单位,向10靠近
currentValue = Mathf.MoveTowards(currentValue, 10, 2 * Time.deltaTime);
Mathf.PingPong(float t, float length) t:输入值;length:循环长度(length > 0) 往返循环数值(0 → length → 0 反复) // Update中调用,实现0~5往返
float pingPong = Mathf.PingPong(Time.time * 2, 5);

四、实用工具(精度/随机/判断)

方法名 参数说明 核心用途 示例代码
Mathf.Approximately(float a, float b) a、b:待比较的两个浮点数 浮点数精度比较(避免直接用 == 导致的误差) bool isEqual = Mathf.Approximately(0.1f + 0.2f, 0.3f); // true(直接 == 会返回 false)
Mathf.PerlinNoise(float x, float y) x、y:2D坐标值 生成平滑随机值(返回 0 ~ 1,适合地形、特效、随机波动) // 生成随时间平滑变化的随机值
float noise = Mathf.PerlinNoise(Time.time * 0.5f, 0);
Mathf.DeltaAngle(float current, float target) current:当前角度(度);target:目标角度(度) 计算两个角度的最短差值(返回 -180 ~ 180) float delta = Mathf.DeltaAngle(350, 10); // 20(350→10顺时针转20度,而非340度)
Mathf.InverseLerp(float a, float b, float value) a:起始值;b:目标值;value:当前值 计算 value 在 [a,b] 中的归一化比例(返回 0 ~ 1,超出则外推) float t = Mathf.InverseLerp(2, 5, 3.5f); // 0.5(3.5是2和5的中间值)

关键使用注意事项

  1. 浮点数精度:永远不要用 == 比较两个浮点数,必须用 Mathf.Approximately(a, b)
  2. 插值生效:Lerp/SmoothDamp/MoveTowards 需在 Update/FixedUpdate持续调用,单次调用仅返回当前插值结果。
  3. 角度单位:Unity 三角函数(Sin/Cos/Atan 等)默认接收 弧度制,需用 Deg2Rad/Rad2Deg 转换。
  4. 方法特性:Repeat 结果始终非负(区别于 % 取模),PingPong 是往返循环(区别于 Repeat 的单向循环)。