角色不会在Unity2D中跳转而是进入了跳转语句

Character won't jump in Unity2D but entered the jump statement

我在 unity 引擎中的播放器控制脚本 (C#) 有一点问题。我根据玩家的基本动作制定了以下脚本。问题是播放器可以输入跳转语句(debug log打印出来的) Debug Log 但它不会工作。角色还在地上。 当玩家在地面上(接地)并且没有二段跳时,将启用跳跃功能。 所以我的问题是是否有任何 "code mistakes" 或一些我没有看到的配置问题?

提前感谢您的帮助!

using UnityEngine;
using System.Collections;
public class PlayerControl : MonoBehaviour
{

    // public variables
    public float speed = 3f;
    public float jumpHeight = 5f;

    // private variables
    Vector3 movement;
    Animator anim;
    Rigidbody2D playerRigidbody;

    // variables for the ground check
    public Transform groundCheck;
    public float groundCheckRadius;
    public LayerMask whatIsGround;
    private bool grounded;
    private bool doubleJump;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        // Proves if the player is on the ground and activate the double jump function
        if (grounded)
        {
            doubleJump = false;
        }

        // First line of proving the jump
        if (Input.GetMouseButtonDown(0) && grounded)
        {
            Debug.Log("Jump if entered");
            Jump();
        }

        if (Input.GetMouseButtonDown(0) && !doubleJump && !grounded)
        {
            Debug.Log("double Jump");
            Jump();
            doubleJump = true;
        }


        // Flipping the Player when he runs back
        if (Input.GetAxis("Horizontal") < 0)
        {
            playerRigidbody.transform.localScale = new Vector2(-1.7f, 1.7f);
        }

        else
        {
            playerRigidbody.transform.localScale = new Vector2(1.7f, 1.7f);
        }
    }

    void Awake()
    {
        // References setting up
        playerRigidbody = this.GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    void FixedUpdate()
    {
        float horizontal = Input.GetAxisRaw("Horizontal");
        float vertical = Input.GetAxisRaw("Vertical");

        // simple Movement without a speed control
        Move(horizontal, vertical);
        Animating(horizontal, vertical);

        // Section for ground detection
        grounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);

        // Set the parameter for the jump animation false or true
        anim.SetBool("Grounded", grounded);
    }

    void Move(float horizontal, float vertical)
    {
        movement.Set(horizontal, 0f, vertical);
        movement = movement.normalized * speed * Time.deltaTime;

        playerRigidbody.MovePosition(transform.position + movement);
    }

    void Jump()
    {
        playerRigidbody.AddForce(Vector3.up * jumpHeight);
        // playerRigidbody.AddForce(new Vector2(0f, jumpHeight), ForceMode2D.Impulse);
        Debug.Log("Jump function");
    }

    void Animating(float h, float v)
    {
        bool walking = h != 0f || v != 0f;
        anim.SetBool("IsWalking", walking);
    }
}

这里只是猜测,但也许 Vector3.up 不适用于 2D 物理?我不太喜欢 2D,但你可以试试

playerRigidbody.AddForce(transform.up * jumpHeight);

相反。

此外,您是否尝试过不同的 jumpHeight 值? 5 可能太小,具体取决于您为刚体设置的质量。 并确保您没有在检查器中限制任何轴。

// Note:  If you want the object to move in a reliable predictable way but still allow physics interactions, use MovePosition (set the object to kinematic if you want it to be unaffected by physics but still be able to affect other things, and uncheck kinematic if you want both objects to be able to be acted on by physics. 

If you want to move your object but let physics handle the finer details, add a force.

playerRigidbody.rigidbody2D.AddForce(Vector3.up * 10 * Time.deltaTime); 

use Vector.up, Vector.down, vector.right, Vectore.left along with time.deltaTime to have smooth movement along the frame.