我正在尝试使用 Unity 的新输入系统向平台游戏添加可变跳跃高度。由于我正在尝试集成有限状态机框架,因此我正在使用发送消息行为读取输入。要添加可变跳跃高度,请在按下跳跃动作时在空闲状态下调用以下函数:
public void Jump(InputAction jumpAct)
{
float jumpCount = 10f;
if (jumpAct.WasPressedThisFrame())
{
rb.velocity = new Vector2(rb.velocity.x, jumpPower);
}
while (jumpCount > 0f)
{
if (jumpAct.WasReleasedThisFrame() && rb.velocity.y > 0f)
{
Debug.Log("Yay");
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
} else
{
Debug.Log(jumpAct.ReadValueAsObject());
}
jumpCount -= Time.deltaTime;
}
}
看来,即使当我释放按钮时,InputValue 仍然注册为 On(第二个 if 语句总是失败,调试器打印的 JumpAct 值为 1)。尽管查看了文档和不同的论坛,但不知道为什么会发生这种情况。一些帮助将不胜感激。
额外说明:我知道这个问题可以通过使用 Invoke Unity Events 行为中的回调上下文来解决。然而,理想情况下有一个使用发送消息行为的解决方案,因为否则我需要重写我编码的 FSM 框架的很大一部分。
尝试过 WasReleasedThisFrame()、!IsPressed() 和 !WasPressedThisFrame()。已尝试在字符组件的 InputAction 中添加和删除触发器。尝试直接使用 ReadValueAsObject() 读取 InputValue,而不是检查上述方法。结果保持不变。有跳跃,但无论何时释放按钮,高度都是均匀的。
额外更新。我找到了一种读取操作的回调上下文阶段的方法。在整个过程中,该阶段被解读为“已执行”,即使释放按钮也是如此。
您的整个
while
循环将在一帧内执行!
假设您每帧都调用此方法,您只需要一次处理一个单帧并执行例如
private float jumpCount = 10f;
public void Jump(InputAction jumpAct)
{
jumpCount = 10f;
if (jumpAct.WasPressedThisFrame())
{
rb.velocity = new Vector2(rb.velocity.x, jumpPower);
}
if(jumpCount > 0f)
{
if (jumpAct.WasReleasedThisFrame() && rb.velocity.y > 0f)
{
Debug.Log("Yay");
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
} else
{
Debug.Log(jumpAct.ReadValueAsObject());
}
jumpCount -= Time.deltaTime;
}
}