簡體   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