如何理解Unity中Time.deltatime

这篇具有很好参考价值的文章主要介绍了如何理解Unity中Time.deltatime。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,Time.deltatime通常在Update()方法中被调用

Update()方法的特性便是每帧执行一次,而Update()调用的速率与帧速率有关,而帧速率是不断变化的,帧速率的高低与设备本身性能和系统繁忙程度都有关系。

举个通俗的例子

    void Update()
    {
        player.transform.Translate(new Vector3(0,0,1));        
    }

这是实现玩家向前移动的基本代码,它的基础逻辑便是使游戏物体在原有的位置上发生移动,移动方向是Vector3所指的方向z轴,目的位置是Vector3的位置,即

transform.position = transform.position + Vector3;

由此才能每一帧都向z轴正方向移动一个单位,达到比较连贯的移动效果,倘若把这行移动代码放在Start()方法中,那么它的z轴仅仅朝正方向移动一个单位后就会停下来即仅调用一次。

相信大家玩第一人称射击游戏或者英雄联盟的时候都会看到一个关键的面板:FPS,并且后面会有跳动的数值,并且都说数值越高,帧率越高。这个说法倒也没多大问题,FPS全称Frame Per Second,英译过来便是画面每秒传输的帧数。

因此,倘若一台电脑的实时FPS为80,那么每秒就会调用Update()方法80次,同样对应的1秒钟内这个游戏物体的z轴会移动80个单位长度。

但是,倘若别人由于设备问题导致实时FPS只有50,那么每秒就只能调用Update()方法50次,1秒钟内z轴也只能移动50个单位长度。即相同的代码,同一秒内,硬件好的比硬件差的多走了30个单位长度,那么硬件差的人就直接脱口而出“这游戏狗都不玩...”了。

另外还有一个问题,相信玩游戏的人都经历过所谓的“跳帧”情况,即FPS忽高忽低,极为不稳定,这就会导致原本FPS80的玩家移动起来速度一下快一下慢,即上一秒移动80个单位,下一秒移动30个单位,极为折磨,旋转效果更是鬼畜抽动,最后就也说“这游戏狗都不玩...”了。

为了解决上述问题,Time.deltatime出现了,Time.deltatime表示距上一次调用Update()所用的时间,即时间增量,单位是毫秒(ms),倘若使用了Time.deltatime

    void Update()
    {
        player.transform.Translate(new Vector3(0,0,1)*Time.deltaTime);        
    }

那么就能使Update()中的这个移动行为看起来与帧速率无关,没加Time.deltatime的时候代表每帧向z轴正方向移动1个单位,加了后代表每秒移动1个单位。

为什么Time.deltatime可以实现这个效果呢?

假设一台实时FPS稳定且为80的电脑,它在1秒钟内就会闪过80帧画面,那么播放这80帧过程中的每一个时间间隔都是deltatime,那么就意味着每一帧内,游戏物体都能走1/80个单位长度,所以1秒走一个单位长度。

那么另一台实时FPS稳定且为50的电脑,它在1秒钟内闪过50帧画面,那么每一帧画面游戏物体能走1/50个单位长度,那最终也是1秒走完一个单位长度。

即不论1秒钟内分了多少帧,不论实时FPS稳不稳定,这一秒钟内的deltatime的和是一样的,都为1,所以一秒钟内的位移变化也是相同的。

因此,我们使用的过程中,以后想要游戏物体一秒移动多少个单位长度,那么仅需

一秒需要移动的单位长度*Time.deltatime

为什么不把移动代码写进FixedUpdate()方法中呢?

相信有一定实践基础的同学都知道下面这三个常用的Update()方法

Update()每帧调用就不多说了,LateUpdate()在所有的Update()方法执行完后再执行,通常在做相机跟随时会使用,即角色动了相机才动,这里也就不细说了;

FixedUpdate()每秒调用次数是一定的,但每帧调用的次数不是一定的,因游戏中每帧时间不一样,如果一帧计算的东西太多或者画面太复杂,这一帧的时间可能会比较长。

在unity中,初始固定更新的时间是0.02s,1秒执行50次,但是FixedUpdate的时间间隔可以在项目设置中更改,Edit->Project Setting->time 找到Fixed timestep,就可以修改,所以这种固定更新方法,和物理相关的操作代码写在其中会很方便。

相信大家看到这就猜到了这个问题的答案,没错,如果我们用了FixedUpdate()方法且默认更新参数,那么我们就把移动这个行为的FPS固定在了50,如果我们电脑的实时FPS偏高或者偏低,那么位移的长度也会按照比例改变,从而才能保证匀速的变化,因为它一帧的时间不确定,所以要按1帧的时间来实时调整的位移大小来保持速度不变,这样就会影响玩家的游戏体验,所以用Update()方法来实现这类功能实现会好一些。文章来源地址https://www.toymoban.com/news/detail-436221.html

到了这里,关于如何理解Unity中Time.deltatime的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【免费】win7 所有.net framework框架集合,免费下载,若要运行此应用程序,您必须首先安装net framework如何解决

    运行软件缺失框架: 那天我看见网上下载一个框架都要收费还要100大洋,现在真的是干啥都要钱,索性就整理了一个全库供大家下载,做点好事 .net 框架所有的 .net官网下载地址, 所有框架向下兼容,安装报错,就往上一个新版本下载装 微软官网:.net framework 3.5- 4.8框架 下

    2024年02月05日
    浏览(115)
  • 深入理解 Flink(四)Flink Time+WaterMark+Window 深入分析

    深入理解 Flink 系列文章已完结,总共八篇文章,直达链接: 深入理解 Flink (一)Flink 架构设计原理 深入理解 Flink (二)Flink StateBackend 和 Checkpoint 容错深入分析 深入理解 Flink (三)Flink 内核基础设施源码级原理详解 深入理解 Flink (四)Flink Time+WaterMark+Window 深入分析 深入

    2024年01月24日
    浏览(47)
  • Unity之Time类

    官方手册说明:https://docs.unity3d.com/cn/current/Manual/TimeFrameManagement.html 该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位) 是应用程序已运行的时间(以秒为单位)。它是只读的。 应用程序在每帧开始时接收当前的 Time.time,该值按帧递增。每个帧的 time调用

    2023年04月08日
    浏览(30)
  • Unity API详解——Time类

    Time类是Unity中获取时间信息的接口类,只有静态属性。本博客介绍Time类的一些静态属性。 在Time类中,涉及的静态属性有realtimeSinceStartup、smoothDeltaTime和time属性,在介绍time属性时涉及了Time类的多个其他属性的使用。 1、reltimeSinceStartup属性:程序运行实时时间 (1)基本语法

    2024年02月07日
    浏览(66)
  • C#、Unity:Time 时间与计时

    Time.time:(只读)表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。 Time.timeSinceLevelLoad:(只读)表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。 Time.deltaTime:(只读)表示从上一帧到当前帧时间,以秒为单位。 Time.fixedTime:(只读)表示以

    2024年02月19日
    浏览(37)
  • Unity中Shader的时间_Time

    Unity中Shader的时间_Time _Time.y 代表当前时间 在需要使用的地方直接 * _Time.y 或 x / z / w 测试代码: 一般来说 颜色的混合 一般使用 *= * _Time.y 的操作最好在顶点着色器内操作,节省性能 显示效果:

    2024年02月03日
    浏览(38)
  • Unity 中的旋转、targetFrameRate、 vSyncCount、Time

    1. 旋转: Unity 中的旋转用eulerAngle 表示,但在内部是以quaternion存储。 欧拉角旋转围绕三个轴进行三次独立旋转, 依次是z、x、y。 To convert from Euler angles to quaternions, you can use the Quaternion.Euler function. To convert a quaternion to Euler angles, you can use the Quaternion.eulerAngles function. 2. Tar

    2024年02月17日
    浏览(38)
  • 深入理解TDNN(Time Delay Neural Network)——兼谈x-vector网络结构

    TDNN(Time Delay Neural Network,时延神经网络)是用于处理序列数据的,比如:一段语音、一段文本 将TDNN和统计池化(Statistics Pooling)结合起来,正如x-vector的网络结构,可以处理任意长度的序列 TDNN出自Phoneme recognition using time-delay neural networks x-vector出自X-Vectors: Robust DNN Embeddin

    2023年04月09日
    浏览(35)
  • 详解Unity中Time类的用法与深入探究

    在游戏世界中,时间无疑是最为重要的参数,它是游戏世界能否正常运转的关键。一旦它出错,轻则卡顿,重则游戏世界崩坏。在使用Unity引擎创造的世界中,Time类无疑是必须要掌握的一个类,它是控制时间的关键,是造物主最为重要的权柄,有了它,我们就可以肆意的玩弄

    2024年02月08日
    浏览(60)
  • 小白水平理解面试经典题目LeetCode 121 Best Time to Buy and Sell Stock

    你好,2024年的第一个月,又是秋风萧瑟天气凉,草木摇落露为霜。.。。在这个特殊的时代,作为我们普通的一个打工人,我们用这道题,开启对这个不符合经济增长规律的股市反抗一把。 有这样一个数组 prices ,其中 prices[i] 是给定股票在 i th 天的价格。 我希望通过选择某

    2024年01月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包