Mathf类
Mathf和Math类的相同点和不同点?
相同点:都是用来计算数学相关的运算的。
不同点:
Math类是System包下面的类
Mathf类是UnityEngine包下面的结构体。可以理解对Math类进一步的包装。
在Unity中使用数学运算时,一般使用的是Mathf类
常见的常量
π
Rad2Deg
Deg2Rad
Mathf.Abs
绝对值
Mathf.Floor(float value)
Mathf.FloorToInt
向下取整
public static int FloorToInt(float f)
// 还有另外一种写法
float f = 1.3f;
int i = (int)f;
Mathf.CeilToInt
向上取整
public static int CeilToInt(float f)
Mathf.Clamp
Mathf.Clamp 可以防止数值超出指定的范围,这对于处理用户输入、游戏逻辑中的变量控制等非常有用。
public static int Clamp(int value, int min, int max)
如果value小于min,则value = min。
如果value大于max,则value = max。
如果value介于min和max之间,则value = value。
Mathf.IsPowerOfTwo
通常是基于位运算的。对于一个正整数 n,如果它是2的幂次方,那么它的二进制表示中只有一个位是1,其余都是0.
public static bool IsPowerOfTwo(int value)
// 实现原理
bool IsPowerOfTwo(int n)
{
return n > 0 && (n & (n - 1)) == 0;
}
原理例子:假设n=4,其二进制为 01 00,那么n-1的二进制为 00 11,两则进行与运算,得到的二进进制为 00 00
原理解析;利用了2的幂次方数减1后的二进制表示中,所有的低位都变成1的特点
Mathf.Sqrt
用于计算一个非负数的平方根。平方根是指一个数乘以自身得到原数的那个数。
public static float Sqrt(float f)
Mathf.Pow
用于计算一个数的任意次幂。这个方法接受两个参数:基数(base)和指数(exponent),并返回基数的指数次幂的结果。
public static float Pow(float f, float p)
Mathf.Sign
用于返回一个浮点数的符号。如果输入的数是正数,
它返回 1;如果是负数,返回 -1;如果是 0,则返回 0。
public static int Sign(float value)
Mathf.RoundToInt
将浮点数(float)四舍五入到最接近的整数(int)。该方法遵循标准的数学四舍五入规则:如果小数部分大于等于0.5,则向上取整;如果小于0.5,则向下取整
public static int RoundToInt(float f)
Mathf.MoveTowards
用于平滑地将一个值向另一个值移动
public static float MoveTowards(float current, float target, float maxDelta)
current:当前的值。
target:想要达到的目标值。
maxDelta:每次调用此函数时,current 向 target 移动的最大距离。如果 current 和 target 之间的差值小于 maxDelta,则 current 将直接设置为 target
返回值:返回值是
current
向target
方向移动后的结果。如果current
已经等于或非常接近target
(即它们之间的差距小于或等于maxDelta
),则返回target
Mathf.Lerp❤❤
1. Lerp函数的计算公式
可以用来平滑地过渡数值,比如在动画、摄像机移动、颜色渐变等场景中非常有用。
result = start + (end - start) * t,其中t为插值系数,取值范围为0~1
2. 先快后慢
float start = 0;
void Update(){
start = Mathf.Lerp(start, 10, Time.deltaTime);
}
每帧改变start的值一变化速度先快后慢,位置无限接近,但是不会得到end位置。
2. 匀速变化
float time = 0;
float start = 0;
float result = 10;
voidUpdate(){
time += Time.deltaTime;
result = Mathf.Lerp(start, 10, time);
}
每帧改变t的值—变化速度匀速,位置每帧接近,当t>=1时,得到结果
end - start是不变的,变化的是t。故是一个线性关系。
评论区