抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

功能实现

说明:未落地时按跳跃键,可被记录,并且落地后起跳。

  • 降落状态,并且无法二段跳时,开启缓冲输入
  • 从降落到落地之间只要一直按着空格,落地后会立马跳起。
  • 中间松开就会关闭缓冲输入
  • 落地关闭缓冲输入

PlayerInput中添加变量public bool HasJumpInputBuffer { get; set; }

**onEnable()**函数中添加松开按键判定

private void OnEnable()
{
//当玩家松开按键跳跃时
playerInputAction.GamePlay.Jump.canceled += delegate
{
HasJumpInputBuffer = false;//松开按键关闭跳跃输入缓冲
};
}

PlayerState_Fall脚本中添加输入缓冲

if (input.playerjump)
{
if (player.CanAirJump)
{//当玩家可以跳跃时(吃到星星,测试时条件是落地后)
stateMachine.SwitchState(typeof(PlayerState_AirJump));
return;
}
input.HasJumpInputBuffer = true;//如果玩家不能二段跳,则开启动作预输入(输入缓冲)
}

PlayerState_JumpUp脚本,**Enter()**中添加input.HasJumpInputBuffer = false;//关闭动作缓冲

PlayerState_Land,落地状态脚本,判定开启动作缓冲输入时也可跳跃

if (input.HasJumpInputBuffer || input.playerjump)
{//如果存在跳跃输入缓冲
//或者玩家按下空格起跳,则切换状态为跳跃
stateMachine.SwitchState(typeof(PlayerState_JumpUp));
}

限制缓冲输入时长

新建协程JumpInputBufferCoroutine,跳跃输入缓冲携程

IEnumerator JumpInputBufferCoroutine()
{
//跳跃输入缓冲携程
HasJumpInputBuffer = true;
yield return waitJumpInputBufferTime;//延迟0.5s
HasJumpInputBuffer = false;
}

该协程写进一个方法用以别的类调用

public void SetJumpInputBufferTimer()
{
StopCoroutine(nameof(JumpInputBufferCoroutine));
StartCoroutine(nameof(JumpInputBufferCoroutine));
}

例如PlayerState_Fall状态中,将无限制缓冲输入时长改为长按0.5s失效

//若如果玩家不能二段跳,则开启动作预输入(输入缓冲) 携程
// input.HasJumpInputBuffer = true;
input.SetJumpInputBufferTimer();

评论