Unity--时间和帧率

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


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,游戏引擎,c#)