2016-10-14 6 views
1

В моем проекте 2D Unity мой игрок не всегда прыгает, нажимая кнопку «прыгать». Он не прыгает, когда я приземляюсь на землю, но после того, как секунда «была заземлена», он снова может прыгать. Что может быть эта проблема?Мой игрок не всегда прыгает, когда я нажимаю кнопку «прыгать»

using UnityEngine; 
    using System.Collections; 
    using UnityEngine.UI; 

    public class player : MonoBehaviour { 

     private static player instance; 

     public static player Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = GameObject.FindObjectOfType<player>(); 
       } 
       return instance; 
      } 

     } 


     private Animator myAnimator; 

     [SerializeField] 
     public static float movementSpeed; 

     private bool facingRight = true; 

     [SerializeField] 
     private Transform[] groundPoints; 

     [SerializeField] 
     private float groundRadius; 

     [SerializeField] 
     private LayerMask whatIsGround; 

     [SerializeField] 
     private bool airControl; 

     [SerializeField] 
     private float jumpForce; 

     public bool canMove; 

     public AudioClip jump001; 
     public AudioClip jump002; 

     private float direction; 
     private bool move; 
     private float btnHorizontal; 

     public Rigidbody2D MyRigidbody { get; set; } 

     public bool Attack { get; set; } 

     public bool Jump { get; set; } 

     public bool OnGround { get; set; } 





     // Use this for initialization 
     void Start() { 

      facingRight = true; 
      MyRigidbody = GetComponent<Rigidbody2D>(); 
      myAnimator = GetComponent<Animator>(); 




     } 
     void Update() 
     { 

      HandleInput(); 

     } 
     // Update is called once per frame 
     void FixedUpdate() 
     { 

      OnGround = IsGrounded(); 

      float horizontal = Input.GetAxis("Horizontal"); 

      if (move) 
      { 
       this.btnHorizontal = Mathf.Lerp(btnHorizontal, direction, Time.deltaTime * 5); 
       HandleMovement(btnHorizontal); 
       Flip(direction); 
      } 
      else 
      { 

       HandleMovement(horizontal); 

       Flip(horizontal); 
      } 

      if (!canMove) 
      { 
       GetComponent<Rigidbody2D>().velocity = new Vector2(0, GetComponent<Rigidbody2D>().velocity.y); 
       myAnimator.SetFloat("speed", 0); 
       return; 
      } 




      HandleLayers(); 
     } 


     private void HandleMovement(float horizontal) 
     { 
      if (MyRigidbody.velocity.y < 0) 
      { 
       myAnimator.SetBool("land", true); 
      } 
      if (!Attack && (OnGround || airControl)) 
      { 
       MyRigidbody.velocity = new Vector2(horizontal * movementSpeed, MyRigidbody.velocity.y); 
      } 
      if (Jump && MyRigidbody.velocity.y == 0) 
      { 
       SoundManager.instance.RandomizeSfx(jump001, jump002); 
       MyRigidbody.AddForce(new Vector2(0, jumpForce)); 
      } 

      myAnimator.SetFloat("speed", Mathf.Abs(horizontal)); 
     } 


     private void HandleInput() 
     { 
      if (canMove) 
      { 

       //Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W) || 
       if (Input.GetButtonDown("Jump")) 
       { 
        myAnimator.SetTrigger("jump"); 

       } 
       if (Input.GetKeyDown(KeyCode.Z) || Input.GetButton("Fight") && OnGround && !Jump) 
       { 
        myAnimator.SetTrigger("attack"); 
       } 
      } 
     } 

     private void Flip(float horizontal) 
     { 
      if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight && canMove) 
      { 
       facingRight = !facingRight; 

       Vector3 theScale = transform.localScale; 

       theScale.x *= -1; 

       transform.localScale = theScale; 
      } 

     } 


     private bool IsGrounded() 
     { 
      { 

      } 
      if (MyRigidbody.velocity.y <= 0) 
      { 
       foreach (Transform point in groundPoints) 
       { 
        Collider2D[] colliders = Physics2D.OverlapCircleAll(point.position, groundRadius, whatIsGround); 

        for (int i = 0; i < colliders.Length; i++) 
        { 
         if (colliders[i].gameObject != gameObject) 
         { 
          return true; 
         } 
        } 
       } 
      } 
      return false; 
     } 

     private void HandleLayers() 
     { 
      if (!OnGround) 
      { 
       myAnimator.SetLayerWeight(1, 1); 
      } 
      else 
      { 

       myAnimator.SetLayerWeight(1, 0); 
      } 

     } 

     //TouchKnappar 

     public void BtnJump() 
     { 
      if (canMove) 
      { 


       myAnimator.SetTrigger("jump"); 
       Jump = true; 
      } 
     } 
     public void BtnAttack() 
     { 

       myAnimator.SetTrigger("attack"); 
       Attack = true; 

     } 
     public void BtnMove(float direction) 
     { 

       this.direction = direction; 
       this.move = true; 

     } 
     public void BtnStopMove() 
     { 

       this.direction = 0; 
       this.btnHorizontal = 0; 
       this.move = false; 

     } 
     public void BtnStopJump() 
     { 

       Jump = false; 


    } 


    } 
+0

Возможно ли, что ваш персонаж ненадолго подпрыгивает, когда он приземляется, вызывая проверку 'MyRigidbody.velocity.y <= 0' на ошибку? Попробуйте использовать 'Debug.Log()' для проверки этого. – Serlite

+0

Я предполагаю, что скорость.y немного меньше 0, когда на земле и занимает несколько секунд, чтобы стать точно 0. И скорость.y может быть даже отрицательной. Поэтому возможно изменение (Jump && MyRigidbody.velocity.y == 0) на (Jump && MyRigidbody.velocity.y> = 0) может работать. Но, честно говоря, весь код должен быть переработан ... – Alox

+0

Хорошо, спасибо, я посмотрю на это. Это моя первая игра, и я последовал за парнем на youtube и сделал некоторые изменения сам. я не понимаю весь код полностью. –

ответ

1

У меня была такая же проблема, и это исправило это для меня.

Этот код определяет, если символ основывается на FixedUpdate()

Collider2D groundCol = Physics2D.OverlapBox(groundCheck.position, groundBoxRadius, 0f, whatIsGround); 
this.grounded = (groundCol != null && !groundCol.isTrigger && this.rigbody2d.velocity.y > -0.01f && this.rigbody2d.velocity.y < 0.01f); 

Некоторые пояснения:

  • Контроль заземления является пустой объект у ног персонажа
  • в условии I проверяя, что поле Overlay столкнулось с чем-то a, и если это что-то не является триггером
  • Наконец, скорость скорости иногда не может быть t точно a 0, так что + -0.01f работал для меня