unity3d——基础篇2刷(Mathf)
目录
知识点一:Mathf和Math
知识点二:Mathf和Math的区别
知识点三:Mathf中的常用方法
知识点四:Mathf中的常用方法——一般不停计算
代码示例1
代码示例2
插值运算用法一:每帧改变 start 的值
插值运算用法二:每帧改变 t 的值
知识点一:Mathf和Math
- Math 是C#中封装好的用于数学计算的工具类,位于System命名空间中。
- Mathf 是Unity中封装好的用于数学计算的工具结构体,位于UnityEngine命名空间中。
- 两者都提供数学相关计算方法。
知识点二:Mathf和Math的区别
- Mathf 和 Math 中的相关方法几乎一样。
- Math 是C#自带的工具类,主要提供数学相关计算方法。
- Mathf 是Unity专门封装的,不仅包含Math中的方法,还多了一些适用于游戏开发的方法。
- 在Unity游戏开发中,推荐使用 Mathf 中的方法进行数学计算。
知识点三:Mathf中的常用方法
- π - PI
- 取绝对值 - Abs
- 向上取整 - CeilToInt
- 向下取整 - FloorToInt
- 钳制函数 - Clamp
- 获取最大值 - Max
- 获取最小值 - Min
- 一个数的n次幂 - Pow
- 四舍五入 - RoundToInt
- 返回一个数的平方根 - Sqrt
- 判断一个数是否是2的n次方 - IsPowerOfTwo
- 判断正负数 - Sign
知识点四:Mathf中的常用方法——一般不停计算
- 插值运算 - Lerp
- Lerp函数公式:
result = Mathf.Lerp(start, end, t);
- t为插值系数,取值范围为0~1。
result = start + (end - start)*t
- 插值运算用法一:每帧改变start的值,变化速度先快后慢,位置无限接近,但不会得到end位置。
- 插值运算用法二:每帧改变t的值,变化速度匀速,位置每帧接近,当t>=1时,得到结果。
- Lerp函数公式:
代码示例1
void Start()
{
print(Mathf.PI);
print(Mathf.Abs(-10));
print(Mathf.Abs(-20));
print(Mathf.Abs(1));
float f = 1.3f;
int i = (int)f;
print(i);
print(Mathf.CeilToInt(f));
print(Mathf.CeilToInt(1.00001f));
print(Mathf.FloorToInt(9.6f));
print(Mathf.Clamp(10, 11, 20));
print(Mathf.Clamp(21, 11, 20));
print(Mathf.Clamp(15, 11, 20));
print(Mathf.Max(1, 2, 3, 4, 5, 6, 7, 8));
print(Mathf.Max(1, 2));
print(Mathf.Min(1, 2, 3, 4, 545, 6, 1123, 123));
print(Mathf.Min(1.1f, 0.4f));
print("一个数的n次方" + Mathf.Pow(4, 2));
print("一个数的n次方" + Mathf.Pow(2, 3));
print("四舍五入" + Mathf.RoundToInt(1.3f));
print("四舍五入" + Mathf.RoundToInt(1.5f));
print("返回一个数的平方根" + Mathf.Sqrt(4));
print("返回一个数的平方根" + Mathf.Sqrt(16));
print("返回一个数的平方根" + Mathf.Sqrt(64));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(4));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(8));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(3));
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(1));
print("判断正负数" + Mathf.Sign(0));
print("判断正负数" + Mathf.Sign(10));
print("判断正负数" + Mathf.Sign(-10));
print("判断正负数" + Mathf.Sign(3));
print("判断正负数" + Mathf.Sign(-2));
}
代码示例2
插值运算用法一:每帧改变 start
的值
// 开始值
float start = 0;
void Update()
{
// 插值运算用法一
// 每帧改变start的值——变化速度先快后慢,位置无限接近,但是不会得到end位置
start = Mathf.Lerp(start, 10, Time.deltaTime * 5);
}
- 在这个例子中,
start
变量从0
开始,每帧通过Mathf.Lerp
函数逐渐增加,目标值是10
。 Time.deltaTime
是自上一帧以来的时间增量,乘以5
可以加快插值的速度。- 插值系数
t
是Time.deltaTime * 5
,这意味着start
会随着时间的推移逐渐接近10
,但由于Time.deltaTime
的存在,变化速度会先快后慢,即使t
的值可能超过1
,Mathf.Lerp
会确保结果不会超过10
。
插值运算用法二:每帧改变 t
的值
// 开始值
float start = 0;
float result = 0;
float time = 0;
void Update()
{
// 插值运算用法二
// 每帧改变t的值——变化速度匀速,位置每帧接近,当t>=1时,得到结果
time += Time.deltaTime;
result = Mathf.Lerp(start, 10, time);
}
- 在这个例子中,
time
变量用于存储插值系数,初始值为0
。 - 每帧
time
增加Time.deltaTime
,这意味着time
会随着时间的推移而线性增加。 - 当
time
达到或超过1
时,Mathf.Lerp
函数将返回end
值,即10
。 result
会以匀速逐渐接近10
,直到达到10
。在这个过程中,time
作为插值系数,确保了插值过程的匀速性。
这两种用法展示了 Mathf.Lerp
在Unity中的不同应用场景,第一种适用于需要平滑加速和减速的过渡效果,第二种适用于需要匀速过渡的效果。