字符不会在Unity2D中跳转而是进入跳转语句

时间:2016-07-26 06:22:58

标签: c# unity3d-2dtools

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

提前感谢您的帮助!

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);
    }
}

2 个答案:

答案 0 :(得分:0)

在这里猜测,但也许Vector3.up不能用于2D物理?我真的不是2D,但你可以尝试

playerRigidbody.AddForce(transform.up * jumpHeight);

代替。

另外,你有没有尝试过不同的jumpHeight值?根据您为刚体设置的质量,5可能会变小。 并确保您没有限制检查员中的任何轴。

答案 1 :(得分:0)

// 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.