Unity API Mathf的使用

*爱你&永不变心* 提交于 2020-02-22 16:27:12

Mathf里面的静态常量

Deg2Rad

角度转为弧度(角度 * Mathf.Deg2Rad)

Rad2Deg

弧度转为角度(弧度 * Mathf.Rad2Deg)

Infinity

表示一个无限大的数字

NegativeInfinity

表示一个无限小的数字

PI

 

Epsilon

表示一个非常小的小数

print("Mathf.Deg2Rad:" + Mathf.Deg2Rad);//角度转为弧度(角度 * Mathf.Deg2Rad)
print("Mathf.Rad2Deg:" + Mathf.Rad2Deg);//弧度转为角度(弧度 * Mathf.Rad2Deg)
print("Mathf.Infinity:" + Mathf.Infinity);//表示一个无限大的数字
print("Mathf.NegativeInfinity:" + Mathf.NegativeInfinity);//表示一个无限小的数字
print("Mathf.PI:" + Mathf.PI);
print("Mathf.Epsilon:" + Mathf.Epsilon);//表示一个非常小的小数

 

Mathf中的Clamp限定方法

Abs

取绝对值

Ceil

向上取整

CeilToInt

向上取整返回int类型

Clamp

把一个值限定在一个范围之内

Clamp(float value, float min, float max)

如果value比min小,则返回min

如果value比max大,则返回max

如果value在min和max中间,则返回value

Clamp01

把一个值限定在0和1之间

Mathf中的常用方法

ClosestPowerOfTwo

取得离2的次方最近的数

DeltaAngle

计算两个角度之间的最短差值,取两个角度最小夹角。

Floor

向下取整

FloorToInt

向下取整返回int

Max

取最大值

Min

取最小值

Pow

Pow(float f, float p)

取f的p次方

Sqrt

取参数的平方根

Debug.Log(Mathf.Floor(10.0F));//10
Debug.Log(Mathf.Floor(10.2F));//10
Debug.Log(Mathf.Floor(10.7F));//10
Debug.Log(Mathf.Floor(-10.0F));//-10
Debug.Log(Mathf.Floor(-10.2F));//-11
Debug.Log(Mathf.Floor(-10.7F));//-11
// 2 4 8 16 32
print(Mathf.ClosestPowerOfTwo(2));//2
print(Mathf.ClosestPowerOfTwo(3));//4
print(Mathf.ClosestPowerOfTwo(4));//4
print(Mathf.ClosestPowerOfTwo(5));//4
print(Mathf.ClosestPowerOfTwo(6));//8
print(Mathf.ClosestPowerOfTwo(30));//32
print(Mathf.Max(1, 2));//2
print(Mathf.Max(1, 2, 5, 3, 10));//10
print(Mathf.Min(1, 2));//1
print(Mathf.Min(1, 2, 5, 3, 10));//1
print(Mathf.Pow(4, 3));//64 
print(Mathf.Sqrt(3));//1.73

使用Lerp插值运算做变速运动(先快后慢)

在一定范围内,按照给定的比例来往中间插入一个值。是按比例来运动,所以才会越来越慢

float Lerp(float a, float b, float t);

属性

a

起始值

b

结束值

t

0-1的比例

假设起始值为9,结束值为20,比例为0.5

public class API10Mathf : MonoBehaviour {
    public Transform cube;    
    void Start()
    {
        cube.position = new Vector3(0, 0, 0);
    }
    void Update()
    {
        float x = cube.position.x;
        float newX = Mathf.Lerp(x, 10, Time.deltaTime);//由x向目标位置移动一定的比例,会越来越慢        
        cube.position = new Vector3(newX, 0, 0);
    }
}

float LerpAngle(float a, float b, float t);

与Lerp相同,但是确保当它们环绕360度时内插正确。

参数t的取值范围为[0,1]。变量a和b的单位为度。

float angle = Mathf.LerpAngle(10, 250, Time.time);
cube.eulerAngles = new Vector3(0, angle, 0);

使用MoveTowards做匀速运动 

起始值按移动的间距进行移动

float MoveTowards(float current, float target, float maxDelta);

current

当前值

target

目标值

maxDelta

移动的间距

public class API10Mathf : MonoBehaviour {
    public Transform cube;
    public float speed = 3;
    void Start()
    {
        cube.position = new Vector3(0, 0, 0);
    }
    void Update()
    {
        float x = cube.position.x; 
        float newX = Mathf.MoveTowards(x, 10, Time.deltaTime * speed);
        cube.position = new Vector3(newX, 0, 0);
    }
}

使用PingPong方法实现乒乓的来回匀速运动效果

默认值是0,取值范围在0 – length之间

float PingPong(float t, float length);

length

最大值

t

运动速度,一直增大的数

public class API10Mathf : MonoBehaviour {
    public Transform cube;
    public float speed = 3;
    void Start()
    {
        cube.position = new Vector3(0, 0, 0);
    }
    void Update()
    {
       //在0 - 5来回运动
       cube.position = new Vector3( Mathf.PingPong(Time.time * speed, 5), 0, 0);

       //在5 - 10来回运动
       cube.position = new Vector3(5 + Mathf.PingPong(Time.time * speed, 5), 0, 0);
    }   
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!