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