2016-10-14 3 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

나는 velocity.y가 땅에 떨어졌을 때 0에서 조금 떨어져 있고 정확히 0이되기까지 몇 초가 걸린다 고 생각합니다. 그리고 velocity.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); 

일부 설명에 근거하면이 코드는 식별 :

  • groundCheck이 조건 I에서 문자
  • 의 발에 빈 개체입니다 오버레이 박스가 무언가와 충돌했는지 그리고 무언가가 방아쇠가 아닌지 확인하면
  • 마지막으로 속도 속도는 때때로 정확히 0 ~ +0.01f가 나를 위해 일했습니다.