我一直在关注 3D 射击游戏教程(到目前为止还不错),但在帧率和跳跃方面遇到了障碍。我电脑上的帧率不一致,因此跳跃高度不断变化,有时角色根本不跳跃。我知道在 Update(而不是 FixedUpdate)中处理跳转会导致有关帧率的问题,但本教程坚持使用 Time.deltaTime 应该可以解决这个问题。关于我应该怎么做以保持跳跃的一致性有什么想法吗?
//Jumping
public float jumpHeight = 10f;
public Transform ground;
private bool readyToJump;
public LayerMask groundLayer;
public float groundDistance = 0.5f;
// Update is called once per frame
private void Update()
{
Jump();
PlayerMovement();
CameraMovement();
Shoot();
}
void PlayerMovement()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 movement = x * transform.right + z * transform.forward;
myController.Move(movement * speed * Time.deltaTime);
//9.8 meters/second^2
velocity.y += Physics.gravity.y * Mathf.Pow(Time.deltaTime, 2) * gravityModifier;
if (myController.isGrounded)
{
velocity.y = Physics.gravity.y * Time.deltaTime;
}
myController.Move(velocity);
}
private void CameraMovement()
{
float mouseX = Input.GetAxisRaw("Mouse X") * mouseSensitivity * Time.deltaTime;
float mouseY = Input.GetAxisRaw("Mouse Y") * mouseSensitivity * Time.deltaTime;
cameraVerticalRotation -= mouseY;
cameraVerticalRotation = Mathf.Clamp(cameraVerticalRotation, minVertCameraAngle, maxVertCameraAngle);
transform.Rotate(Vector3.up * mouseX);
myHead.localRotation = Quaternion.Euler(cameraVerticalRotation, 0f, 0f);
}
void Jump()
{
readyToJump = Physics.OverlapSphere(ground.position, groundDistance, groundLayer).Length > 0;
if (Input.GetButtonDown("Jump") && readyToJump)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y) * Time.deltaTime;
}
myController.Move(velocity);
}
答案 0 :(得分:0)
自己处理加速度是个坏主意,尤其是在 Update
而不是 FixedUpdate
中。你应该知道,在现实生活中,速度是随着加速度随时间平滑变化的。如果你画一条曲线,它是一个直线斜率。但是,在计算机中,如果只是逐帧计算速度,曲线会看起来像楼梯。
您可以使用 Unity 中的物理引擎,并在角色跳跃时为其添加即时速度。只需让 Unity 处理加速。
首先,您需要向其中添加一个 Rigidbody
组件。然后,您可以将代码修改为:
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Jump()
{
readyToJump = Physics.OverlapSphere(ground.position, groundDistance, groundLayer).Length > 0;
if (Input.GetButtonDown("Jump") && readyToJump)
{
rb.velocity = Vector3.up * jumpHeight * 2f / -Physics.gravity.y * gravityModifier;
}
}
在 PlayerMovement
组件中有 Use Gravity
后,不要忘记删除 Rigidbody
中处理跌落的代码。
编辑
如果您使用 CharacterController
,则只能自己处理加速度。您可以将逻辑移至 FixedUpdate
来解决各种高度问题,或者进行更准确的模拟。例如,使用它来处理跳跃:
velocity.y = jumpHeight * 2f / -Physics.gravity.y * gravityModifier;
并用它来处理坠落:
myController.Move(velocity * Time.deltaTime + Physics.gravity * Mathf.Pow(Time.deltaTime, 2) / 2f * gravityModifier);
// Here you should check whether it will fall through the ground.
// If no, use this line to update the velocity.
velocity.y += Physics.gravity.y * gravityModifier * Time.deltaTime;
// Otherwise, update the position to make it on ground and set velocity.y to 0.