Unity 2D 输入动作未释放

问题描述 投票:0回答:1

我正在尝试使用 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,而不是检查上述方法。结果保持不变。有跳跃,但无论何时释放按钮,高度都是均匀的。

额外更新。我找到了一种读取操作的回调上下文阶段的方法。在整个过程中,该阶段被解读为“已执行”,即使释放按钮也是如此。

unity-game-engine input 2d
1个回答
0
投票

您的整个

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.