首页 > 解决方案 > CharacterController 统一跳转

问题描述

您好,我正在尝试在 Unity 中制作移动脚本。我也想添加跳跃,但是每次当我跳跃时,它都会在 Y 方向上向上移动 0.025 并将玩家停在空中*(如果我在 0 并且我跳跃它会在 0.02545 然后 0.0543 等...)* 和我可以向 Space 发送垃圾邮件以将玩家向上移动。我添加了重力,但它看起来不起作用..我不知道如何解决它。我希望有人可以帮助我解决我的问题...

这是我正在使用的功能...

Vector3 moveDirection = Vector3.zero;

public float walkingSpeed = 10.0f;
public bool canJump = true;
public float jumpSpeed = 8.0f;
public float gravity = 10.0f; 

CharacterController characterController; 

void Movement()
    {
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);
        float moveX = walkingSpeed * Input.GetAxis("Vertical");
        float moveY = walkingSpeed * Input.GetAxis("Horizontal");
        float MovementY = moveDirection.y;
        moveDirection = (forward * moveX) + (right * moveY);
        if (Input.GetButtonDown("Jump") && canJump)
        {
            moveDirection.y = jumpSpeed;
        }
        moveDirection.y -= gravity * Time.deltaTime;
        characterController.Move(moveDirection * Time.deltaTime);
    }

标签: unity3d

解决方案


因为您正在重置moveDirection每一帧(当您调用时,moveDirection = (forward * moveX) + (right * moveY)您不会让重力累积。您应该单独保存垂直速度并在每一帧添加它。

类似于以下内容:

Vector3 moveDirection = Vector3.zero;

public float walkingSpeed = 10.0f;
public bool canJump = true;
public float jumpSpeed = 8.0f;
public float gravity = 10.0f;

CharacterController characterController;

private float verticalSpeed;

void Movement()
{
    float moveX = walkingSpeed * Input.GetAxis("Vertical");
    float moveY = walkingSpeed * Input.GetAxis("Horizontal");

    verticalSpeed -= gravity * Time.deltaTime;

    if (Input.GetButtonDown("Jump") && canJump)
    {
        verticalSpeed = jumpSpeed;
    }

    characterController.Move((moveX * transform.forward + moveY * transform.right + verticalSpeed * transform.up)
                             * Time.deltaTime);
}

transform.forward相当于transform.TransformDirection(Vector3.forward)


推荐阅读