当前位置: 首页 > news >正文

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述

游戏暂停的功能是通过设置timeScale=0实现的,不过在暂停游戏的时候,需要对角色进行预览和设置,为了实现这个功能,是通过鼠标控制相机的操作,为了使相机的操作丝滑,获取鼠标操作系数乘以Time.deltaTime 了,同时对数值进行了平滑操作(Mathf.SmoothDamp和Mathf.SmoothDampAngle),采用了具体代码可以参考https://blog.csdn.net/qq_33789001/article/details/120551521。
代码片段如下:

//根据鼠标系数获取距离目标值
tdis -= Input.GetAxis("Mouse ScrollWheel") * disMoveSpd * Time.deltaTime;
//平滑处理距离值
dis = Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f);//根据鼠标系数获取旋转目标值
troty = troty + Input.GetAxis("Mouse X") * XSens * Time.deltaTime;
trotx = trotx + Input.GetAxis("Mouse Y") * YSens * Time.deltaTime;
//平滑处理旋转值
rotx = Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f);  
roty = Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f);

当游戏暂停后(timeScale=0),Time.deltaTime的数值都变成0了。

解决办法

解决的思路就是在暂停时不用Time.deltaTime,而是通过固定帧率计算出这个值。比如假设游戏是60帧,那么数值就是1/60 = 0.0167f,这个数值是根据帧率越大,而值越小的,120帧就是0.008333。那么我就按60帧手动赋值0.0167f。代码修改如下:

//根据鼠标系数获取距离目标值
tdis -= Input.GetAxis("Mouse ScrollWheel") * disMoveSpd *  0.0167f;
//根据鼠标系数获取旋转目标值
troty = troty + Input.GetAxis("Mouse X") * XSens *  0.0167f;
trotx = trotx + Input.GetAxis("Mouse Y") * YSens *  0.0167f;

这样能解决Time.deltaTime为0,鼠标的操作都失效的问题。
然而,运行后发现部分操作还是会失效,而且操作过程中会出现这样的报错:

is not valid. Input position is { NaN, NaN, NaN }.

经过研究发现 Mathf.SmoothDampAngle和Mathf.SmoothDamp两个函数与Time.deltaTime仍有关联,他们的说明如下
在这里插入图片描述
在这里插入图片描述

它们都有deltaTime参数,这个时间是上次调用这个函数的到这次调用的间隔时间,默认为Time.deltaTime。因为之前调用这两个函数都没有进行这个传参默认是Time.deltaTime这种情况下为0。所以在这种情况下还需要传入maxSpeed和deltaTime参数。经过修改如下:

//平滑处理距离值
dis = Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f, 2, 0.0167f);//平滑处理旋转值
rotx = Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f, 2, 0.0167f);  
roty = Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f, 2, 0.0167f);

做了上述修改可以正常操作:
在这里插入图片描述

相关文章:

  • [c++刷题]贪心算法.N01
  • 揭秘无局放电源:定义、工作原理及其在工业设备中的重要性
  • 鸿蒙开发:【进程模型概述】
  • PHP杂货铺家庭在线记账理财管理系统源码
  • kettle无法启动问题_PENTAHO_JAVA_HOME
  • Dify知识库接入微信
  • 解释React中的“端口(Portals)”是什么,以及如何使用它来渲染子节点到DOM树以外的部分。
  • 亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗?
  • 【代码仓库提交大文件,用Git LFS!】
  • 算法训练营day66-孤岛总面积-沉没孤岛-水流问题-建造最大岛屿
  • Xcode will continue when the operation completes
  • MySQL 数据库 Navicat Premium 16.01 安装教程
  • Zookeeper基础教程
  • 计算机网络:网络层 - IP数据报的转发
  • docker方式启动的redis如何使用自定义配置文件
  • CentOS 7 修改主机名
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java多线程(4):使用线程池执行定时任务
  • laravel with 查询列表限制条数
  • mysql 数据库四种事务隔离级别
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python打包系统简单入门
  • session共享问题解决方案
  • vuex 学习笔记 01
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 大型网站性能监测、分析与优化常见问题QA
  • 翻译:Hystrix - How To Use
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 诡异!React stopPropagation失灵
  • 基于web的全景—— Pannellum小试
  • 为什么要用IPython/Jupyter?
  • 我感觉这是史上最牛的防sql注入方法类
  • 正则表达式小结
  • 转载:[译] 内容加速黑科技趣谈
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 选择阿里云数据库HBase版十大理由
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 数仓建模:如何构建主题宽表模型?
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (12)目标检测_SSD基于pytorch搭建代码
  • (LLM) 很笨
  • (SpringBoot)第二章:Spring创建和使用
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)为什么要选择C++
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)菜鸟学数据库(三)——存储过程
  • .bashrc在哪里,alias妙用
  • .gitignore文件—git忽略文件
  • .NET WPF 抖动动画
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 中Partitioner static与dynamic的性能对比