除了基础数值运算,Unity 的 Mathf 还有几大类高频实用方法,主要集中在 角度/向量辅助、数值平滑、特殊数学计算 等场景,以下是开发中常用的补充方法,每个都配具体用途和可运行示例:

一、角度与旋转辅助(补充三角函数外的核心旋转工具)

方法名 参数说明 核心用途 示例代码
Mathf.MoveTowardsAngle(float current, float target, float maxDelta) current:当前角度(度);target:目标角度(度);maxDelta:每次最大旋转角度 匀速旋转到目标角度(自动走最短路径) // 角色朝向匀速旋转(每秒转30度)
private float currentAngle = 0f;
void Update() {
currentAngle = Mathf.MoveTowardsAngle(currentAngle, 90f, 30f * Time.deltaTime);
transform.rotation = Quaternion.Euler(0, currentAngle, 0);
}
Mathf.LerpAngle(float a, float b, float t) a:起始角度(度);b:目标角度(度);t:插值系数(0~1) 角度线性插值(自动处理跨360°的最短路径) // 相机平滑转向目标角度
private float cameraAngle = 0f;
void Update() {
cameraAngle = Mathf.LerpAngle(cameraAngle, 180f, 0.5f * Time.deltaTime);
transform.rotation = Quaternion.Euler(0, cameraAngle, 0);
}
Mathf.SmoothDampAngle(float current, float target, ref float velocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime) 同 SmoothDamp,仅参数为角度(度) 角度平滑阻尼(带减速的旋转,适合相机跟随) // 角色头部平滑转向鼠标方向
private float headAngle = 0f;
private float velocity = 0f;
void Update() {
float targetAngle = CalculateMouseAngle(); // 自定义方法获取目标角度
headAngle = Mathf.SmoothDampAngle(headAngle, targetAngle, ref velocity, 0.2f);
headTransform.rotation = Quaternion.Euler(0, headAngle, 0);
}

二、数值平滑与曲线(比基础插值更灵活的过渡)

方法名 参数说明 核心用途 示例代码
Mathf.SmoothStep(float from, float to, float t) from:起始值;to:目标值;t:插值系数(0~1) 平滑过渡(缓入缓出,t在0~1时曲线过渡) // UI元素缩放平滑过渡(0→1→0)
void Update() {
float t = Mathf.PingPong(Time.time, 1f);
float scale = Mathf.SmoothStep(0.5f, 1.5f, t);
uiTransform.localScale = Vector3.one * scale;
}
Mathf.Gamma(float value, float gamma) value:输入值(≥0);gamma:伽马值(gamma>0) 伽马校正(调整数值曲线,用于亮度、颜色校正) // 调整灯光亮度曲线(暗部更亮,亮部更柔和)
float rawBrightness = 0.7f;
float gamma = 2.2f; // 标准伽马值
float correctedBrightness = Mathf.Gamma(rawBrightness, gamma);
light.intensity = correctedBrightness;
Mathf.Pow(float f, float p)(补充场景) 底数f;指数p 自定义曲线过渡(如加速/减速插值) // 加速向目标移动(t的2次方,前期慢后期快)
private float current = 0f;
void Update() {
float t = Mathf.Clamp01(Time.time / 2f); // 2秒内从0到1
current = Mathf.Lerp(0f, 10f, Mathf.Pow(t, 2f)); // 加速插值
}

三、特殊数学计算(物理/几何/边界处理)

方法名 参数说明 核心用途 示例代码
Mathf.DeltaAngle(补充场景) current:当前角度(度);target:目标角度(度) 角度差值计算(用于旋转速度控制) // 根据角度差控制旋转速度(差值越大转越快)
float currentAngle = transform.eulerAngles.y;
float targetAngle = 90f;
float delta = Mathf.DeltaAngle(currentAngle, targetAngle);
float rotateSpeed = Mathf.Abs(delta) * 2f; // 差值越大速度越快
currentAngle = Mathf.MoveTowardsAngle(currentAngle, targetAngle, rotateSpeed * Time.deltaTime);
Mathf.PerlinNoise(补充2D场景) x:x轴坐标;y:y轴坐标 2D平滑随机(地形、纹理、流体效果) // 生成2D随机地形高度(简化版)
public int gridSize = 10;
public float noiseScale = 0.1f;
void GenerateTerrain() {
for (int x = 0; x < gridSize; x++) {
for (int z = 0; z < gridSize; z++) {
float height = Mathf.PerlinNoise(x * noiseScale, z * noiseScale) * 5f; // 高度0~5
Vector3 pos = new Vector3(x, height, z);
Instantiate(terrainBlock, pos, Quaternion.identity);
}
}
Mathf.InverseLerp(补充反向插值) a:起始值;b:目标值;value:当前值 反向计算插值系数(用于从结果反推比例) // 根据物体位置反推进度(如跑道上的进度条)
float startPos = 0f;
float endPos = 100f;
float currentPos = transform.position.x;
float progress = Mathf.InverseLerp(startPos, endPos, currentPos);
progressBar.fillAmount = progress; // 进度条同步
Mathf.Clamp(补充边界场景) value:输入值;min:最小值;max:最大值 多维度边界限制(如相机位置、角色移动范围) // 限制相机在指定区域内移动
Vector3 cameraPos = transform.position;
cameraPos.x = Mathf.Clamp(cameraPos.x, -10f, 10f); // x轴范围-10~10
cameraPos.z = Mathf.Clamp(cameraPos.z, -5f, 5f); // z轴范围-5~5
transform.position = cameraPos;

四、其他高频工具方法

方法名 参数说明 核心用途 示例代码
Mathf.IsPowerOfTwo(int value) value:整数(≥1) 判断是否为2的幂(用于纹理尺寸、网格优化) // 检查纹理尺寸是否为2的幂(Unity纹理优化要求)
Texture2D tex = GetComponent<Renderer>().material.mainTexture as Texture2D;
if (Mathf.IsPowerOfTwo(tex.width) && Mathf.IsPowerOfTwo(tex.height)) {
Debug.Log("纹理尺寸符合优化要求");
} else {
Debug.LogWarning("纹理尺寸非2的幂,可能影响性能");
}
Mathf.NextPowerOfTwo(int value) value:整数(≥1) 获取大于等于value的最小2的幂(纹理/网格适配) // 适配纹理尺寸为2的幂
int rawWidth = 120;
int optimizedWidth = Mathf.NextPowerOfTwo(rawWidth); // 结果:128
int rawHeight = 200;
int optimizedHeight = Mathf.NextPowerOfTwo(rawHeight); // 结果:256
Mathf.Deg2Rad/Rad2Deg(补充场景) 常量(无参数) 旋转矩阵/向量计算(物理、特效方向) // 生成指定角度的方向向量(如子弹发射方向)
float angle = 45f;
float rad = angle * Mathf.Deg2Rad;
Vector2 direction = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)); // 45度方向向量
bulletRigidbody.velocity = direction * bulletSpeed;

核心使用场景总结

这些补充方法覆盖了 Unity 开发中 旋转控制、平滑过渡、物理/几何计算、资源适配 四大核心场景,其中:

  • 角度相关(MoveTowardsAngle/LerpAngle/SmoothDampAngle)是角色/相机旋转的首选,避免手动处理360°边界问题;
  • 平滑过渡(SmoothStep/Gamma)比基础 Lerp 更自然,适合UI动画、数值缓冲;
  • 2的幂相关方法(IsPowerOfTwo/NextPowerOfTwo)是资源优化的必备工具;
  • PerlinNoise 的2D用法是自然效果(地形、流体)的核心。

所有方法均保持 Mathf 静态调用的特性,且示例代码可直接复制到脚本中测试,结合之前的基础数值运算,可覆盖90%以上的 Unity 数学计算需求。