【学习笔记】unity脚本学习(二)(Time时间体系、Random随机数、Mathf数学运算)

news2025/1/16 6:41:47

目录

      • Time时间体系
        • timeScale
        • maximumDeltaTime
        • fixedDeltaTime
        • captureDeltaTime
        • deltaTime
        • 整体展示
      • Random随机数
      • Mathf数学运算I
        • Mathf.Round()
        • Mathf.Ceil() Mathf.CeilToInt()
        • Mathf.Sign
        • Mathf.Clamp
      • Mathf数学运算II-曲线变换
        • Lerp 线性插值
        • LerpAngle
        • SmoothDamp
          • 疑问:
        • SmoothStep
        • MoveTowards()
        • MoveTowardsAngle()
        • 波形比较
        • 其他曲线

参考视频:B站Unity3D视频精讲课程

Time时间体系

(红色旗帜:只读静态变量,绿色:可修改静态变量)
在这里插入图片描述

官网手册 important class-Time


通过edit>project settings>time可修改的参数:
fixedDeltaTime、maximumDeltaTime、timeScale

在这里插入图片描述

timeScale

timeScale:The scale at which time passes.
可修改面板参数Time Scale:The speed at which time progresses . Change this value to simulate bullet-time effects . A value of 1 means real-time . A value of .5 means half speed;a value of 2 is double speed.
可模拟子弹时间,跳跃时慢动作

maximumDeltaTime

maximumDeltaTime:The maximum value of Time.deltaTime in any given frame. This is a time in seconds that limits the increase of Time.time between two frames.

可通过面板修改Maximum Allowed Timestep:A framerate-independent interval that caps the worst-case scenario when framerate is low.Physics calculations and Fixedupdate() eventswill not be performed for longer time than specified. 一种与帧速率无关的间隔,当帧速率较低时,它会限制最坏的情况。物理计算和Fixedupdate() 事件的执行时间不会超过指定时间。

fixedDeltaTime

fixedDeltaTime :执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔(以秒为单位)。

可通过面板修改Fixed Timestep值进行修改。Fixed Timestep:A framerate-independent interval that dictates when physics calculations and Fixedupdate() events are performed
一个与帧速率无关的间隔,用于指定何时执行物理计算和Fixedupdate()事件

修改这个值的直观感受:对帧率产生影响
在这里插入图片描述
好吧,也不知道为啥有这么大区别…(注意拉成1其实跟10帧率差不多)

captureDeltaTime

captureDeltaTime:Slows your application’s playback time to allow Unity to save screenshots in between frames.
减缓应用程序的播放时间,使Unity可以在两帧之间保存屏幕截图。

如果此属性具有非零值,则无论实时时间和帧的持续时间如何,Time.Time都会以captureDeltaTime(按Time.timeScale缩放)的间隔增加。如果你想拍摄一部需要恒定帧速率的电影,并且想在两帧之间留出足够的时间来保存屏幕图像,这一点很有用。

【好吧,没听懂,以后再说吧】


下面是只读变量

deltaTime

乘以deltaTime可以达到平滑的效果
在这里插入图片描述

整体展示

    public int framerate;
    // Start is called before the first frame update
    void Start()
    {
        framerate = Time.captureFramerate;
    }

    // Update is called once per frame
    void Update()
    {
        Time.captureFramerate = framerate;
        if(Input.GetKeyDown(KeyCode.Space)){
            Time.timeScale = 0.2f;
            Time.fixedDeltaTime = 0.005f;
        }
        if(Input.GetKeyUp(KeyCode.Space)){
            Time.timeScale = 1f;
            Time.fixedDeltaTime = 0.02f;
        }
    }
    private void OnGUI() {
        GUILayout.TextArea("Game Time:" + Time.time.ToString());
        GUILayout.TextArea("Game timeSinceLevelLoad:" + Time.timeSinceLevelLoad.ToString());
        GUILayout.TextArea("deltaTime:" + Time.deltaTime.ToString());
        GUILayout.TextArea("fixedTime:" + Time.fixedTime.ToString());
        GUILayout.TextArea("smoothDeltaTime:" + Time.smoothDeltaTime.ToString());
        GUILayout.TextArea("frameCount:" + Time.frameCount.ToString());
        GUILayout.TextArea("realtimeSinceStartup:" + Time.realtimeSinceStartup.ToString());
        GUILayout.TextArea("unscaledDeltaTime:" + Time.unscaledDeltaTime.ToString());
        GUILayout.TextArea("unscaledTime:" + Time.unscaledTime.ToString());
    }

在这里插入图片描述
按空格和松开空格实现的效果如下:
在这里插入图片描述
【哇!顺便学习了输入和GUI,哈哈哈哈我好厉害~】

Random随机数

在这里插入图片描述

Mathf数学运算I

官方API

Mathf.Round()

整数部分为偶数小数为5也舍,整数部分为奇数,小数为5则进。注意unity的不同之处

        Debug.Log("Mathf.Round(10.5f)=" + Mathf.Round(10.5f));//10
        Debug.Log("Mathf.Round(11.5f)=" + Mathf.Round(11.5f));//12
        Debug.Log("Mathf.Round(-10.5f)=" + Mathf.Round(-10.5f));//-10
        Debug.Log("Mathf.Round(-11.5f)=" + Mathf.Round(-11.5f));//-12

Mathf.Ceil() Mathf.CeilToInt()

注意两个打印结果相同,但返回类型不同,其他ToInt方法也类似。

// float Ceil(float f);
Debug.Log(Mathf.Ceil(10.5f));// 11
// int CeilToInt(float f)
Debug.Log(Mathf.CeilToInt(10.5f));// 11

Mathf.Sign

public static float Sign (float f);
返回 f 的符号。
当 f 为正数或零时,返回值为 1,当 f 为负数时,返回值为 -1。

Debug.Log(Mathf.Sign(-10));//-1
Debug.Log(Mathf.Sign(10));//1

Mathf.Clamp

public static float Clamp (float value, float min, float max);
The float result between the minimum and maximum values.
限位函数,value在最大最小值之间,返回原value,否则取最大或者最小值。Note: if the minimum value is is greater than the maximum value, the method returns the minimum value.

Mathf数学运算II-曲线变换

在这里插入图片描述

他们都有一个相似的功能:给定一个初始点,一个target终点,要我们输出的函数从起始点到target点移动,只不过他们实现方法是不同的,效果也有很大的不一样。在我们以后的项目中,利用好这些函数会非常方便且自由地控制例如物体的位移、旋转等。

Lerp 线性插值

public static float Lerp (float a, float b, float t);
在 a 与 b 之间按 t 进行线性插值。参数 t 限制在范围 [0, 1] 内。

当 t = 0 时,返回 a 。
当 t = 1 时,返回 b 。
当 t = 0.5 时,返回 a 和 b 的中点。

    public float minX = 0f;
    public float maxX = 20f;
    float startTime = 2f;
    void Start()
    {
    	// t不在[0,1]范围会被clamp限位
        Debug.Log("Mathf.Lerp(0,5,200)="+Mathf.Lerp(0,5,-1));//0
        Debug.Log("Mathf.Lerp(0,5,200)="+Mathf.Lerp(0,5,200));//5
    }

    // Update is called once per frame
    void Update()
    {
        // 从第2秒开始沿x方向从0匀速移动到5,速度为(maxX-minX)/1
        transform.position = new Vector3(
            Mathf.Lerp(minX,maxX,Time.time-startTime),
            transform.position.y,
             transform.position.z
        );
    }

在这里插入图片描述

LerpAngle

public static float LerpAngle (float a, float b, float t);
与 Lerp 相同,但是在值环绕 360 度时确保值正确插入。
参数 t 限制在范围 [0, 1] 内。假设变量 a 和 b 以度为单位。

    public float start = 0f;
    public float end = 90f;
    float startTime = 2f;
    void Update()
    {
        float currentAngle = Mathf.Lerp(start,end,Time.time-startTime);
        transform.eulerAngles = new Vector3(
            transform.eulerAngles.x,
            currentAngle,
            transform.eulerAngles.z
        );
    }

在这里插入图片描述


lerp插值可以也通过类似current = Mathf.Lerp(current,end,Time.deltaTime) 方法刷新初始值,实现非线性运动

public float current = 0f;
    public float end = 5f;
    float startTime = 2f;

    // Update is called once per frame
    void Update()
    {
        if(end - current <0.01f)
            current = end;
        else
            current = Mathf.Lerp(current,end,Time.deltaTime);
        // 从第2秒开始沿x方向从0匀速移动到5,速度为(maxX-minX)/1
        transform.position = new Vector3(
            current,
            transform.position.y,
             transform.position.z
        );
    }

在这里插入图片描述
但可以明显看出移动很不平滑,且代码不简洁,接下来将介绍两个函数能方便实现非线性平滑变换

SmoothDamp

public static float SmoothDamp (float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed= Mathf.Infinity, float deltaTime= Time.deltaTime);

  • current 当前位置。(下面代码用transform.position.x,注意和lerp smoothStep区别)
  • currentVelocity 当前速度,此值由函数在每次调用时进行修改。(这个值初始值为0即可,不需要管)
  • smoothTime 达到目标所需的近似时间。值越小,达到目标的速度越快。
    public float target = 5f;
    float velocity = 0f;
    public float maxSpeed;

    // Update is called once per frame
    void Update()
    {
        transform.position = new Vector3(
            Mathf.SmoothDamp(transform.position.x,target,ref velocity,5f,maxSpeed),
            transform.position.y,
            transform.position.z);
    }

在这里插入图片描述

疑问:
  • smoothTime 非常不准确
    参考:🔗Mathf.SmoothDamp takes longer than it should inside a coroutine

SmoothStep

public static float SmoothStep (float from, float to, float t);

在 min 与 max 之间进行插值,在限制处进行平滑。

此函数采用与 Lerp 相似的方式在 min 与 max 之间进行插值。 但是,插值会从起点逐渐加速,然后朝着终点减慢。 这可用于创建表现十分自然的动画、淡化和其他过渡。

    public float target = 5f;
    float velocity = 0f;
    public float maxSpeed;

    // Update is called once per frame
    void Update()
    {
        transform.position = new Vector3(
            Mathf.SmoothStep(0,target,Time.time/5),
            transform.position.y,
            transform.position.z);
    }

三者比较
在这里插入图片描述

MoveTowards()

public static float MoveTowards (float current, float target, float maxDelta);
将值 current 向 target 靠近。

这本质上与 Mathf.Lerp 相同,但是该函数确保速度不超过 maxDelta。 maxDelta 为负值时将值推离 /target/。

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

    // Update is called once per frame
    void Update()
    {
        transform.position = new Vector3(
            Mathf.MoveTowards(transform.position.x,target,Time.deltaTime*speed),
            transform.position.y,
            transform.position.z);
    }

MoveTowardsAngle()

与 MoveTowards 相同,但是在值环绕 360 度时确保值正确插入。

波形比较

在这里插入图片描述
lerp是定义好时间,moveTowards是定义好速度

脚本中加入变量public AnimationCurve a;即可调出曲线

其他曲线

InverseLerp:Determines where a value lies between two points.


Repeat 对值 t 进行循环,使它不会大于长度,并且不会小于 0。(AnimationCurve 中就是Loop)
public static float Repeat (float t, float length);

这类似于取模运算符,但是它适用于浮点数。例如,将 3.0 用于 t 并将 2.5 用于 length,结果是 0.5。而当 t = 5 并且 length = 2.5 时,结果是 0.0。但是请注意,与取模运算符一样,没有为负数定义行为。


PingPong PingPong 返回一个值,该值将在值 0 与 length 之间递增和递减。

在这里插入图片描述
要想实现往复运动,比如对前面的Time.time取repeat 或者pingpong就能实现往复运动
在这里插入图片描述

transform.position = new Vector3(
            Mathf.Lerp(minX,maxX,Mathf.PingPong(Time.time,1)),
            transform.position.y,
             transform.position.z
        );

LinearToGammaSpace 将给定值从线性转换为伽马 (sRGB) 颜色空间。
GammaToLinearSpace 将给定值从伽马 (sRGB) 转换为线性颜色空间。
大概意思就是伽马图视觉效果比线性的好,但不好计算,所以一般转换成linear计算完在转回gamma值。
官方手册🔗
在这里插入图片描述


PerlinNoise 生成 2D 柏林噪声。
柏林噪声是在 2D 平面上生成的浮点值的伪随机图案(虽然 该方法普及到三维或更高维,不过未在 Unity 中实现)。 该噪声不包含每个点处的完全随机值,而是由 “波”组成,其值在图案中逐渐增大和减小。该噪声可以 用作纹理特效的基础,以及用于动画、生成地形高度贴图 和许多其他内容。
在这里插入图片描述
作用:

  • 随机颜色过渡

啊,终于将这小节搞完了…又花了好几天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己动手写编译器:DFA跳转表的压缩算法

在编译器开发体系中有两套框架&#xff0c;一个叫"lex && yacc", 另一个名气更大叫llvm&#xff0c;这两都是开发编译器的框架&#xff0c;我们只要设置好配置文件&#xff0c;那么他们就会生成相应的编译器代码&#xff0c;通常是c或者c代码&#xff0c;然后…

AI自动寻路AStar算法【图示讲解原理】

文章目录AI自动寻路AStar算法背景AStar算法原理AStar寻路步骤AStar具体寻路过程AStar代码实现运行结果AI自动寻路AStar算法 背景 AI自动寻路的算法可以分为以下几种&#xff1a; 1、A*算法&#xff1a;A*算法是一种启发式搜索算法&#xff0c;它利用启发函数&#xff08;heu…

Jmeter接口测试和性能测试

目前最新版本发展到5.0版本&#xff0c;需要Java7以上版本环境&#xff0c;下载解压目录后&#xff0c;进入\apache-jmeter-5.0\bin\&#xff0c;双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组&#xff0c;右击测试计划&#xff0c;在快捷菜单单击添加-…

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

一、SG90舵机介绍 SG90是一种微型舵机&#xff0c;也被称为伺服电机。它是一种小型、低成本的直流电机&#xff0c;通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点&#xff0c;因此在各种小型机械…

亚马逊测评只能下单上好评?卖家倾向养号测评还有这些骚操作

亚马逊测评这对于绝大部分亚马逊卖家来说都不陌生&#xff0c;如今的亚马逊市场也很多卖家都在用测评科技来打造爆款。不过很多对于亚马逊测评的认知只停留在简单的刷销量&#xff0c;上好评。殊不知亚马逊养号测评还有其它强大的骚操作。 亚马逊自养号测评哪些功能呢&#xf…

PyTorch 深度学习实战 |用 TensorFlow 训练神经网络

为了更好地理解神经网络如何解决现实世界中的问题&#xff0c;同时也为了熟悉 TensorFlow 的 API&#xff0c;本篇我们将会做一个有关如何训练神经网络的练习&#xff0c;并以此为例&#xff0c;训练一个类似的神经网络。我们即将看到的神经网络&#xff0c;是一个预训练好的用…

【深度学习】【分布式训练】Collective通信操作及Pytorch示例

相关博客 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B&#xff1a;一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…

第02章_变量与运算符

第02章_变量与运算符 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff08;keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门…

银河麒麟服务器ky10 sp3 x86 pgadmin使用

目录 打开网页并登录 连接数据库 备份数据库 还原数据库 打开网页并登录 打开浏览器&#xff0c;输入127.0.0.1:5050&#xff0c;输入用户名和密码登录&#xff0c; 我这边设置的用户名是123456qq.com&#xff0c;密码是 123456 连接数据库 右键选择register-Server 输…

Html5版飞机大战游戏中(Boss战)制作

内容在“60行代码&#xff0c;制作飞机大战游戏”的基础上&#xff0c;继续追加入了Boss战的功能。 boss的血量默认设置为100了&#xff0c;可以二次开发调整……(^_^) 玩起来有一定难度哈。 试玩地址&#xff1a;点击试玩 实现功能 添加玩家飞机&#xff0c;并进行控制Boss能…

vue+MapboxGL:从0 到1 搭建开发环境

本系列教程是在vue2.X的基础上加载mapbox 程序,来开发各种示例程序。 安装顺序 1,下载安装nodejs 下载地址:https://nodejs.org/en/download/ 根据用户自己的机器情况进行选择不同版本的软件下载。 本教程示例采用是是windows 64位系统软件。 安装过程很简单,一路下一步…

vue-router3.0处理页面滚动部分源码分析

在使用vue-router3.0时候&#xff0c;会发现不同的路由之间来回切换&#xff0c;会滚动到上次浏览的位置&#xff0c;今天就来看看这部分的vue-router中的源码实现。 无论是基于hash还是history的路由切换&#xff0c;都对滚动进行了处理&#xff0c;这里分析其中一种即可。 无…

TeeChart Pro ActiveX 2023.3.20 Crack

TeeChart Pro ActiveX 图表组件库提供数百种 2D 和 3D 图形样式、56 种数学和统计函数供您选择&#xff0c;以及无限数量的轴和 14 个工具箱组件。图表控件可以有效地用于创建多任务仪表板。 插件的多功能性 ActiveX 图表控件作为服务器端库中的 Web 图表、脚本化 ASP 图表或桌…

0201概述和结构-索引-MySQL

文章目录1 概述1.1 介绍1.2 优缺点2 索引结构2.1 BTree索引2.2 hash索引2.3 对比3 索引分类3.1 通用分类3.2 InnoDB存储引擎分类4 思考题后记1 概述 1.1 介绍 索引是帮忙MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据系统还维护着满…

【CF1764C】Doremy‘s City Construction(二分图,贪心)

【题目描述】 有nnn个点&#xff0c;每个点的点权为aia_iai​&#xff0c;你可以在任意两个点之间连边&#xff0c;最终连成的图需要满足&#xff1a;不存在任意的三个点&#xff0c;满足au≤av≤awa_u\le a_v\le a_wau​≤av​≤aw​&#xff08;非降序&#xff09;且边(u,v)(…

『pyqt5 从0基础开始项目实战』06. 获取选中多行table 重新初始化数据(保姆级图文)

目录导包和框架代码重新初始化绑定点击事件获取当前选中的所有行id实现初始化数据完整代码main.pythreads.py总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 导包和框架代码 请查…

案例分享 | 金融业智能运维AIOps怎么做?看这一篇就够了

​构建双态IT系统&#xff0c;AIOps已经是必然的选择。运维数字化转型已是大势所趋&#xff0c;实体业务的逐步线上化对IT系统的稳定与安全提出更高要求&#xff0c;同时随着双态IT等复杂系统的建立&#xff0c;如何平衡IT运维效率与成本成为区域性银行面临的重要问题&#xff…

Windows编程基础

Windows编程基础 Unit1应用程序分类 控制台程序&#xff1a;Console Dos程序&#xff0c;本身没有窗口&#xff0c;通过windows Dos窗口执行 窗口程序 拥有自己的窗口&#xff0c;可以与用户交互 库程序 存放代码、数据的程序&#xff0c;执行文件可以从中取出代码执行和获取…

【MySQL】索引事务

摄影分享~ 文章目录索引概念使用场景使用事务概念使用事务的特性索引 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 通过目录&#xff0c;就可以…

如何使用数字示波器

本文介绍以鼎阳SIGLENT SDS1122E数字示波器为例。 带了一根电源线&#xff1b;两根信号线&#xff0c;每根信号线都有几个小配件&#xff0c;如下所示&#xff1a; 使用概述 我们都知道万用表&#xff08;又称欧姆表&#xff09;是工程师最常用的调试电路的工具&#xff0c;但万…