Unity 2D(C#)实现抓崖机制需松开按键再触发脱离的问题与方案
2D游戏崖边抓攀机制输入冲突修复
问题背景
开发2D游戏崖边抓攀(ledge hang)机制时会遇到典型的输入逻辑冲突:玩家按水平方向键可触发抓攀上崖,但同组方向键也被设置为抓攀状态下的脱离触发键,导致角色刚抓住崖边就会因持续按住方向键立刻掉落;设置固定等待时间的方案手感生硬,不符合操作直觉。最初尝试在玩家松开按键前将输入轴值强制设为0,但轴值为0本身就代表按键已松开,逻辑上存在矛盾。
检测左右方向键输入的基础代码如下:
mx = Input.GetAxisRaw("Horizontal"); // 检测左右方向键按压状态,返回-1、0、1三个对应值
初始版本的抓攀状态逻辑中,曾在抓攀逻辑前添加IsGrabbing判断,试图限制角色在松开按键或触发跳跃前保持抓攀状态,但由于方向键同时承担脱离抓攀的触发功能,该校验完全失效。也考虑过改用跳跃键或下方向键作为脱离按键(下方向键使用独立变量mx2检测垂直输入),但需要保留同按键触发的操作逻辑,找到适配的解决方案。
初始存在bug的抓攀逻辑代码如下:
if (IsGrabbing == true) { rb.velocity = new Vector2(0f, 0f); rb.gravityScale = 0f; // mx2用于检测垂直移动输入。如果抓攀前就按住下方向键,会触发直接脱离的问题,但由于抓攀上崖不需要按下方向键,该问题影响相对较小 if (mx != 0 || mx2 < 0) { // 脱离抓攀、临时禁止再次抓攀的逻辑,角色落地后会重置相关状态 IsGrabbing = false; anim.SetBool("IsHanging", false); redXSize = 10f; redYSize = 10f; greenXSize = 0f; greenYSize = 0f; rb.gravityScale = 5f; }
此前尝试过多种实现方案,其中使用while循环阻塞等待按键松开的方案会直接导致游戏主线程卡死,需要无卡顿、手感自然的修复思路。
解决方案
通过新增输入标记位的方案即可解决该问题:新增默认值为false的InitiateGrab标记位,仅当标记位为true时才响应方向键的脱离触发逻辑,通过标记位过滤抓攀瞬间持续按住的历史按键输入,无需使用while循环阻塞,最终实现必须松开当前按住的按键、再次按下才会触发脱离的预期操作手感。
修复后的完整代码如下:
if (IsGrabbing == true) { if (mx != 0 && InitiateGrab == false) { InitiateGrab = false; } else { InitiateGrab = true; } rb.velocity = new Vector2(0f, 0f); rb.gravityScale = 0f; if (mx != 0 && InitiateGrab == true || mx2 < 0 && InitiateGrab == true) { IsGrabbing = false; InitiateGrab = false; anim.SetBool("IsHanging", false); anim.SetBool("IsRising", false); redXSize = 10f; redYSize = 10f; greenXSize = 0f; greenYSize = 0f; rb.gravityScale = 5f; } }
内容的提问来源于stack exchange,提问作者Morhamms357
相关产品推荐
相关产品推荐

