我是Unity的新手,我想做一个可以移动、跳跃等的角色。但是跳跃不是很正常。跳跃的高度似乎每次都在改变,而且角色在跳跃后下降得很慢。我不知道为什么会这样。我的代码如下所示:
`using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerMovement : MonoBehaviour
{
private CharacterController characterController;
[SerializeField]
float movementSpeed = 5.0f;
[SerializeField]
float jumpHeight = 10.0f;
float gravity = -9.81f;
Vector3 relativeMovementInput;
Vector3 relativeMovement;
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
handleRotation();
handleMovementInput();
handleGravity();
handleJump();
characterController.Move(relativeMovement * Time.deltaTime);
}
void handleGravity()
{
if (characterController.isGrounded && relativeMovementInput.y < 0)
{
relativeMovement.y = -0.01f;
}
relativeMovement.y += gravity * Time.deltaTime;
}
void handleMovementInput()
{
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
Vector3 relativeVerticalInput = transform.forward * verticalInput;
Vector3 relativeHoriztonalInput = transform.right * horizontalInput;
relativeMovementInput = relativeHoriztonalInput + relativeVerticalInput;
relativeMovement.x = relativeMovementInput.x * movementSpeed;
relativeMovement.z = relativeMovementInput.z * movementSpeed;
}
void handleJump()
{
bool isJumpPressed = Input.GetButton("Jump");
bool canJump = characterController.isGrounded;
if (isJumpPressed && canJump)
{
relativeMovement.y += jumpHeight;
}
}
void handleRotation()
{
transform.Rotate(Vector3.up * Input.GetAxis("Mouse X"));
}
}`
3条答案
按热度按时间k97glaaz1#
我建议你给你的玩家增加一个刚体组件,它会做所有的重力部分。然后你只需要使用addforce让玩家跳跃
6xfqseft2#
首先,为什么你的角色下降得这么慢:
请注意,在HandleGravity()方法和update方法中,都将重力乘以Time.deltaTime,但只应乘以一次。
对于跳跃高度不同的原因,您可能会多次重新应用跳跃。我不知道您是如何执行地面检查的,但如果地面检查不精确,并且在您的角色接近地面时返回true,这可能是问题所在。如果连续几帧重新应用跳跃,这可能会导致它是一个意外的高度。
htzpubme3#
如果使用
Rigidbody2D
组件而不是试图模拟重力和其他物理特性,效果会更好。下面是一个例子:
注意:记住在脚本附加到的对象上添加
Rigidbody2D
组件。如果您正在处理此解决方案,也不要使用handleGravity()方法。