繁体   English   中英

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

[英]Keep player velocity on slopes using Character Controller

我正在使用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;  
    }
}

在没有看到您如何实现重力的情况下,我不能百分百确定,但我会假设正在发生类似的事情( 将其视为您正在制作2D侧面滚动条 ):

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

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

在斜坡上时,水平运动是恒定的,但是对速度进行归一化 ,重力引起的垂直运动会添加到速度中,从而在倾斜时会产生较大的速度。


为了解决这个问题,您可能需要执行以下操作:

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

我发现我不得不增加CharacterController的Step Offset属性。 似乎在上坡或上楼梯并扣减运动时发生了一些冲突。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM