Unity的Mathf介绍
Unity的Mathf是处理数学运算的核心静态类,涵盖基础计算、三角函数、数值处理等常用功能,无需实例化即可调用。
核心功能分类
- 基础数学运算
- 提供加减乘除外的拓展计算,比如绝对值(Abs)、取整(Round/ Floor/ Ceil)、最大值最小值(Max/ Min)。
- 包含幂运算(Pow)、开方(Sqrt)、取模(Repeat)等常用操作。
- 三角函数与角度转换
- 支持正弦(Sin)、余弦(Cos)、正切(Tan)及反三角函数(Asin/ Acos/ Atan/ Atan2)。
- 提供角度与弧度互转(Deg2Rad/ Rad2Deg),解决Unity默认用弧度计算的需求。
- 数值限制与插值
- 数值限制:Clamp限制值在指定范围,Clamp01强制值在0-1之间。
- 插值计算:Lerp(线性插值)、SmoothDamp(平滑阻尼)、MoveTowards(匀速趋近),常用于动画、移动等渐变效果。
- 其他实用工具
- 随机数: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); // 2;Mathf.Round(2.6f); // 3 |
| Mathf.Floor(float f) | f:需要取整的浮点数 | 向下取整(直接舍弃小数部分) | float result = Mathf.Floor(2.9f); // 2.0;Mathf.Floor(-2.1f); // -3.0 |
| Mathf.Ceil(float f) | f:需要取整的浮点数 | 向上取整(小数部分非0则进1) | float result = Mathf.Ceil(2.1f); // 3.0;Mathf.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); // 9;float 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.2;Mathf.Repeat(-1.1f, 3); // 1.9 |
| Mathf.Sign(float f) | f:输入数值 | 判断数值符号(返回 -1、0 或 1) | int sign1 = Mathf.Sign(-7.2f); // -1;int 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); // 3;Mathf.Clamp(-2.1f, 1, 3); // 1 |
| Mathf.Clamp01(float value) | value:输入值 | 限制数值在 [0, 1] 范围内(简化版 Clamp) | float clamped = Mathf.Clamp01(1.5f); // 1;Mathf.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的中间值) |
关键使用注意事项
- 浮点数精度:永远不要用
==比较两个浮点数,必须用Mathf.Approximately(a, b)。 - 插值生效:
Lerp/SmoothDamp/MoveTowards需在Update/FixedUpdate中持续调用,单次调用仅返回当前插值结果。 - 角度单位:Unity 三角函数(Sin/Cos/Atan 等)默认接收 弧度制,需用
Deg2Rad/Rad2Deg转换。 - 方法特性:
Repeat结果始终非负(区别于%取模),PingPong是往返循环(区别于Repeat的单向循环)。