前些天研究了一下在Unity中移动的内容。
游戏中的操纵通常是拥有一个刚体的,所以让它移动的方式我个人觉得给刚体施加力更好一点。
在写跳跃逻辑的时候发现了这么一种写法,感觉挺有意思的。
desiredJump |= Input.GetButtonDown("Jump");
这个是在Update里面实时判断按键的。通常update是检测和控制较好,移动的话放在FixedUpdate里面,这样比较好,我之前的写法是
desiredJump = Input.GetButtonDown("Jump");
乍一看是不是没有什么区别?但是因为Update的执行次数受到电脑性能影响,FixedUpdate通常是固定的0.02s一次,所以会产生一个插值,比如一秒内Update执行了一千次那么这个desiredJump=true的时候只有一次,然后立刻变成false了,如果它为true的时候会调用跳跃的方法,但是fixedUpdate和Update之间有插值一秒一千次和一秒一百次,会出现执行十次Updata才去执行一次FixedUpdate,这样第一次Update里面变成了true第二次变成了false,所以FixedUpdate并没有检测到可以跳跃的条件!
这就导致操作不能实时检测到;
曾经的解决办法是
if(input.getmousebuttondown(space))
jump=true;
if(input.getmousebuttonup(space))
jump=false
这样的方式固然能解决这个问题,但是有点繁琐。
所以使用|=的这个判断更加好用!
|=是当两边条件都是假的时候,才是假!和或运算一样
有1就为1全0才是0!
void Update(){
desiredJump |= Input.GetButtonDown("Jump");
}
void FixedUpdate()
{
if (desiredJump)
{
desiredJump = false;
Jump();
}
}
这样在第一次进入跳跃判断的时候,如果为真但是没有进入方法也不用担心!因为只有进入了方法执行了desiredJump = false;才能变成false;
因为a|=b的时候,如果a是true,那么无论b是true还是false,最后的结果都是true!