Unity基础课程之物理引擎7-物理运动应该在FixedUpdate执行

在第2章里提到过FixedUpdate,当时解释它是物理更新,会保证稳定的时间间隔。所谓Fixed的意思就是“固定的、稳定的”。获取两次Update之间的时间间隔用Time.deltaTime,获取两次FixedUpdate之间的时间间隔用Time.fixedDeltaTime。当设备运行不流畅、帧率下降时,会发现Time.deltaTime变大了(即帧与帧之间的时间间隔变长)

但是Time.fixedDeltaTime却不会。一般Time.fixedDeltaTime会是一个固定的值(默认为0.02秒,可以通过选择主菜单的Edit→Project Settings→Time来修改)。

FixedUpdate的作用和原理解释起来不是很容易,笔者尽可能详细说明。要理解FixedUpdate,需要先理解“物理系统对于时间是非常敏感的”。下面举两个例子说明物理系统对于时间的敏感性。

(1)子弹从枪口射出,0.1秒后击中物体。假如物理更新频率不稳定,导致子弹接触物体时并没有及时检测,再晚0.02秒,子弹就已经穿过了物体。这样子弹就错过了碰撞的时机,导致后续结果完全不同。

(2)在Unity中做一个在地上弹跳的皮球,使用物理材质,弹性设置为0.8。由于没有外力作用,弹跳高度会越来越低。搭建场景做一个简单的实验,通过实验可得:默认物理帧率为50帧时,球会弹跳8次;物理帧率降低为20帧时,小球弹跳9次;物理帧率升高到100帧时,小球弹跳6次;而当物理帧率降低到10帧以下时,小球会穿过地板。

事实证明,物理更新的时间间隔会极大影响物理效果的正确性,那么为什么不把默认的50帧变得更大一些呢?这是因为物理更新次数越高,硬件的计算负担就越重。引擎设计师不得不在性能和正确性上做出取舍,默认50帧是实验验证过的最合适的选择。除此之外,物理更新不仅要保证频率高,还要保证频率稳。不稳定的频率一样会带来糟糕的效果,因此所有的物理系统处理都在引擎循环中的一个专门环节上完成。

有读者可能会深想一步:如果机器硬件确实卡顿了,例如手机或计算机正处于繁忙、无响应的状态,物理更新还能保证更新频率吗?答案是有办法间接保证这一点。

简单来说,游戏世界的时间是一个虚拟的概念,一定程度上可以人为控制。如果在某个时刻T,硬件卡顿了0.06秒,正好错过了3次FixedUpdate()的调用时机,那么在下一次有机会运行的时候,FixedUpdate()函数会补上之前错过的3次,连续执行4次,而且还会“假装”这4次的调用时间点分别是T+0.02s、T+0.04s、T+0.06s、T+0.08s。通过这样的机制,就能确保无论硬件运行是否稳定,游戏都能保证“稳定”的物理更新,避免出现奇怪的结果。作为对比,Update()函数没有这个特性!

小技巧

解决刚体移动过快的问题为了避免游戏中子弹飞行过快,错过了碰撞体或触发器,Unity的刚体具有一个“Collision Detection(碰撞检测方式)”选项,将默认的“Discrete(离散)”改为“Continuous(连续)”,就可以避免错误碰撞。它的原理大致是,高速飞行的子弹的路径在空间中是一些离散的点,通过在这些路径点之间连线,检查连线是否碰撞到物体,就能知道子弹是否碰撞到物体。

 在第2章的游戏实例中,讲解过“跟随式摄像机”的制作方法。在当时的设计里,玩家角色是在Update()函数中移动的,摄像机也是在Update()函数或LateUpdate()函数中移动的。

但是,如果玩家角色是一个通过对刚体施加力控制的小球,就可能会出现一些小问题。尝试一下会发现,如果小球是物理移动,而摄像机在Update()函数或LateUpdate()函数中移动,那么会导致屏幕有抖动的情况,画面不是很稳定,小球运动越快则抖动越明显。这是由于刚体因速度或受力而产生的运动,属于物理更新。而Update()函数和LateUpdate()函数不属于物理更新,这其中有着微妙的时间差。要解决这个问题并不难,针对物理移动的刚体,只要将跟随摄像机的移动也编写到FixedUpdate()里,抖动的问题就会消失了。

@以上内容来自《Unity3d 脚本编程与游戏开发》书籍 

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

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

相关文章

日志管理工具Zap笔记

文章目录 Uber-go Zap日志库为什么选择 Zap配置 Zap Logger1. Logger2. SugaredLogger 定制logger1. 将日志写入文件而不是终端2. 将JSON Encoder更改为普通的Log Encoder3. 更改时间编码并添加调用者详细信息4. AddCallerSkip5. 将err日志单独输出到文件 使用Lumberjack进行日…

【安全】 Java 过滤器 解决存储型xss攻击问题

文章目录 XSS简介什么是XSS?分类反射型存储型 XSS(cross site script)跨站脚本攻击攻击场景解决方案 XSS简介 跨站脚本( cross site script )为了避免与样式css(Cascading Style Sheets层叠样式表)混淆,所以简称为XSS。 XSS是一种经常出现在web应用中的计算机安全…

MacOS安装conda

下载conda 地址https://repo.anaconda.com/miniconda/ 选择合适的安装文件下载 运行安装 执行命令安装 bash Miniconda3-latest-MacOSX-arm64.sh 设置环境变量 echo export PATH"/Users/your_user_name/miniconda3/bin:$PATH" >> ~/.zshrc source ~/.zsh…

高级岗位面试问题

自我介绍 【我是谁】 、【我做过什么】、【我会什么】 面试官您好,我叫xxx,来自江西。20XX年毕业于XXXXX大学,已有X年软件测试工作经验,之前在XX家公司担任测试工程师 最近一家公司我主要负责了两个项目的测试,分别为XXXXX的编写,测试用例的设计,测试环境的搭建以及测…

nextjs构建服务端渲染,同时使用Material UI进行项目配置

一、创建一个next项目 使用create-next-app来启动一个新的Next.js应用,它会自动为你设置好一切 运行命令: npx create-next-applatest 执行结果如下: 启动项目: pnpm dev 执行结果: 启动成功! 二、安装Mater…

Demo29单词规律

/**给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern "abba", s "do…

使用 Python 中的小波变换信号驾驭股票价格的波动

一、简介 股票上涨和下跌,创造出像海浪一样难以预测的模式和走势。然而,就像科学家通过了解下面的水流来预测波浪的运动一样,我们也可以使用类似的工具破译股票市场的一些模式。 通过利用小波变换的力量,我们深入表面,试图揭示驱动股价的深层原因。这段旅程不仅仅涉及数字…

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录 写在前面1. strlen1.1 函数介绍1.2 模拟实现 2. strcpy2.1 函数介绍2.2 模拟实现 3. strcat3.1 函数介绍3.2 模拟实现 4. strcmp4.1 函数介绍4.2 模拟实现 写在前面 本篇文章介绍了C语言中常用的字符串处理函数,包括strlen、strcpy、strcat和strcmp。文章…

【vue3+ts】项目初始化

1、winr呼出cmd,输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar,安装前面两个 如果安装了vue2的插件vetur,要禁用掉,否则插件会冲突

Vue-2.6Vue异步更新和$nextTick

Vue是异步更新DOM,为了提升性能。 同步更新类似于刷新,更新一个内容要把所有的内容都刷新一遍。而异步则只刷新更新或修改的部分,不重新将所有内容全部刷新一遍。异步可以减少服务器的压力和等待时间。 $nextTick:等DOM更新后,立刻执行此方…

WebStorm 自定义创建Vue2.0的模板

打开 WebStorm&#xff0c;选择 File --> Settings&#xff1b;在左侧菜单中选择 File and Code Templates&#xff1b;在右侧窗口中&#xff0c;选择 Vue Single File Component&#xff1b;在 Code 标签下&#xff0c;替换默认的代码段为以下代码&#xff1a; <templa…

使用react-router-dom在新标签页打开链接,而不是本页跳转

一般单页面应用&#xff0c;当你使用useNavigate时候的时候&#xff0c;用useNavigate来跳转&#xff0c;只能是在当前页面刷新跳转的&#xff0c;要想单独在一个tab页打开新页面&#xff0c;大概用三种方式。 第一种 使用link标签&#xff0c;配合target实现 <Link to&q…

2023年中国石油催化裂化剂行业供需、竞争格局及市场规模分析[图]

催化裂化是石油炼制过程之一&#xff0c;是在热和催化剂的作用下使重质油发生裂化反应&#xff0c;转变为裂化气、汽油和柴油等的过程。中国原油加工量在这一阶段逐年提升&#xff0c;2022年国内原油加工量67589.7万吨。 2016-2022年中国原油加工量情况 资料来源&#xff1a;国…

linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04

write&#xff1a;xxx has messages disabled 问题 被这问题折磨了好久&#xff0c;搜都搜不到&#xff0c;还是灵机一动想到的。 很多 帖子说&#xff0c;要使用 mesg y用了还是没有用&#xff0c;后面我登录了很多用户&#xff0c;发现只有root用户可以给别的用户使用write…

el-data-picker限制日期可选范围

<el-date-pickerclass"date"v-model"date"type"date"change"dateChange"value-format"yyyy-MM-dd"format"yyyy-MM-dd"placeholder"选择日期":picker-options"datePickerOptions"></…

LCR 078. 合并 K 个升序链表

LCR 078. 合并 K 个升序链表 题目链接&#xff1a;LCR 078. 合并 K 个升序链表 代码如下&#xff1a; class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {ListNode *lsnullptr;for(int i0;i<lists.size();i){lsmergeList(ls,lists[i])…

【重拾C语言】八、表单数据组织——结构体(类型、类型别名、直接/间接访问;典例:复数、成绩单)

目录 前言 八、结构体 8.1 结构体类型 8.2 结构体类型名 8.2.1 typedef关键字 8.2.1 结构体类型别名 8.3 结构体变量 8.3.1 使用结构体类型引用 8.3.2 使用结构体类型定义 8.3.3 使用typedef定义的结构体类型别名 8.4 访问结构体变量 8.4.1 直接成员选择表达式 8.…

JOSEF约瑟 矿用一般型选择性漏电继电器 LXY2-660 Φ45 JKY1-660

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…

uni-app 实现考勤打卡功能

一、在页面中引入地图组件 <map id"map" style"width: 100%; height: 100%" :latitude"myLatitude" :longitude"myLongitude" :circles"circles" :markers"markers"> </map>属性名类型说明longitudeN…

python 实现MA指标

交易中均线是非常常用的指标&#xff0c;有指标终于均线的说法&#xff0c;利用均线指标可以构造更多基于价格的指标。目前广大的交易者多用python打造自已的相关交易工具&#xff0c;下面是我利用python产现的MA指标计算代码&#xff1a; def read_ma(self, stock_dat, *windo…