释放左移后缓慢降低移动速度

Slowly decrease movement speed after releasing left shift

所以,我仍在用 Unity 开发游戏,我现在唯一的问题是我不知道如何在释放左移后慢慢降低角色的速度。在按住 shift 的同时缓慢增加速度是我唯一解决的问题,因为我使用了增量技术,但在释放左 shift 后缓慢降低速度却不是。有人能帮我吗?这是代码,我很抱歉,我真的是初学者:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;

    //Codes for setting walk and sprint speed (You should put speed in "Default Speed". "Walk Speed" is public so I can see if my speed is increasing)
    public float defaultSpeed = 8f;
    public float walkSpeed = 8f;
    public float sprintIncrease = 15f;
    public float sprintLimit = 16f;

    //Gravity force
    public float gravity = -60f;

    //Probably jump height?
    public float jumpHeight = 2f;

    //For checking if you're on the ground
    public Transform groundCheck;
    public float groundDistance = 0.5f;
    public LayerMask groundMask;

    //Code to check if you are on the ground
    Vector3 velocity;
    bool isGrounded;

    // Update is called once per frame
    void Update()
    {

        //For checking again if you're on the ground
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

        //Code to slowly increase sprint FORWARD while holding left shift
        if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Vertical") > 0)
        {
            walkSpeed += sprintIncrease * Time.deltaTime;  
        
        }
        //Code to prevent sprinting while holding S and when combined with A or D
        else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Vertical") < 0)
        {
            walkSpeed = defaultSpeed;
        }

        //Code for allowing to slowly increase sprint LEFT sideways
        else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Horizontal") < 0)
        {
            walkSpeed += sprintIncrease * Time.deltaTime;
        }

        //Code for allowing to slowly increase sprint RIGHT sideways
        else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Horizontal") > 0)
        {
            walkSpeed += sprintIncrease * Time.deltaTime;
        }

        //To stop Sprint Speed while holding shift from exceeding Sprint Limit
        if (walkSpeed > sprintLimit)
        {
            walkSpeed = sprintLimit;
        }

        //Executes when shift is released, to slowly go back to default speed(This is my problem) 
        if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            walkSpeed = defaultSpeed;
        }

        //To check if you're grounded so velocity doesn't increase
        if (isGrounded && velocity.y < 0)
        {
            velocity.y = -2f;
        }

        //The basic horizontal and vertical axises
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        //The basic code for movement
        Vector3 move = transform.right * x + transform.forward * z;

        controller.Move(move * walkSpeed * Time.deltaTime);

        //The code for jumping
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        velocity.y += gravity * Time.deltaTime;

        controller.Move(velocity * Time.deltaTime);
    }
}

先谢谢大家了

if (!Input.GetKey(KeyCode.LeftShift))
{
    walkSpeed -= sprintIncrease * Time.deltaTime;
}

以上代码将完成您的要求。请注意,您实现内容的方式 beginner-friendly 但对性能不友好。

好的,我已经自己弄明白了。我重新安排了 ifs 和 else 语句,使之看起来更有条理。我添加了 else 语句,如果你在步行时不按住 shift,它会随着冲刺的增加而不断减去步行速度,但为了阻止它低于默认速度,我添加了一个 if 语句,如果步行速度变为低于默认速度,它变为等于默认速度。请注意,我重新安排了语句以触发 else 语句。

using System.Collections;

使用System.Collections.Generic; 使用 UnityEngine;

public class PlayerMovement:MonoBehaviour { public CharacterController控制器;

//Codes for setting walk and sprint speed (You should put speed in "Default Speed". "Walk Speed" is public so I can see if my speed is changing or not)
public float defaultSpeed = 8f;
public float walkSpeed = 8f;
public float sprintIncrease = 15f;
public float sprintLimit = 16f;

//Gravity force
public float gravity = -60f;

//Probably jump height?
public float jumpHeight = 2f;

//For checking if you're on the ground
public Transform groundCheck;
public float groundDistance = 0.5f;
public LayerMask groundMask;

//Code to check if you are on the ground
Vector3 velocity;
bool isGrounded;

// Update is called once per frame
void Update()
{

    //For checking again if you're on the ground
    isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

    //Code to prevent sprinting while holding S and when combined with A or D(New Code)
    if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Vertical") < 0)
    {
        walkSpeed -= sprintIncrease * Time.deltaTime;
    }

    //Code to slowly increase sprint FORWARD while holding left shift
    else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Vertical") > 0)
    {
        walkSpeed += sprintIncrease * Time.deltaTime;                     
    }

    //Code for allowing to slowly increase sprint LEFT sideways
    else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Horizontal") < 0)
    {
        walkSpeed += sprintIncrease * Time.deltaTime;
    }

    //Code for allowing to slowly increase sprint RIGHT sideways
    else if (Input.GetKey(KeyCode.LeftShift) && Input.GetAxis("Horizontal") > 0)
    {
        walkSpeed += sprintIncrease * Time.deltaTime;
    }

    //To make sure that your speed decrease smoothly if not holding left shift(New code)
    else
    {
        walkSpeed -= sprintIncrease * Time.deltaTime;
    }

    //To stop Sprint Speed while holding shift from exceeding Sprint Limit
    if (walkSpeed > sprintLimit)
    {
        walkSpeed = sprintLimit;
    }

    //To stop Walk Speed from getting lower than Default Speed(New Code)
    if (walkSpeed < defaultSpeed)
    {
        walkSpeed = defaultSpeed;
    }

    //To check if you're grounded so velocity doesn't increase
    if (isGrounded && velocity.y < 0)
    {
        velocity.y = -2f;
    }
    
    //The basic horizontal and vertical axises
    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");

    //The basic code for movement
    Vector3 move = transform.right * x + transform.forward * z;

    controller.Move(move * walkSpeed * Time.deltaTime);

    //The code for jumping
    if (Input.GetButtonDown("Jump") && isGrounded)
    {
        velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
    }

    velocity.y += gravity * Time.deltaTime;

    controller.Move(velocity * Time.deltaTime);
}
}