unity3d Unity跳转脚本问题

rfbsl7qr  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(234)

我是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"));
    }
}`
k97glaaz

k97glaaz1#

我建议你给你的玩家增加一个刚体组件,它会做所有的重力部分。然后你只需要使用addforce让玩家跳跃

6xfqseft

6xfqseft2#

首先,为什么你的角色下降得这么慢:
请注意,在HandleGravity()方法和update方法中,都将重力乘以Time.deltaTime,但只应乘以一次。
对于跳跃高度不同的原因,您可能会多次重新应用跳跃。我不知道您是如何执行地面检查的,但如果地面检查不精确,并且在您的角色接近地面时返回true,这可能是问题所在。如果连续几帧重新应用跳跃,这可能会导致它是一个意外的高度。

htzpubme

htzpubme3#

如果使用Rigidbody2D组件而不是试图模拟重力和其他物理特性,效果会更好。
下面是一个例子:

public float jumpForce = 10.0f;

private Rigidbody2D rb;

void Start()
{
    rb = GetComponent<Rigidbody2D>();  
}

void Update()
{      
    handleJump();
}

void handleJump()
{
    if (Input.GetButtonDown("Jump") && characterController.isGrounded)
    {
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);       
    }
}

注意:记住在脚本附加到的对象上添加Rigidbody2D组件。如果您正在处理此解决方案,也不要使用handleGravity()方法。

相关问题