Unity 3D 跳跃问题

时间:2021-06-29 03:20:48

标签: c# unity3d

我一直在关注 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);
}

1 个答案:

答案 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.