繁体   English   中英

角色不会在Unity2D中跳转,但输入了跳转语句

[英]Character won't jump in Unity2D but entered the jump statement

我的统一播放器中的播放器控制脚本(C#)有点问题。 我根据播放器的基本动作制定了以下脚本。 问题是播放器可以输入跳转语句(将调试日志打印出来)和调试日志,但是它将不起作用。 角色仍然在地面上。 当播放器在地面上(接地)并且没有两次跳跃时,将启用跳跃功能。 所以我的问题是是否有任何“代码错误”或某些我看不到的配置问题?

提前谢谢你的帮助!

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM