本文仅为个人学习笔记,总结和分享,难免存在瑕疵与言论不严谨,若有缺漏务必留言告知,文章将会第一时间修正,以免误导。


unity中如果不对代码进行优化,则Update函数中的代码会随帧数的增加而增加运行次数


public class RubyController : MonoBehaviour{  // 每帧调用一次 Update
// 让游戏对象每帧右移 0.1  void Update()   {        // 获取水平输入,按向左,会获得 -1.0 f ; 按向右,会获得 1.0 f//input类管理用户输入//GetAxis是获取轴//Horizontal水平相关操作,向左则会 -1.0 f,向右+1.0f   float horizontal = Input.GetAxis("Horizontal");      // 获取垂直输入,按向下,会获得 -1.0 f ; 按向上,会获得 1.0 f//Vertical向上向下不同     float vertical = Input.GetAxis("Vertical");        // 获取对象当前位置//Vector是unity自带类    //创建一个Vector2类的position对象,并且用transform类表示该对象的坐标值,存入position对象     Vector2 position = transform.position;       // 更改位置//把positon对象的x值+0.1,并且存入      position.x = position.x + 0.1f * horizontal;      position.y = position.y + 0.1f * vertical;        // 新位置给游戏对象// 将更改后的坐标存入原始坐标达到更改    transform.position = position;   }
}
如上代码,如果游戏以每秒60帧的速度运行,那么角色将会每秒移动60*0.1。如果每秒10帧,那么将会每秒移动10*0.1。
即Position.x(新的x轴位置)=原有x轴位置+速度0.1f*帧数(60帧则为*60)
这会导致不同机器,不同情况下运行同一游戏速度不一致的问题, 使游戏的难易程度提高或降低
但也并非所有情况均会导致游戏变糟, 《生化危机2:重制版》中利用每一帧判定一次伤害做到了近战武器攻击敌人,玩家可以通过增加武器停留在敌对目标体内的时间来达到打出更高伤害(模拟了现实生活中,小刀攻击敌人并非是每次攻击才能打出伤害,而是通过停留在敌人体内时间越长伤害越高),但此法仅适用于帧数锁定的主机端,帧数如果不锁定则可能出现每次攻击伤害忽高忽低。

解法1:锁帧
并不推荐
public class RubyController : MonoBehaviour{   // 在第一次帧用之前调用Start函数   void Start()   {       // 只有将垂直同步计数设置为0,才能锁帧,否则锁帧的代码无效    // 垂直同步的作用就是显著减少游戏画面撕裂、跳帧,因为画面的渲染不是整个画面一同渲染的,而是逐行或逐列渲染的,能够让FPS保持与显示屏的刷新率相同。     QualitySettings.vSyncCount = 0;     //设定应用程序帧数为10    Application.targetFrameRate = 10;  }   // 每帧调用一次 Update  void Update()   {      float horizontal = Input.GetAxis("Horizontal");     float vertical = Input.GetAxis("Vertical");      Vector2 position = transform.position;      position.x = position.x + 0.1f * horizontal;       position.y = position.y + 0.1f * vertical;      transform.position = position;   }
}
锁帧反而会导致强力的设备运行效果不满意,同时垂直同步的开启会让射击类游戏存在严重画面延迟

解法2:以单位/秒表示移动速度,而不是单位/帧(默认为此)表示
public class RubyController : MonoBehaviour{
// 定义一个公有float形对象,speed表示主角移动速度,使其可直接再unity中修改而不用手动调整
public float speed=0.1f;
// 每帧调用一次Update   void Update()
{      float horizontal = Input.GetAxis("Horizontal");    float vertical = Input.GetAxis("Vertical");    Vector2 position = transform.position;      position.x = position.x + speed * horizontal * Time.deltaTime;     position.y = position.y + speed * vertical * Time.deltaTime;      transform.position = position;  }
}
Time.deltaTime--增量时间
增量时间随着每秒帧数变化而随之变化
1秒30帧,那增量时间就是 1/30 秒
1秒60帧,那增量时间就是 1/60 秒
1秒166帧,那增量时间就是 1/166 秒
这样,速度*时间增量就会让每秒移动量不因帧数的改变而变得忽高忽低,而是帧数高则移速低,帧数低移速高

Update函数是每帧执行一次,那么每过一帧耗费的时间就是 增量时间
1秒内Update执行的次数,就是1秒内执行的总帧数

参考资料:
B站up主chutianbo的gitee文档 GameDesign/Unity/官方教程项目系列/官方教程05_2D游戏/RubyAdventure/01-Ruby冒险2D初学者教程.md · chutianshu/xyz-s-free-course-for-full-stack-web-dev - Gitee.com时间和帧率部分
unity官方文档:时间增量:Unity - Scripting API: Time.deltaTime (unity3d.com) 垂直同步:Unity - Scripting API: QualitySettings.vSyncCount (unity3d.com)
知乎文章《FPS影响小刀攻击力?《生化危机2:重制版》那些好玩的事》 FPS影响小刀攻击力?《生化危机2:重制版》那些好玩的事 - 知乎 (zhihu.com)
百度百科:垂直同步 垂直同步_百度百科 (baidu.com)
CSDN: Unity增量时间Time.deltaTime详解 (101条消息) Unity增量时间Time.deltaTime详解_Chinarcsdn的博客-CSDN博客_deltatime

Unity--时间和帧率相关推荐

  1. 简单Unity时间架构设计(克洛诺斯之匙)

    好吧,这次的题目有点标题党之嫌,提出这个设计,是因为最近玩了鬼泣,其中有一个关卡叫做"为了自己的主人",任务中,需要利用克洛诺斯之匙将时间变慢,便于通过激光镇. 使用克洛诺斯之匙之 ...

  2. unity,时间控制插件vp_Timer简单介绍

    游戏开发中经常会用到定时器的东西,然而unity的协程也能达到我们的需求,但是这东西能少用,尽量少用 我们项目中一直在用vp_Timer.简单好用,源代码也很简单,感兴趣的可以直接看源码 这里只说几个 ...

  3. Unity垂直同步:帧率和刷新率

    帧率(英语:frame rate)是用于测量显示帧数的度量.测量单位为"每秒显示帧数"(frame per second,FPS)或"赫兹",一般来说FPS用于 ...

  4. 【HSJFramework】Unity时间管理TimeManger计时器

    目录 一:介绍 二:计时器Timer类的编写 三:计时器管理TimerManager类的编写 四:使用方法 一:介绍 这里我们使用List来管理定义的所有计时器Timer,首先就是需要构建计时器的完整 ...

  5. Unity 实时显示帧率

    public class FPS: MonoBehaviour { public static float f_Fps; public float f_UpdateInterval = 0.5f; / ...

  6. Unity 时间管理工具

    之前写了一个计时器,用一个单例 TimeManager 中的一个存储委托的字典,在Update反复执行实现,调用方法注册实现,倒计时为0时调用委托,同时从字典中移除,注销没有想到好方法,凑合着先用. ...

  7. unity 时间换算 时分秒

    private static int OneHour = 3600; private static int OneMininue = 60; //把秒变成时:分:秒         public st ...

  8. unity时间暂停动画不受影响

  9. 3dmax动画模型导入unity 帧率问题

    unity 手机移动动画帧率默认应该是30fps,而魔兽模型导入3dmax的动画帧率是300fps,在将魔兽模型导入unity时,动画模型是在一长时间轴上即成了所有的动画片段,如果需要从中选取的话,可 ...

  10. Unity帧率、屏幕刷新率

    帧率 帧:影像动画中最小单位的单副影像画面,相当于电影胶片上的每一个镜头 帧率:图形处理器每秒更新帧的次数 帧率单位:帧每秒(F/S, Frame pre second,简称 FPS) 帧率(Fram ...

最新文章

  1. [Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work
  2. python 最简单的实现适配器设计模式
  3. emplace_back和push_back区别
  4. 实现多线程Callable接口
  5. myeclipse 2017 CI 中如何修改Servlet模板
  6. micropython和python区别-什么是MicroPython?
  7. 深入了解“TXTSETUP.SIF”
  8. Python遥感图像处理基础篇(三):arcpy遥感图像镶嵌批量处理_镶嵌至新栅格
  9. 关于sybase数据库的连接
  10. helm install Error: timed out waiting for the condition
  11. 动态监控网卡流量异常
  12. 计算机在神经生物学中的应用,计算机视觉技术的应用论文
  13. CVPR 2021 华南理工和微信的Transformer:UP-DETR无监督预训练检测器
  14. 树莓派基础实验20:火焰报警传感器实验
  15. 【无标题】汇编实验-学生成绩管理系统
  16. SNS交换机(OEM博科FC交换机)怎样设置密码策略
  17. pytorch_sparse教程
  18. Abaqus中实现对N个节点施加不同荷载-以位移为例
  19. morph 原理实现
  20. WebGl之.wrl生成.stl文件

热门文章

  1. 【系统分析师之路】2022上综合知识历年真题
  2. 2018年北京十大商业品牌榜揭晓,稻香村、大董、京东上榜
  3. MVC+WCF框架下广告位管理——文件上传
  4. @TableId can‘t more than one in Class: “com.example.CloseContactSearcher.entity.Activity“.
  5. 关于spark的sample()算子参数详解
  6. WAV音乐档格式(一)
  7. Android酷炫实用的开源框架(UI框架)
  8. Linux 命令(178)—— pkill 命令
  9. 另类解读:2011年1月CNNIC第27次互联网络发展状况统计报告
  10. Error: invalid constant (6bf) after fixup