如果我们把移动,跳跃等操作都放在Update函数里面我们会发现有时候我们按下跳跃键的时候角色并不会响应,对手感有很大的影响,所以我们结合Update和FixedUpdate实现准确的跳跃响应。
我们知道我们角色的移动,跳跃操作一般都要放在每一帧都要执行的函数里,每一帧执行的函数有很多,比如Update,LateUpdate,FixedUpdate等。LateUpdate我们暂且不提,简单说一下另外两个。
首先是Update,每一帧都会调用Update函数,这是帧更新的主要函数,但是我们要知道,对于不同的电脑每一秒执行的帧数是不一样的,比如一些比较老的电脑一秒执行30帧,好一点的电脑一秒执行40帧,所以为了要让不同的电脑也能实时的检测按键的响应,我们就要用到FixedUpdate函数。
FixedUpdate是一个固定的时间来执行的,如果没有修改的情况下是0.02秒执行一次FixedUpdate函数,也就是说一秒钟执行50次,我们也可以修改间隔时间,但是注意,这个值只是一个请求,机子可能达不到这个速度。因此,Update和FixedUpdate其实是完全独立的两个函数。当Update执行了一次时,FixedUpdate可能已经执行了两次、三次甚至一次都没有执行过。根据官方手册,所有和物理有关的都会放在FixedUpdate里面,比如Rigidbody。
我们介绍Update和FixedUpdate就是因为实现完美跳跃就是需要通过这两个函数实现的,我们把GetButtonDown放在Update里能够确保在不同的机器上我们按下跳跃键的时候,电脑可以给我们一个实时的那一帧的调用这个按键的反馈。而FixedUpdate会在固定时间执行,来检测按键按下的这个命令是否被执行。所以通过结合Update和FixedUpdate来实现这个操作。
using UnityEngine;
public class Test:MonoBehaviour{
bool action = false;
private Rigidbody2D rb;
public float jumpForce;
void Start(){
rb=GetComponent();
}
void Update(){
if(Input.GetKeyDown(KeyCode.Space)){
action = true;
}
}
void FixedUpdate(){
if(action){
rb.velocity=new Vector2(rb.velocity.x,jumpForce);
action = false;
}
}
}
上面,我们用一个boolean值来控制开关。由于Update每一帧都会调用,因此可以保证所有的输入都可以被响应。
当然这只是一份伪代码,因为我们并没有考虑地面或者多段跳等情况,所以具体的代码还有具体情况分析