重力不影响玩家跳跃时

时间:2019-01-31 18:14:16

标签: unity3d

我有一个Endless Runner播放器,在任何状态下都可以跳跃。当按下空格键时,我的播放器将无限地向天空飞行。

它具有动画和角色控制器,但没有Rigidbody。我改为在脚本中使用它。

在动画制作器中,我添加了bool ground和跳跃触发器。

在从任何状态过渡到跳跃的过程中,我将条件grounded设置为true。

Screenshot

这是下面的代码

private CharacterController controller;
private float jumpForce = 4.0f;
private float gravity = 12.0f;
private float verticalVelocity;

void Update()
{
    Vector3 moveVector = Vector3.zero;
    moveVector.x = (targetPosition - transform.position).normalized.x * speed;

    bool isGrounded = IsGrounded();
    animator.SetBool("jumping", isGrounded);

    //Calculate Y
    if (isGrounded) //if grounded
    {
        verticalVelocity = -0.1f;

        if(Input.GetKeyDown(KeyCode.Space))
        {
            //jump
            animator.SetTrigger("jumping");
            verticalVelocity = jumpForce; 
        }
        else
        {
            verticalVelocity -= (gravity * Time.deltaTime);

            //fast faling mechanic
            if(Input.GetKeyDown(KeyCode.Space))
            {
                verticalVelocity = -jumpForce;
            }
        }
    }
}

private bool IsGrounded()
{
    Ray groundRay = new Ray(new Vector3(
        controller.bounds.center.x,
        (controller.bounds.center.y - controller.bounds.extents.y) + 0.2f,
        controller.bounds.center.z),
        Vector3.down);
    return (Physics.Raycast(groundRay, 0.2f + 0.1f));

}

非常感谢任何想法!

1 个答案:

答案 0 :(得分:0)

如果您希望Unity系统处理您的physics,那么您将不得不在其中使用Rigidbody组件。

否则,您需要模拟加速度。通过提高FixedUpdate

中每个物理刻度的速度来实现
float gravityVelocity = 0f;

float gravityFactor = 0.5f;
float gravityAcceleration = 9.2f * gravityFactor;

void FixedUpdate()
{
    gravityVelocity += gravityAcceleration * Time.fixedDeltaTime;

    gameObjectToUpdate.transform.position +=
        new Vector3(0, gameObjectToUpdate.transform.position.y - gravityVelocity, 0);
}