如何使用新的输入系统让角色蹲下?

How to make the character crouch using the new input system?

我正在尝试将蹲伏添加到我的第一人称游戏中。由于不需要动画,我认为实现蹲伏的更简单方法是降低玩家的高度并让玩家移动得更慢。我正在尝试使用新的输入系统来实现这一点。这是我的尝试:

 [SerializeField] float walkSpeed = 10f;
 [SerializeField] float runSpeed = 25f;
 [SerializeField] float crouchSpeed = 5f;
 [SerializeField] CharacterController controller;
 public bool crawl;

  private void Update()
    {

        if (crawl)
        {
            Crouching();
        }
        else
        {
            StandingUp(); 
        }
        
    }

    private void Crouching()
    {
        crawl = true;
        controller.height = 0.3f;
        moveSpeed = crouchSpeed;

    }
    private void StandingUp()
    {

        crawl = false;
        controller.height = 3f;
        moveSpeed = walkSpeed;
        
    }
public void OnCrawl()
    {
        crawl = true;
    }

输入Action部分:

  [SerializeField] Movement movement;
 private void Awake() 
  {
        controls = new PlayerControls(); 
        groundMovement = controls.GroundMovement;
        // groundMovement.[action].performed += context => do something
        groundMovement.HorizontalMovement.performed += ctx => horizontalInput = ctx.ReadValue<Vector2>();
        groundMovement.Crawl.performed += _ => movement.OnCrawl();
    } 

预期的是按下 c 后,玩家进入蹲伏状态,当我再次按下 c 时,它应该会恢复原状。但它不起作用。我得到的只是按钮在按下时被触发,但实际上没有任何反应。

我之前有一个问题得到回答:

但这里的要求略有不同。与 运行 不同的是,我不希望用户在蹲下时按住某个键。我希望只需单击一下即可将状态从行走更改为蹲伏,反之亦然。

当前结果:

在测试当前代码时,当我按下 c 时,我可以看到值 crawl 被选中,但是当我再次按下它时,它并没有被取消选中。并且字符的高度没有像预期的那样改变。

这是针对此问题的优化解决方案。按键时,运行抓取相变代码即可。其余的变化将取决于运动 class.

public bool crawl;
public void CrawlChange()
{
    crawl = !crawl;
    
    if (crawl)
    {
        controller.height = 0.3f;
        moveSpeed = crouchSpeed;
    }
    else
    {
        controller.height = 3f;
        moveSpeed = walkSpeed;
    }
}

从控制代码中,按特殊的抓取键调用此代码。另外,这种协调不需要在Update中,以防止在每一帧中进行不必要的处理。

groundMovement.Crawl.performed += ctx => movement.CrawlChange(); // switch crawl phase