[英]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.