除了基础数值运算,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 数学计算需求。