U2L1——Mathf

Mathf

  • Math​ 是 C# 封装好的用于数学计算的工具类 —— 位与 System​ 命名空间中,即:System.Math
  • Mathf​ 是 Unity 中封装好的用于数学计算的工具结构体 —— 位于 UnityEngine​ 命名空间中

他们都是提供来用于进行数学计算的

区别在于:
Mathf​ 和 Math​ 中的相关方法几乎一样
Math​ 是 C# 自带的工具类 提供一些数学相关的计算方法
Mathf​ 是 Unity 专门封装的,不仅包含 Math 中的方法 还多了一些适用于游戏开发的方法
所以在 Unity 开发里,使用 Mathf​ 中的方法用于数学计算即可

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mathf.PI                        //π
Mathf.Abs() //绝对值
Mathf.CeilToInt() //向上取整,直接加一
Mathf.FloorToInt() //向下取整,直接抛弃小数部分
Mathf.Clamp(, , ) //钳制函数,使输出值限定在一个范围内,小于最小值输出最小值,大于最大值输出最大值,介于两数之间输出比较值
Mathf.Max(...) //获取最大值
Mathf.Min(...) //获取最小值
Mathf.Pow(, ) //一个数的n次幂
Mathf.RoundToInt() //四舍五入
Mathf.Sqrt() //返回一个数的平方根
Mathf.IsPowerOfTwo() //判断一个数是否是2的n次方
Mathf.Sign() //判断正负数
Mathf.Lerp(, , ) //插值运算函数,参数为开始值,结束值,插值系数(只能是0到1,使用了Clamp(0,t,1))
{
return start + (end - start) * t; //插值运算计算公式
}

Mathf一般计算一次的常用方法

π

1
print(Mathf.PI);

绝对值

1
2
3
print(Mathf.Abs(-10));
print(Mathf.Abs(-20));
print(Mathf.Abs(-1.1f));

向上取整

只要有小数部分就加一的取整,无论小数部分有多小

1
2
3
4
5
float f = 1.3f;
int i = (int)f;
print(i);
print(Mathf.CeilToInt(f)); //向上取整,直接加一
print(Mathf.CeilToInt(1.000001f));

向下取整

直接抛弃小数部分的取整,无论小数部分有多大

1
print(Mathf.FloorToInt(9.6f));  //向下取整,直接抛弃小数部分

钳制函数

第一个参数是比较值,第二个参数是最小值,第三个参数是最大值

使输出值限定在一个范围内,小于最小值输出最小值,大于最大值输出最大值,介于两数之间输出比较值

1
2
3
print(Mathf.Clamp(10, 11, 20)); //比最小值还小,输出最小值
print(Mathf.Clamp(21, 11, 20)); //比最大值还大,输出最大值
print(Mathf.Clamp(15, 11, 20)); //介于两数之间,输出比较值

最大值

可传入多个值,取其中最大值

1
2
print(Mathf.Max(1, 2, 3, 4, 5));
print(Mathf.Max(1, 2));

最小值

可传入多个值,取其中最小值

1
2
print(Mathf.Min(1.1f, 2, 3, 4, 5));
print(Mathf.Min(1.1f, 2.2f));

一个数的n次方

Mathf.Pow(a, b)​ 相当于 aba^b

1
2
print("一个数的n次方" + Mathf.Pow(4, 2));
print("一个数的n次方" + Mathf.Pow(2, 3));

四舍五入

1
2
print("四舍五入" + Mathf.RoundToInt(1.3f));
print("四舍五入" + Mathf.RoundToInt(1.6f));

一个数的平方根

1
2
3
print("返回一个数的平方根" + Mathf.Sqrt(4));
print("返回一个数的平方根" + Mathf.Sqrt(16));
print("返回一个数的平方根" + Mathf.Sqrt(64));

判断一个数是否是2的n次方

1
2
3
4
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(4));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(8));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(3));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(1));

判断正负数

注意!返回值是-1f和1f,而不是bool值

1
2
3
4
5
print("判断正负数" + Mathf.Sign(0));
print("判断正负数" + Mathf.Sign(10));
print("判断正负数" + Mathf.Sign(-10));
print("判断正负数" + Mathf.Sign(3));
print("判断正负数" + Mathf.Sign(-2));

Mathf一般要不停计算的常用方法

插值运算

假设startstart是开始值,endend是目标值,tt是插值系数(这个系数必须是0~1),这Mathf中的每一次插值运算公式如下:

result=start+(endstart)tresult = start + (end - start) * t

每次计算改变startstart值或者tt值(改变不同的数,接近效果是不同的),最终会使startstart值不断趋近于endend

在Mathf里这个函数的定义如下:

1
2
3
4
public static float Lerp(float a, float b, float t)
{
return a + (b - a) * Clamp01(t); //Clamp01(t)等效于Mathf.Clamp(0, t, 1),是使t限定在0到1的函数
}

插值运算用法1——先快后慢趋近

每帧改变start的值——变化速度是先快后慢,位置无限接近,但是不会得到end位置

1
2
3
4
5
float start = 0;
void Update()
{
start = Mathf.Lerp(start, 10, Time.deltaTime); //start会先快后慢的不断趋近10
}

插值运算用法2——匀速接近

每帧改变t的值——变化速度是匀速,位置每帧接近,当t >= 1时,得到结果

1
2
3
4
5
6
7
float start2 = 0;
float time = 0;
void Update()
{
time += Time.deltaTime;
result = Mathf.Lerp(start2, 10, time); //result会匀速变成10
}

Mathf的三角函数

Mathf三角函数