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

  • 返回值:返回值是 currenttarget 方向移动后的结果。如果 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。故是一个线性关系。