蹲下时如何变速?

How to change speed when crouching?

我试图让玩家在蹲下移动时变慢。

private float moveSpeed = 5f;
private float crouchSpeed = 0.2f;
private float runSpeed = 8.5f;    
private void PlayerMovement() 
{
    move = controls.Player.Movement.ReadValue<Vector2>();
    movement = (move.y * transform.forward) + (move.x * transform.right);
    controller.Move(movement * moveSpeed * Time.deltaTime);
    
    if (isRunning)
    {
        run = controls.Player.Run.ReadValue<float>();
        Vector3 running = (move.y * transform.forward) + (move.x * transform.right);
        controller.Move(running * runSpeed * Time.deltaTime);
    }
    if (crouching)
    {
        isRunning = false;
        transform.localScale = new Vector3(transform.localScale.x, crouchYScale, transform.localScale.z);
        movement = (move.y * transform.forward) + (move.x * transform.right);
        controller.Move(movement * crouchSpeed * Time.deltaTime);
    }
    else
    {
                
        transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z);
        movement = (move.y * transform.forward) + (move.x * transform.right);
        controller.Move(movement * moveSpeed * Time.deltaTime);
    }
}

但是,即使玩家蹲下,它仍然是与步行速度相同的速度。这是为什么?

private void PlayerMovement()
    {
        // stuff
        controller.Move(movement * moveSpeed * Time.deltaTime);

        // stuff
        if (crouching)
        {
            // stuff
            controller.Move(movement * crouchSpeed * Time.deltaTime);
        }

你做正常的运动,然后你也做基于你的 run/crouch 状态的运动。

考虑改为将 currentSpeed 设置为您的步行速度,检查您的案例并适当设置 currentSpeed,然后在设置速度后只有一个地方实际 .Move()。

设置速度的一个好方法是删除重复的相同方法。这样你就可以定义一个临时的速度变量,通过不同的条件来最终确定主速度。在这个方法中,你不再需要重新定义Character.Move,问题就迎刃而解了

var currentSpeed = moveSpeed;
if (isRunning)
{
    currentSpeed = runSpeed;
    run = controls.Player.Run.ReadValue<float>();
}
if (crouching)
{
    currentSpeed = crouchSpeed;
    isRunning = false;
    transform.localScale = new Vector3(transform.localScale.x, crouchYScale, transform.localScale.z);
}
else // if move
{
    transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z);
}
controller.Move(movement * currentSpeed * Time.deltaTime); // without duplication and select true speed in last