使用角色控制器将玩家的速度保持在斜坡上

时间:2019-05-14 11:34:55

标签: c# unity3d

我正在使用Unity的角色控制器工具移动角色。

我正在使用自己的运动,重力等,但这似乎并没有直接影响运动。我检查了我的整个代码,并将其减少到最低限度,以解决问题。

我已经打印了速度,运动,幅度...一切都表明,在平坦表面或斜坡上的运动是完全相同的。

我不知道角色控制器的脚本是如何工作的,因此可能会导致某种计算。

这是我计算运动的方式:

private void SetMovement() {
    horizontalMovement = isometricHorizontal * Input.GetAxisRaw(horizontalButton);
    verticalMovement = isometricVertical * Input.GetAxisRaw(verticalButton);
    movement = (horizontalMovement + verticalMovement).normalized;
    MovementModifier();
}

private void MovementModifier() {
    if (isSprinting) {
        movement.x *= sprintFactor;
        movement.z *= sprintFactor;
    }
}

private void Move() {
    if (movement != Vector3.zero)
        characterController.Move(movement * Time.deltaTime * moveSpeed);
}

速度下降斜率至少增加30%,并且上升时减小的速度几乎相同。

我想在任何表面上保持相同的速度,而无需在斜坡或楼梯等特定区域上应用移动修改器或降低它的速度。

编辑:

这就是我施加重力的方式。

private void ApplyGravity() {
    if (!characterController.isGrounded) {
        gravity += Physics.gravity * Time.deltaTime * gravityFactor;
        if (gravity.y > 0 && !Input.GetButton(jumpButton) && !isFalling)
            gravity += Physics.gravity * Time.deltaTime * gravityFactor * (lowJumpMultiplier - 1);
    }
    else if (!isJumping) gravity = Vector3.down;
    CheckCollisionFlags();
    movement += gravity;
}

private void CheckCollisionFlags() {
    switch (characterController.collisionFlags) {
        case UnityEngine.CollisionFlags.Above:
            gravity = Vector3.down;
            break;  
    }
}

2 个答案:

答案 0 :(得分:1)

没有看到如何实现重力,我不能百分百确定,但是我会假设正在发生类似的事情(将其当作您正在制作2D侧滚动器进行处理):< / p>

您的角色会水平移动,按照正常化操作,您将获得恒定的水平速度。

但是,当您施加重力时,您会垂直加速,导致向下的速度增加。

当您下坡时,您的水平运动是恒定的,但是由重力引起的垂直运动会被添加到您的速度中。 之后,您的速度被归一化,在坡度。


要解决此问题,您可能需要执行以下操作:

检查是否已接地,如果正在接地,则要在平坦的表面或斜坡上运动,并且应在加上重力引起的垂直运动后归一化速度。

答案 1 :(得分:0)

我刚刚发现我必须增加CharacterController的Step Offset属性。似乎在爬坡或上楼梯并扣减运动时会产生一些冲突。

现在我实现了相同的上下移动速度,该速度比在平坦表面上要快,但是到目前为止,它更易于管理。