Unity3D自学笔记——脚本开发基础数学

本文介绍了Unity中关于时间的各种属性及其使用方法,并详细讲解了Mathf类中的多种数学函数,如Lerp、MoveTowards等,这些函数对于实现物体平滑移动、旋转等效果至关重要。

Time

time:从游戏开始到所用的时间
timeSinceLevelLoad:以秒计算到最后已经加载完的时间
deltaTime:以秒计算,最后一帧的时间
fixedTime:以秒计算游戏开始的时间
fixedDeltaTime:以秒计算时间间隔,在物理其他固定帧速率更新
maximumDeltaTime:一帧能获得的最大时间,物理其他帧速率
smoothDeltaTime:一个平滑淡出Time.deltaTime
timeScale:传递时间的,这可以减慢运动效果
frameCount:已经传递的帧的总数
realtimeSinceStartup:以秒计算,自游戏开始的实时时间
captureFramerate:时间会在每帧(1.0/captureFramerate)前进,不考虑真实时间
unscaledDeltaTime:以秒计算,完成最后一帧的时间(不计算Timescale)
unscaledTime:游戏开始到现在所用的时间(不计算Timescale)

Random

seed:设置用于随机数生成器的种子
value:返回一个随机数,在0.0~1.0之间
insideUnitCircle:返回半径为1的圆内的一个随机点
insideUnitSphere:返回半径为1的球体内的一个随机点
onUnitSphere:返回半径为1的球体表面的一个随机点
rotation:返回一个随机旋转角度
rotationUniform:返回一个随机选择角度(平均分布)
float Range(min, max) :返回一个随机float/int数,在min和max之间

Mathf

Ceil:返回大于或等于f的最小整数。
Floor:返回小于或等于该数的最大整数。
Round:返回浮点数 f 进行四舍五入最接近的整数。如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Sigh:返回 f 的数字符号。当 f 为正或为0返回1,为负返回-1。
Clamp:限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value
Clamp01:限制value在0,1之间并返回value。如果value小于0,返回0。如果value大于1,返回1,否则返回value 。
Lerp:基于浮点数t返回a到b之间的插值
LerpAngle:基于浮点数t返回a到b之间的角度插值

public float start = 0f;
    public float end = 5f;

    float startTime = 1f;

    // Update is called once per frame
    void Update () {
        //Lerp
        //使物体从start平滑移动至end
        transform.position = new Vector3(
            Mathf.Lerp(start, end, Time.time - startTime),
            transform.position.y,
            transform.position.z);
        //LerpAngel
        //使物体从start平滑旋转至end
        float current = Mathf.LerpAngle(start, end, Time.time - startTime);
        transform.eulerAngles = new Vector3(
            transform.eulerAngles.x,
            current,
            transform.eulerAngles.z);
    }

MoveTowards:改变一个当前值向目标靠近
MoveTowardsAngle:改变一个当前值向目标角度靠近

public float end = 5f;
    public float speed = 1f;

    // Update is called once per frame
    void Update () {
        //使物体匀速移动至终点
        transform.position = new Vector3(
            Mathf.MoveTowards(transform.position.x, end, Time.deltaTime * speed),
            transform.position.y,
            transform.position.z);
        //使物体匀速旋转至最终角度
        float current = Mathf.MoveTowardsAngle(transform.eulerAngles.x, end, Time.deltaTime * speed);
        transform.eulerAngles = new Vector3(current, transform.eulerAngles.y, transform.eulerAngles.z);
    }

SmoothStep:和lerp类似,在最小和最大值之间的插值,并在限制处渐入渐出

 transform.position = new Vector3(
            Mathf.Lerp(start, end, Time.time - startTime),
            transform.position.y,
            transform.position.z);

SmoothDamp:随着时间的推移逐渐改变一个值到期望值
SmoothDampAngle:随着时间的推移逐渐改变一个角度到期望角度

 public float target;
    float velocity = 2f;
    public float maxSpeed;

    // Update is called once per frame
    void Update () {
        //SmoothDamp
        //使物体从起始点移动至终点
        transform.position = new Vector3(
            Mathf.SmoothDamp(transform.position.x, target, ref velocity, 1f, maxSpeed),
            transform.position.y,
            transform.position.z);

        //SmoothDampAngles
        //使物体从起始角度旋转至最终角度
        float current = Mathf.SmoothDampAngle(transform.eulerAngles.x, target, ref velocity, 1f, maxSpeed);
        transform.eulerAngles = new Vector3(current, transform.eulerAngles.y, transform.eulerAngles.z);
    }

移动速度变化曲线
这里写图片描述

PingPong:让数值t在 0到length之间往返。t值永远不会大于length的值,也永远不会小于0。 返回值将在0和length之间来回移动。
Repeat:循环t值,从来不会比length大,并且从不会小于0,取值在0~length之间。

public float scale = 1f;

    // Update is called once per frame
    void Update () {
        //scale = Mathf.Repeat(Time.time, 2);
        scale = Mathf.PingPong(Time.time, 2);
        transform.localScale = new Vector3(1, scale, 1);
    }

GammaToLinearSpace:转换给定值从伽马到线性颜色空间。
LinearToGammaSpace:转换给定值从线性到伽马颜色空间。
PerlinNoise:生成二维柏林噪波。

 public Material m;
    Vector3 colorSpace;
    // Use this for initialization
    void Start () {
        m = this.gameObject.GetComponent<Renderer>().material;

        colorSpace = new Vector3(
            Random.Range(0f, 10f),
            Random.Range(0f, 10f),
            Random.Range(0f, 10f)
            );
    }

    // Update is called once per frame
    void Update () {
        float sX = Mathf.PerlinNoise(Time.time, colorSpace.x);
        float sY = Mathf.PerlinNoise(Time.time, colorSpace.y);
        float sZ = Mathf.PerlinNoise(Time.time, colorSpace.z);

        m.color = new Color(sX, sY, sZ);
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值