您当前所在位置: > 爆料站 > 君子堂

输入缓冲与土狼时间的讨论与实现

时间:2021-09-23 20:00:37  来源:  作者:网络转载
hope时间胶囊

hope时间胶囊

大小:70.1M更新:2021-01-21

分类:办公学习

个人学习积累中,如有任何问题与错误,欢迎指出与讨论。

这系列将会记录我在搭建自己的 2D 平台游戏时遇到的一些问题与解决方案,核心目的均为更好的游戏体验与更棒的代码逻辑结构。所有代码基于 C# 与 Unity。


跳跃的手感能衡量一个 2D 平台游戏的好坏。——鲁迅

不知道你是处理玩家跳跃的判断条件的?反正就我而言,射线或者子物体检测地面图层:如果角色在地面上,则允许跳跃;反之则不允许。

但是这样在游玩的时候会导致一个问题:当你想要连跳时,单按跳跃键,你以为自己已经落到了地面,而实际上,你还在空中,从而造成了“按键失灵”的问题。这对于玩家的游玩体验有着相当大的影响。

而解决这个问题的方法,就是允许指令的预输入,在预输入后的一段时间内,若检测到条件满足,再执行操作——即“输入缓冲”。

不过,在介绍输入缓冲的方法前,我们先来了解一下计时器。

计时器

计时器,顾名思义,是为了计算一段时间,当计时器到达设定条件后,会执行相应的操作。

Unity 提供了一个类似的方法,

  1. Invoke("方法名(无参), 延迟时间")
复制代码

或者

  1. InvokeRepeating("方法名(无参), 延迟时间, 间隔时间")
复制代码

用于重复调用。但是限制较多,且不适用于我们的输入缓冲:它只能做到延迟调用,而不能在延迟的这段时间内一满足条件就调用。

另外还可以在协程中使用

  1. yield return new WaitForSeconds(具体秒数);
复制代码

等方法实现。同样的问题是,它也只能实现延迟调用。

那么,我们到底该怎么定义一个可用于输入缓冲的计时器呢?以下是个人常用的一种写法。

  1. <p>// 所用变量</p><p>private float timer;           // 计时器</p><p>private float timer_max = 2f;  // 限定时间</p><p>
  2. </p><p>// 初始化,一般在按下按键时执行,实现预输入</p><p>timer = timer_max;</p><p>
  3. </p><p>// 计时过程,一般放在 Update 里,每帧调用</p><p>if (timer != 0)</p><p>{</p><p>  timer -= Time.deltaTime;</p><p>  if (timer <= 0)</p><p>  {</p><p>    timer = 0;</p><p>    /* 计时器到点结束执行的内容,超出限定时间,类似于延迟执行的部分 */</p><p>  }</p><p>  else</p><p>  {</p><p>    /* 计时器还在计算时的内容,在限定时间内,输入缓冲就可以放在这 */</p><p>  }</p><p>}</p>
复制代码

主要思路就是利用Time.deltaTime来计算并减去时间,关于增量时间,这里有一篇不错的文章(https://blog.csdn.net/ChinarCSDN/article/details/82914420),就不再赘述。

那么,接下来,利用这个计时器,实现“输入缓冲”效果吧。

输入缓冲

让我们再明确下,我们想要随时能够输入跳跃指令,并让这个指令在内存中保存一定时间,在该段时间内只要满足条件(接触地面)就执行跳跃指令。以下是两种执行写法(第一种为我游戏中使用 / 第二种为在上方计时器模板上进行修改):

  1. <p>/* 所用变量 */</p><p>private float buffer_jump_counter = 0;    // 跳跃输入缓冲计数器</p><p>private float buffer_jump_max = 0.1f;     // 跳跃输入缓冲最大值</p><p>private bool hasJumpForce;            // 此时是否拥有跳跃力了,避免重复给跳跃力,该力会在接触地面后自动重置为 false</p><p>
  2. </p><p>/* 输入指令,Update()中 */</p><p>if (Input.GetButtonDown("Jump"))</p><p>{</p><p>  buffer_jump_counter = 0;</p><p>}</p><p>
  3. </p><p>/* 计时器与执行指令,Update()中 */</p><p>if (buffer_jump_counter < buffer_jump_max)</p><p>{</p><p>  buffer_jump_counter += (1 * Time.deltaTime);</p><p>  if (IsOnGround() && !hasJumpForce)</p><p>  {</p><p>    hasJumpForce = true;</p><p>
  4. </p><p>    //具体施加跳跃力操作</p><p>    rigidbody2D_Role.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);</p><p>    Debug.Log("输入缓冲,启动一次!");</p><p>  }</p><p>}</p>
复制代码

下面这种我未在游戏中测试过,不保证正确性。

  1. <p>/* 所用变量一致,不再赘述 */</p><p>
  2. </p><p>/* 输入指令,Update()中 */</p><p>buffer_jump_counter = buffer_jump_max;</p><p>
  3. </p><p>/* 计时器与执行指令,Update()中 */</p><p>if (buffer_jump_counter != 0)</p><p>{</p><p>  buffer_jump_counter -= Time.deltaTime;</p><p>  if (buffer_jump_counter <= 0)</p><p>  {</p><p>    buffer_jump_counter = 0;</p><p>    /* 计时器到点结束执行的内容,超出限定时间,类似于延迟执行的部分 */</p><p>  }</p><p>  else</p><p>  {</p><p>    /* 计时器还在计算时的内容,在限定时间内,输入缓冲就可以放在这 */</p><p>    if (IsOnGround() && !hasJumpForce)</p><p>    {</p><p>      hasJumpForce = true;</p><p>
  4. </p><p>      //具体施加跳跃力操作</p><p>      rigidbody2D_Role.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);</p><p>      Debug.Log("输入缓冲,启动一次!");</p><p>    }</p><p>  }</p><p>}</p>
复制代码

这样,我们就实现了输入缓冲的效果。输入缓冲还可以用在很多的地方,如游戏中在空中连续多次按下↓方向键实现砸击地面的效果......更多的用法,就留待各位自行尝试了。

除此之外,跳跃的输入缓冲还有一个好兄弟,“土狼时间”。

土狼时间

土狼时间,就是让玩家所操控的人物,能够在离开平台的一段时间内,仍能执行起跳操作。它的目的,也是优化操作,减少“操作失灵”的现象。那么,我们是不是也可以用个计时器,来实现呢?可以自己先想一想。

怎么样,有思路了吗?

我们只要把计时器启动的时间改为离开地面即可,当我们离开地面,又没有执行过跳跃,就可以在一定的时间内,执行跳跃指令。以下是两种执行方法(同样,第一种为我游戏中使用 / 第二种修改自计时器模板):

  1. <p>/* 所用变量 */</p><p>private float buffer_coyote_counter = 0;    // 跳跃土狼时间计数器</p><p>private float buffer_coyote_max = 0.1f;       // 跳跃土狼时间最大值</p><p>private bool hasJumpForce;              // 此时是否拥有跳跃力了,避免重复给跳跃力</p><p>
  2. </p><p>/* 初始化,在 Start()中 */</p><p>buffer_coyote_counter = buffer_coyote_max;</p><p>
  3. </p><p>/* 更新指令,该函数在 Update()中调用 */</p><p>void CheckForJump()</p><p>{</p><p>  if (IsOnGround() && rigidbody2D_Role.velocity.y < 0.05f && rigidbody2D_Role.velocity.y > -0.05f)</p><p>  {</p><p>    hasJumpForce = false;</p><p>    buffer_coyote_counter = 0;</p><p>  }</p><p>}</p><p>
  4. </p><p>/* 计时器与执行指令,Update()中 */</p><p>if (buffer_coyote_counter < buffer_coyote_max)</p><p>{</p><p>  if (!hasJumpForce && Input.GetButtonDown("Jump"))</p><p>  {</p><p>    hasJumpForce = true;</p><p>    buffer_coyote_counter = buffer_coyote_max;</p><p>    rigidbody2D_Role.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);</p><p>    Debug.Log("土狼时间,启动一次!");</p><p>  }</p><p>}</p><p>
  5. </p><p>if (buffer_coyote_counter < buffer_coyote_max)</p><p>  buffer_coyote_counter += Time.deltaTime;</p>
复制代码

下面这种我未在游戏中测试过,不保证正确性 * 2。

  1. <p>/* 所用变量一致,不再赘述 */</p><p>
  2. </p><p>/* 更新指令,该函数在 Update()中调用 */</p><p>void CheckForJump()</p><p>{</p><p>  if (IsOnGround() && rigidbody2D_Role.velocity.y < 0.05f && rigidbody2D_Role.velocity.y > -0.05f)</p><p>  {</p><p>    hasJumpForce = false;</p><p>    buffer_coyote_counter = buffer_coyote_max;</p><p>  }</p><p>}</p><p>
  3. </p><p>/* 计时器与执行指令,Update()中 */</p><p>if (buffer_coyote_counter != 0)</p><p>{</p><p>  buffer_coyote_counter -= Time.deltaTime;</p><p>  if (buffer_coyote_counter <= 0)</p><p>  {</p><p>    buffer_coyote_counter = 0;</p><p>    /* 计时器到点结束执行的内容,超出限定时间,类似于延迟执行的部分 */</p><p>  }</p><p>  else</p><p>  {</p><p>    /* 计时器还在计算时的内容,在限定时间内,输入缓冲就可以放在这 */</p><p>    if (!hasJumpForce && Input.GetButtonDown("Jump"))</p><p>    {</p><p>      hasJumpForce = true;</p><p>      buffer_coyote_counter = buffer_coyote_max;</p><p>      rigidbody2D_Role.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);</p><p>      Debug.Log("土狼时间,启动一次!");</p><p>    }</p><p>  }</p><p>}</p>
复制代码

怎么样?这样就完美了吧。

其实关于游戏中的跳跃,还有很多的学问,例如如何合理高效的处理跳跃各个状态的动画(起跳、上升、最高点、下落、落地),跳跃中额外力的施加(如马里奥中的跳跃上升慢,下降快,并不只受到重力影响)......

其他的内容,就下次再说吧!

后记

我在学习本文相关内容时,借鉴了不少帖子、视频,包括但不限于:

译文|Gamemaker Studio 系列:2D 平台游戏的输入缓冲 ——highway★(https://indienova.com/indie-game-development/2d-platformer-input-buffering-design/)
使用 Unity 实现动作游戏的打击感 —— 奥飒姆 _Awesome(https://www.bilibili.com/video/BV1fX4y1G7tv)


来源:indienova
原文:https://indienova.com/indie-game-development/input-buffering-and-coyote-time/

资源转载网络,如有侵权联系删除。
相关下载

玩家评论

光遇时间煮雨怎么弹_光遇时间煮雨乐谱_快吧手游

2021乐谱大全光遇时间煮雨乐谱黑1 红2 蓝3 光遇光遇是一个历时七年打造的一款社交冒险手游,现在由网易代理。这款游戏最突出的特点,就是详情>>

阅读: 0
日期: 2021-09-22
op时间到什么意思 欧泡时间到意思介绍

op时间到什么意思?最近经常看到有o泡时间到,或者op笑话等等有趣的梗,不少网友还不清楚op是什么意思,或者根本不懂op时间到,下面一起来看一下欧泡时间到详情>>

阅读: 3
日期: 2021-09-16
LL动画又从B站时间表消失?贫穷新番从介质中释放,但有点奇怪_问题

原标题:LL动画又从B站时间表消失?贫穷新番从介质中释放,但有点奇怪 有些新番在B站陷入“介质原因”而停更久了,可能都忘掉自己追过,如果你是这么吐槽的详情>>

阅读: 1
日期: 2021-09-16
第五人格:高端局匹配时间长!玩家流失严重!

  继国家出台了相关政策以后,很多网络游戏也都是受到了很多影响的,比如第五人格,这款游戏中的高端局的游戏匹配时间是越来越长的,以前的那种秒配成功的情况是无详情>>

阅读: 7
日期: 2021-09-14
美团首次公布外卖“预估到达时间”算法规则:原来是四个时间

  很多网友好奇,点外卖时,订单显示的配送时间是怎么算出来的?那个时间为什么有时很长,有时很短?  今天, 美团官方首次公开外卖配送中的“预估到达时间”算法规则详情>>

阅读: 2
日期: 2021-09-12
光荣特库摩确认参展TGS 2021 发布会直播时间表公布

随着8月科隆游戏展的结束,紧接而来的便是9月30日至10月3日举办的日本东京电玩展(Tokyo Game Show,简称TGS)。知名开发商光荣特库摩确认将携旗下多部作品参详情>>

阅读: 2
日期: 2021-09-02
光遇:空巢返场时间介绍

  【光遇】游戏中空巢是很早前的一个隐藏地图,据说会在下一个新季节中重新上线,那么今天小编就给大家介绍一下光遇空巢返场时间,有需要的小伙伴不要错过了。 详情>>

阅读: 2
日期: 2021-09-01
坎公骑冠剑周边制作时间一览

坎公骑冠剑周边制作时间是多久?在卡马逊乐园中玩家可以消耗世界探索中获得的材料来进行周边制作,不同的产品制作时间也各不相同,下面为大家整理介绍一下周边制作的时间,想要了解详情>>

阅读: 5
日期: 2021-09-01
泄密苹果iPhone13发布会活动日期和产品发布时间表

苹果"iPhone 13"发布会活动日期和产品发布时间表  据知名泄密者Jon Prosser称,"iPhone 13"将于9月14日公布,9月24日全球发布。一年一度的9月iPhone发布会活动即将到来,围绕详情>>

阅读: 4
日期: 2021-08-27
剑网3十二周年发布会时间表 《谢云流传》全新展示将至

《剑网3》十二周年发布会将于本周六(8月28日)举办,官方日前带来了发布会日程表,其中显示官方将于8月28日的20:10~20:15带来一段《谢云流传》的全新展示。详情>>

阅读: 1
日期: 2021-08-26
原神2.1活动时间表-原神2.1_快吧手游

原神2.1活动时间表第一期(版本前半段,雷电将军up池期间) 1、逐月节2、周年庆·签到9月1日2.1版本更新后开启 ~ 9月20日左右第二期(版本后半段,珊瑚宫心海up池期间) 3详情>>

阅读: 1
日期: 2021-08-23
原神2.1首充重置时间一览

原神2.1首充重置时间是什么时候?2.1版本原神首充双倍奖励什么时候更新?下面给大家带来原神2.1首充重置时间的相关情报,感兴趣的小伙伴不妨一起来看看吧。 原神2.1首充重置时间详情>>

阅读: 5
日期: 2021-08-21
英雄联盟2021轮换模式时间表分享

英雄联盟2021轮换模式时间表分享 时间表详情:点击了解 1、通过轮换模式,小伙伴们可以体验包括无限火力、克隆模式、末日人机等在内的玩法,但这是随着时详情>>

阅读: 2
日期: 2021-08-18
《永劫无间》官方贺图感谢 联动角色妖刀姬赠送时间延长

网易旗下的武侠吃鸡游戏《永劫无间》还未上线时热度已经较高,在8月12日正式发售后更是火爆,登上了Steam一周销量榜榜首!昨日,官方在微博发文祝贺,且决定《详情>>

阅读: 0
日期: 2021-08-17
永劫无间steam开服时间介绍

永劫无间这款游戏,最近在国内是很火的,尤其是像B站这样的平台上,很多主播都在玩永劫无间这款游戏,很多小伙伴最近对永劫无间的steam开服时间很感兴趣,想要详情>>

阅读: 3
日期: 2021-08-13
FGO国服2021有哪些卡池 FGO国服2021年卡池时间一览

  FGO国服2021有哪些卡池?游戏FGO每期卡池都将给玩家们带来很多的角色以及礼装,并且还有一些返场的角色也将会上线,小编给大家带来了FGO国服2021年卡池时间详情>>

阅读: 5
日期: 2021-08-08
抖音时间管理在哪?抖音时间管理怎么取消?

抖音作为热门的短视频APP之一,长时间的沉迷刷抖音应该是很多小伙伴们的常态了,一步注意就刷几个小时,抖音为了大家的防沉迷也上线了时间管理这个系统,可以清楚的看见大家每天刷详情>>

阅读: 3
日期: 2021-08-06
《死亡循环》官宣送厂压盘 相约9月14日打破时间循环

《耻辱》系列开发商Arkane里昂工作室新作《死亡循环》最初定于2020年圣诞期间发售,后又经历了两轮跳票,延至今年9月。眼看着新发售日就要到了,Arkane工作详情>>

阅读: 0
日期: 2021-08-06
《死亡循环》官宣送厂压盘相约9月14日打破时间循环_Arkane

原标题:《死亡循环》官宣送厂压盘 相约9月14日打破时间循环 《耻辱》系列开发商Arkane里昂工作室新作《死亡循环》最初定于2020年圣诞期间发售,后又详情>>

阅读: 1
日期: 2021-08-06
GC2021开幕夜直播时间确定8月26日凌晨2点举行_Geoff

原标题:GC 2021开幕夜直播时间确定 8月26日凌晨2点举行 随着8月的到来,玩家们离传统游戏大展“科隆国际游戏展(Gamescom)”越来越近,因为疫情原因本届详情>>

阅读: 0
日期: 2021-08-05
仙剑奇侠传7正式版发售时间 仙剑奇侠传7发售时间介绍

仙剑奇侠传7正式版什么时候发售?最近仙剑奇侠传7发售日已经公布了,之前很多关心的小伙伴都在问发售日期,下面和game234小编一起来看一下仙剑奇侠传7正详情>>

阅读: 6
日期: 2021-07-28
航海王时间的记录者在哪_航海王时间的记录者位置介绍_快吧手游

航海王时间的记录者位置介绍1、第一条线索是时间记录者脚下,时间管理者那肯定是在钟楼附近。 2、第二条线索是海贼王陨落之地想都不想直接往广场的那里的处刑台详情>>

阅读: 2
日期: 2021-07-21
第五人格2021IVL夏季赛常规赛FPX.ZQvsDOU5第四局双方求生者三出DOU5出门时间短获胜

第五人格2021IVL夏季赛常规赛FPX.ZQ vs DOU5第四局 双方求生者三出 DOU5出门时间短获胜今天将进行的是第五人格2021IVL夏季赛常规赛的第5周第4天第1场中的第4局比赛,对阵双方详情>>

阅读: 1
日期: 2021-07-14
苹果教育优惠2021时间是什么时候 2021apple教育优惠送耳机活动时间分享[多图]

苹果教育优惠2021时间是什么时候,大家都在翘首以盼,往年的话就是7月9日左右就开启了,今年迟迟还不开启,米国那边已经开始了,很多人都想着送耳机就等到现在,下面就来介绍下苹果教详情>>

阅读: 13
日期: 2021-07-14
先游时间用完了玩不了游戏了怎么办?腾讯先游怎么卡无限时间?

腾讯先游作为一款游戏内测与云游戏一体的软件,不用下载只需登录一下就可以秒玩,对于手机内存小的来说真的是超大的福利了,不过在先游上面玩游戏是需要有时间规定的,要想玩更多的详情>>

阅读: 2
日期: 2021-07-14
苹果教育优惠2021时间开放时间是什么时候?教育优惠2021返校季开放时间一览[多图]

苹果教育优惠2021开始的世界是什么时候?教育优惠2021返校季还可以拿到耳机吗?今年的苹果官方优惠活动正式开启了,不少的小伙伴准备在这个优惠活动中来选购自己的心爱的apple详情>>

阅读: 4
日期: 2021-07-11
吉田直树称《FF16》制作顺利 但短时间内不会亮相

  近日在一场直播活动里,《最终幻想16》的游戏制作人吉田直树透露目前游戏的脚本和配音已经准备完成,但在短时间内游戏还不会发布,更不会在今年的东京电玩展当中露面。   详情>>

阅读: 3
日期: 2021-07-11
苹果教育优惠2021时间是什么时候 2021apple教育优惠送耳机活动时间

  2021apple教育优惠送耳机活动是什么时候?不少小伙伴都在询问苹果教育优惠2021时间是什么时候,其实国外这个活动已经开始,下面一起来看一下2021apple教育详情>>

阅读: 5
日期: 2021-07-11
中国apple返校季2021时间几点开始?apple苹果教育优惠送耳机开始时间一览[多图]

中国apple优惠教育返校季2021活动什么时候开始?2021返校季活动有没有耳机送?今年依旧是有耳机送的,不过时间跟去年有点改动,但是今年的这个活动还是有的,下面就把这次活动开始详情>>

阅读: 14
日期: 2021-07-11
仙剑奇侠传7直播时间是什么时候 仙剑奇侠传7直播时间介绍

  仙剑奇侠传7有哪些新内容?仙剑奇侠传官方微博宣布,将携手英伟达GeForce举办的“高能电玩节”中公布仙七新光追视频,下面小编为大家带来仙剑奇详情>>

阅读: 1
日期: 2021-07-08
原神1.7直播时间是什么时候?1.7前瞻直播时间及兑换码领取方法[多图]

原神1.7前瞻直播时间是几号?兑换码怎么获得?玩家可以在直播的过程中领取兑换码具体的1.7直播时间game234小编待会就会告诉大家,不知道直播时间以及兑换码获取方法的小伙伴,一详情>>

阅读: 4
日期: 2021-07-06
发售时间泄露!《在我们之中》或在8月登录PS

  《在我们之中(Among Us)》在全年上线后就受到了全世界玩家的青睐,而之前索尼也在自己的“State of Play”直播活动承诺将会让游戏在今年年内登录PS4和PS5平台,同时还会提供详情>>

阅读: 4
日期: 2021-07-05
steam夏季促销时间2021steam夏促2021时间

steam夏季促销时间2021,现在很多玩家都会选择在steam平台这个非常好用的正版游戏交易和启动平台上进行购物,可以说是游戏迷的天堂了。而按照惯例每年到了盛夏时节,steam都会启详情>>

阅读: 4
日期: 2021-06-30
《永劫无间》国服不删档时间介绍

永劫无间国服不删档测试什么时候开?很多的小伙伴都不知道国服的不删档测试什么时候开始,接下来小编就给详情>>

阅读: 4
日期: 2021-06-29
《原神》枫原万叶武器池开启时间介绍

  原神即将上线风属性五星角色万叶,很多小伙伴都很想知道枫原万叶武器池什么时候开启,今天小编给大家带来了《原神》枫原万叶武器池开启时间介绍,感兴趣的小伙详情>>

阅读: 4
日期: 2021-06-28
货拉拉回应赴美上市:没有具体的上市计划和时间表

  针对提交赴美IPO申请文件的相关报道,货拉拉方面回应称,公司持续关注资本市场,但是没有具体的上市计划和具体上市时间表。  此前,有消息称,货拉拉已秘密提交在美IPO申请文详情>>

阅读: 4
日期: 2021-06-24
《原神》周游壶灵刷新时间介绍

  在原神中我们可以在周游壶灵中获得各种稀有物品,很多小伙伴都很想知道周游壶灵在时候会刷新,今天小编给大家带来了《原神》周游壶灵刷新时间介绍,感兴趣的小详情>>

阅读: 10
日期: 2021-06-15
E3 2021专题上线 附各厂商发布会A9VG全程直播时间表

E32021即将于北京时间6月13日至16日以线上形式回归,多家游戏厂商都会在E3期间举行线上发布会公开众多新情报。今年A9VG将联合TGBUS在b站独家直播E3重点发布会,并同步在我们的详情>>

阅读: 3
日期: 2021-06-10
正式上映时间为6月11日《天堂电影院》国内上映

就在今天的6月8日这一天《天堂电影院》这款电影正式展开了新的宣传,虽然这个不是一个游戏或者相关的东西,但是你在这部电影当中我们会看到非常清晰的详情>>

阅读: 0
日期: 2021-06-09
DOTA2:Liquid遭遇刚下圣山的EG,留给Sumail翻身的时间不多了

原标题:DOTA2:Liquid遭遇刚下圣山的EG,留给Sumail翻身的时间不多了 对于DOTA2玩家来说,最近肯定没有闲着,基辅MAJOR就是目前强度最高,最具看点的比赛了。详情>>

阅读: 2
日期: 2021-06-08
精彩推荐