问题
当操作一个角色连续进行一些动作时,如跳跃,攻击时,有时会出现卡手的感觉。
解决
一般角色执行一个动作时,为了和动画配合和防止该动作再次执行打断上一个正在执行的动作,代码执行时会加上一个锁。
例如跳跃动作的执行
if(jumpStopped){
jumpStart(); 执行跳跃
jumpStopped = false;
jumpStartAt = Time.time;
}文章来源地址https://www.toymoban.com/news/detail-819564.html
这是为了防止这个跳跃动作在短时间内反复执行,同时也是为了和跳跃动画配合,一般解锁的时间和动画时间相等。
假如这个跳跃动画的时间是0.5s,解开锁的时间也是0.5s,解锁的代码如下所示,
if(!jumpStopped){
if(Time.time >= jumpStartAt + 0.5s){
jumpStopped = true;
}
}
当跳跃动画播放结束的时候,这个跳跃动作的锁也解开了,可以再次执行跳跃动作,上述代码中是使用了时间作为开锁的条件,当然也可以使用其它的条件进行开锁,如检测角色在地面上的条件。
现在回归主题,由上面介绍了给动作上锁和动画时间,现在想要解决问题还需要玩家的输入,玩家的输入是一个时间点。一般玩家操控角色执行一个跳跃动作后,玩家会从屏幕上角色的动画播放程度判断动画是否结束,当动画快要结束时,玩家要快速再次使角色跳跃,将输入space,但玩家的时机判断毕竟是有些偏差的,可能时机抓的没有那么准,这是的动画还没有结束,可能就差个0.09才结束,但是毕竟很接近了,这时玩家就觉得我明明已经在动画结束时再次跳跃动作了,为什么角色没有反应,可能玩家就感觉卡手了。
由上述说明了解锁时间与动画时间相同,会由卡手的感觉。请想象一下解锁时间与动画时间配置不同情况,1.解锁时间大于动画时间情况,解锁时间1s,动画时0.5s,玩家看着跳跃动画结束了想要再次跳跃,按了space好一会角色都没反应.
2.解锁时间小于动画时间,解锁时间0.5s,动画时间1s,玩家在角色还没结束动画的时候,再次按了space输入,角色再次执行了跳跃.
想要不卡手,第一种方法是使锁时间小于动画时间,第二中是使用输入缓冲,把输入从时间点变成时间段,如图
使用缓冲输入
ExtendBuffer(){
if(!buffering){
buffering = true;
bufferEndAt = Time.time + bufferDurationSecond;
}
}
HandleBuffer(){
if(buffering && jumpStopped){
if(bufferEndAt > Time.time){
jumpStart();
}else{ buffering = false }
}文章来源:https://www.toymoban.com/news/detail-819564.html
}
到了这里,关于unity 动画卡顿,操作角色时有卡手感的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!