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

C# 使用角色控制器保持玩家在斜坡上的速度,c#,unity3d,C#,Unity3d,我正在使用Unity的角色控制器工具移动我的角色 我使用我自己的运动,重力等,但它似乎没有直接影响到运动。我已经检查了我的全部代码,并将其减少到最低限度,只是为了寻找问题 我已经打印了速度,运动,大小。。。一切都表明,在平坦的表面或斜坡上的运动是完全相同的 我不知道角色控制器的脚本是如何工作的,所以可能是某种计算导致了这种行为 这是我计算运动的方式: private void SetMovement() { horizontalMovement = isometricHorizontal

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

在没有看到如何实现重力的情况下,我无法100%确定,但我会假设类似的情况正在发生(将其视为制作2D侧滚动条):

你的角色会有水平运动,当这是标准化的,你会得到一个恒定的水平速度

然而,当你施加重力时,你会垂直加速,导致向下的速度增加

当你下坡时,你的水平运动是恒定的,但是重力引起的垂直运动在你的速度被标准化后被加入到你的速度中,从而在斜坡上产生更大的速度


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


检查您是否已接地,如果已接地,则您将在平坦表面或斜坡上移动,并且在添加重力引起的垂直移动后,您应该标准化您的速度。

我刚刚发现我必须增加CharacterController的阶跃偏移属性。它似乎是在上坡或上楼时制造了一些冲突,并扣除了运动


我现在在斜坡上和斜坡下都达到了相同的移动速度,这比在平坦的地面上要高,但到目前为止更容易管理。

感谢Rishaan Gupta的回复。我刚刚编辑了我的帖子,添加了我如何计算重力。我也试着使运动正常化,但即使如此,下降速度也更高。