unity 跳转脚本延迟

问题描述

我正在统一制作 3d 游戏,因此我为我的角色移动制作了一个 cs 脚本,步行和移动相机工作正常,但是当我添加跳跃功能时,它有延迟。您可以按 5 次跳转按钮,但没有结果。然后你再按下它,它就会跳起来。我不明白为什么会这样。

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehavIoUr
{
    public CharacterController characterController;
    public int speed = 6;
    public float gravity = 9.87f;
    private float verticalspeed = 0;
    private Vector3 moveDirection = Vector3.zero;

    public Transform Camera;

    public float Sensitivity = 2f;
    public float uplimit = -50;
    public float downlimit = -50;
    public float jumpspeed = 5.0f;


    void Update()
    {
        move();
        cameramove();
        

        void cameramove()
        {
            float horizontal = Input.GetAxis("Mouse X");
            float vertical = Input.GetAxis("Mouse Y");

            transform.Rotate(0,horizontal * Sensitivity,0);
            Camera.Rotate(-vertical * Sensitivity,0);

            Vector3 currentRotation = Camera.localEulerAngles;
            if (currentRotation.x > 180) currentRotation.x -= 360;
            currentRotation.x = Mathf.Clamp(currentRotation.x,uplimit,downlimit);
            Camera.localRotation = Quaternion.Euler(currentRotation);
        }

        void move()
        {
            float horizontalMove = Input.GetAxis("Horizontal");
            float verticalMove = Input.GetAxis("Vertical");

            if (characterController.isGrounded) verticalspeed = 0;
            else verticalspeed -= gravity * Time.deltaTime;

            Vector3 gravityMove = new Vector3(0,verticalspeed,0);
            Vector3 move = transform.forward * verticalMove + transform.right * horizontalMove;
            characterController.Move(speed * Time.deltaTime * move + gravityMove * Time.deltaTime);
            if (characterController.isGrounded && Input.GetButton("Jump"))
            {
                moveDirection.y = jumpspeed;
            }
            moveDirection.y -= gravity * Time.deltaTime;
            characterController.Move(moveDirection * Time.deltaTime);



        }

    }
}

解决方法

假设您的角色分配了 RigidBody,您可以在脚本中将其引用为,

public class PlayerMovement : MonoBehaviour
{
    private Rigidbody myrigidbody;

    void Start () {
        myrigidbody = GetComponent<Rigidbody>();
    }
}

然后您可以将 jumpspeed 作为 Vector3 传递,而且您可能还需要在此处触发动画。

if (characterController.isGrounded && Input.GetButton("Jump"))
{
     characterController.isGrounded = false;
     myrigidbody.AddForce(new Vector3(0,jumpspeed,0));
     // Trigger your animation,myanimator.SetTrigger("jump");
}
,

Unity 角色控制器移动文档也包含跳转功能。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Example : MonoBehaviour
{
    private CharacterController controller;
    private Vector3 playerVelocity;
    private bool groundedPlayer;
    private float playerSpeed = 2.0f;
    private float jumpHeight = 1.0f;
    private float gravityValue = -9.81f;

    private void Start()
    {
        controller = gameObject.AddComponent<CharacterController>();
    }

    void Update()
    {
        groundedPlayer = controller.isGrounded;
        if (groundedPlayer && playerVelocity.y < 0)
        {
            playerVelocity.y = 0f;
        }

        Vector3 move = new Vector3(Input.GetAxis("Horizontal"),Input.GetAxis("Vertical"));
        controller.Move(move * Time.deltaTime * playerSpeed);

        if (move != Vector3.zero)
        {
            gameObject.transform.forward = move;
        }

        // Changes the height position of the player..
        if (Input.GetButtonDown("Jump") && groundedPlayer)
        {
            playerVelocity.y += Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
        }

        playerVelocity.y += gravityValue * Time.deltaTime;
        controller.Move(playerVelocity * Time.deltaTime);
    }
}