Unity3d-通过简单示例来理解Time.deltaTime
转载文章:
Unity3d-通过简单示例来理解Time.deltaTime
在初学Unity3d时就不时会用上Time.deltaTime这个变量,初学Unity时不是很懂这个这个变量,那时的理解仅限于“要让数值按每秒多少进行变化时把数值乘以它就对了”
这么理解它其实也不算错
下面来简单理解这个变量,我们先看看Unity官方手册中对这个变量的描述(网址:https://docs.unity3d.com/ScriptReference/Time-deltaTime.html)
官方手册中说明:这个变量是按秒为单位,完成上一帧所用的时间。(只读。)
首先,这就意味着Time.deltaTime是一个变量,而不是一个常量,我想许多游戏玩家都会明白,一个游戏的FPS(游戏运行时每秒所运行的帧数)总是在变化的,FPS会因为电脑配置、场景变化或者游戏画面质量的设置而改变,总之,在玩游戏的时候,FPS是在不断变化的,可能配置高电脑FPS很稳定,但也会有变化时候
而Unity中,在每个新创建的C#脚本中都会有一个Update()方法,这个方法是每一帧都会运行一次的,如果我们在Update()方法简单设置一个物体的位移“transform.translate(new vector3(1,0,0))”,那么就意味着这个物体每一帧向X轴正方向移动1个单位的距离,这样一来,当游戏运行时,假设FPS稳定在60帧,那么就意味着这个物体每秒向X轴正方向移动60个单位,而当游戏环境发生变化,FPS降到30帧时,游戏物体就只能每秒向X轴正方向移动30个单位了
显然,一般情况下,我们是不希望数值这样变化的
因此,使用Time.deltaTime这个变量就显得十分重要,这个变量是指完成上一帧所用的时间,那么假设当游戏的FPS稳定为50帧时,Time.deltaTime的值则为0.02秒,而当FPS降低或者上升时,即使改变的很剧烈,也会有个过渡时间,假设FPS从50帧在一秒的时间里降到了25帧,那么Time.deltaTime这个变量也会跟着变化的剧烈程度从0.02秒升到0.04秒
假设,一个游戏开始时FPS只有5帧(方便计算),游戏的某个脚本的Update()方法有一个物体位移函数transform.translate(new vector3(1*Time.deltaTime,0,0)),之后FPS逐渐降到了1帧,那么降低的过程中,Time.deltaTime的变化将是这样的:
完成第一帧用了0.2秒,因此之后Time.deltaTime=0.2秒,
完成第二帧时,FPS已经降到了4帧,因此用了0.25秒,于是之后Time.deltaTime=0.25秒,
完成第三帧时,FPS已经降到了3帧,因此用了0.33秒,于是之后Time.deltaTime=0.33秒,
完成第四帧时,FPS已经降到了2帧,因此用了0.5秒,于是之后Time.deltaTime=0.5秒,
完成第五帧时,FPS已经降到了1帧,因此用了1.0秒,于是之后Time.deltaTime=1.0秒。
于是,完成第一帧时,物体向X轴正方向移动了1*0.2=0.2个单位,用时0.2秒,
完成第二帧时,物体向X轴正方向移动了1*0.2=0.2个单位,用时0.25秒,
完成第三帧时,物体向X轴正方向移动了1*0.25=0.25个单位,用时0.33秒,
完成第四帧时,物体向X轴正方向移动了1*0.33=0.33个单位,用时0.5秒,
完成第五帧时,物体向X轴正方向移动了1*0.5=0.5个单位,用时1.0秒.
上面的假设中,物体在2.28秒的时间里移动了1.48个单位,尽管与1单位/秒的速度有很大距离,但这里用的帧数是5帧降到1帧,当帧数为60帧甚至更高,改变幅度变小,物体的位移速度是可以约等于1单位/秒的。
以上假设只是为了方便理解,实际情况会更加复杂。
所以,当你在Update()方法中将transform.translate(new vector3(1,0,0))更改成transform.translate(new vector3(1*Time.deltaTime,0,0))后,这个物体的位移就基本能按每秒一个单位的速度向X轴正方向进行位移
当然,Unity中还有FixedUpdate()方法,不过这里只讲到Update()方法;
以上为我对Time.deltaTime的简单理解,如有不正确的地方,还望指教
Unity3d-通过简单示例来理解Time.deltaTime的更多相关文章
- Redis 安装与简单示例
Redis 安装与简单示例 一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或 ...
- pureMVC简单示例及其原理讲解五(Facade)
本节将讲述Facade,Proxy.Mediator.Command的统一管家.自定义Facade必须继承Facade,在本示例中自定义Facade名称为ApplicationFacade,这个名称也 ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- Optaplanner规划引擎的工作原理及简单示例(2)
开篇 在前面一篇关于规划引擎Optapalnner的文章里(Optaplanner规划引擎的工作原理及简单示例(1)),老农介绍了应用Optaplanner过程中需要掌握的一些基本概念,这些概念有且于 ...
- Python Thrift 简单示例
本文基于Thrift-0.10,使用Python实现服务器端,使用Java实现客户端,演示了Thrift RPC调用示例.Java客户端提供两个字符串参数,Python服务器端计算这两个字符串的相似度 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...
随机推荐
- fedora安装视频播放器
添加RPMFusion仓库后才能安装VLC.Mplayer,其他库中没有 直接 sudo dnf install vlc sudo dnf install mplayer
- October 30th, 2017 Week 44th Monday
When you're eighteen your emotions are violent, but they're not durable. 年轻的时候我们总是激情有余但耐心不足. I reall ...
- Oracle 12C Data Gurad RAC TO RAC
Oracle 12C RAC TO RAC Data Guard on RHEL7 0.环境说明 primary db physical standby 操作系统 rhel7 x86_64 rhe ...
- Mac svn使用学习-2-服务端
2.在mac环境下搭建一个SVN服务器环境 1)创建一个名为myCode的仓库——svnadmin命令 格式: svnadmin SUBCOMMAND REPOS_PATH [ARGS & O ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-2-命令
Docker Commands Docker provider公开了一些额外的vagrant命令,这些命令对于与Docker容器交互非常有用.这有助于你在vagrant之上的工作流程,这样你就可以在底 ...
- Underscore.js 入门
Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率.将它单独运用到任何一个页面.(另外,Underscore还可以被使用在Node.js运行环境.) 在学习Unders ...
- Javascript跨浏览器的事件对象
一.跨浏览器的事件对象 var EventUtil = { ///添加事件 addHandler: function (element, type, handler) { if (element.ad ...
- Java中 Vector的使用详解
Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(Vector)以实现类似动态数组的功能. 创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类 ...
- abp 嵌入资源(视图、css、js)的访问
最近在做的基于abp作为框架的一个项目,将一些属于框架功能的页面写在了一个独立程序集中,然后在web项目中引用该程序集达到访问框架页面目的. 这样一来发布web之后,在发布目录中是看不到写在另一个程序 ...
- gitlab webhook php exec 调用 shell 脚本。shell 脚本中调用 git pull 命令无法执行。
情况如下: 我在ubuntu server 14.04 上面安装了gitlab,来托管项目代码.然后想通过gitlab的web hook 功能来做测试服务器代码自动化更新代码功能.现在遇到一个问题:就 ...