以单位/秒表示 Ruby 的移动速度

时间和帧率

 
目前,Unity 每秒至少渲染 60 帧。让我们调整此设置:
 
 
1.在代码编辑器中,将以下两行添加到 Start 函数中:
 
public class RubyController : MonoBehaviour
{
    // 在第一次帧更新之前调用 Start
    void Start()
    { 
        QualitySettings.vSyncCount = 0;
        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;
    }
}

 

 
经过此调整后,Unity 将每秒渲染 10 帧
 
 
2.返回到 Unity 编辑器
 
 
3.按下 Play 按钮以进入运行模式4.尝试移动 Ruby。你现在可能会感觉游戏很慢,并且 Ruby 的行动速度大大降低。
 
 
为什么会这样?
 
 
如果查看代码,你会发现每次 Unity 调用 Update 函数时,都会将 Ruby 移动 0.1 个单位,这意味着在每一
 
 
position.x = position.x + 0.1f * horizontal;
 
 
 
如果游戏以每秒 60 帧的速度运行,那么 Ruby 将移动 0.1 * 60,因此每秒移动 6 个单位。但是,如果游戏以每秒 10 帧的速度运行,就像刚刚让游戏运行的那样,
那么 Ruby 仅移动 0.1 * 10,因此每秒移动 1 个单位! 如果一个玩家的计算机非常陈旧,只能以每秒 30 帧的速度运行游戏,而另一个玩家的计算机能以每秒 120 帧的速度运行游戏,
那么这两个玩家的主角的移动速度会有很大差异。这样就会使游戏的难易程度提高或降低,具体取决于运行游戏的计算机。
 
要解决此问题,你需要以单位/秒来表示 Ruby 的移动速度,而不是采用单位/帧(目前采用此设置)。
为此,你需要通过将移动速度乘以 Unity 渲染一帧所需的时间来更改移动速度。如果游戏以每秒 10 帧的速度运行,则每帧耗时 0.1 秒。如果游戏以每秒 60 帧的速度运行,则每帧耗时 0.017 秒
如果将移动速度乘以该时间值,则移动速度将以秒表示。
public class RubyController : MonoBehaviour
{
   // 在第一次帧更新之前调用 Start
   void Start()
   { 
       //QualitySettings.vSyncCount = 0;
       //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 * Time.deltaTime;
       position.y = position.y + 0.1f * vertical * Time.deltaTime;
       transform.position = position;
   }
}

 

public class RubyController : MonoBehaviour
{
   // 在第一次帧更新之前调用 Start
   void Start()
   {
   }
   // 每帧调用一次 Update
   void Update()
   {
       float horizontal = Input.GetAxis("Horizontal");
       float vertical = Input.GetAxis("Vertical");
       Vector2 position = transform.position;
       position.x = position.x + 3.0f * horizontal * Time.deltaTime;
       position.y = position.y + 3.0f * vertical * Time.deltaTime;
       transform.position = position;
   }
}

 

 

posted on 2021-12-06 14:44  ZhYQ_note  阅读(96)  评论(0)    收藏  举报

导航