2014-09-29 6 views
-2

내 캐릭터가 doublejump를 할 수있게하려는 시도가 C#으로 너무 많이 코딩되지 않았습니다. 나는 이미 다른 것을 시도했지만 아무도 나를 가르쳐 주면 좋을 작품이 없다는 것을 알았습니다.Unity Doublejump in C#

using UnityEngine; 

public class PlatformerCharacter2D : MonoBehaviour 
{ 
    bool facingRight = true;       // For determining which way the player is currently facing. 

    [SerializeField] float maxSpeed = 10f;    // The fastest the player can travel in the x axis. 
    [SerializeField] float jumpForce = 400f;   // Amount of force added when the player jumps. 

    [Range(0, 1)] 
    [SerializeField] float crouchSpeed = .36f;   // Amount of maxSpeed applied to crouching movement. 1 = 100% 

    [SerializeField] bool airControl = false;   // Whether or not a player can steer while jumping; 
    [SerializeField] LayerMask whatIsGround;   // A mask determining what is ground to the character 

    Transform groundCheck;        // A position marking where to check if the player is grounded. 
    float groundedRadius = .2f;       // Radius of the overlap circle to determine if grounded 
    bool grounded = false;        // Whether or not the player is grounded. 
    Transform ceilingCheck;        // A position marking where to check for ceilings 
    float ceilingRadius = .01f;       // Radius of the overlap circle to determine if the player can stand up 
    Animator anim;          // Reference to the player's animator component. 


    void Awake() 
    { 
     // Setting up references. 
     groundCheck = transform.Find("GroundCheck"); 
     ceilingCheck = transform.Find("CeilingCheck"); 
     anim = GetComponent<Animator>(); 
    } 


    void FixedUpdate() 
    { 
     // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground 
     grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround); 
     anim.SetBool("Ground", grounded); 

     // Set the vertical animation 
     anim.SetFloat("vSpeed", rigidbody2D.velocity.y); 
    } 


    public void Move(float move, bool crouch, bool jump) 
    {  
     // If crouching, check to see if the character can stand up 
     if(!crouch && anim.GetBool("Crouch")) 
     { 
      // If the character has a ceiling preventing them from standing up, keep them crouching 
      if(Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround)) 
       crouch = true; 
     } 

     // Set whether or not the character is crouching in the animator 
     anim.SetBool("Crouch", crouch); 

     //only control the player if grounded or airControl is turned on 
     if(grounded || airControl) 
     { 
      // Reduce the speed if crouching by the crouchSpeed multiplier 
      move = (crouch ? move * crouchSpeed : move); 

      // The Speed animator parameter is set to the absolute value of the horizontal input. 
      anim.SetFloat("Speed", Mathf.Abs(move)); 

      // Move the character 
      rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y); 

      // If the input is moving the player right and the player is facing left... 
      if(move > 0 && !facingRight) 
       // ... flip the player. 
       Flip(); 
      // Otherwise if the input is moving the player left and the player is facing right... 
      else if(move < 0 && facingRight) 
       // ... flip the player. 
       Flip(); 
     } 

     // If the player should jump... 
     if (grounded && jump) { 
     // Add a vertical force to the player. 
     anim.SetBool ("Ground", false); 
     rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
     } 
    } 


    void Flip() 
    { 
     // Switch the way the player is labelled as facing. 
     facingRight = !facingRight; 

     // Multiply the player's x local scale by -1. 
     Vector3 theScale = transform.localScale; 
     theScale.x *= -1; 
     transform.localScale = theScale; 
    } 
} 

답변

0

은 당신의 코드를 테스트하지 않은,하지만 다음과 같은 작업을해야합니다 :

using UnityEngine; 

public class PlatformerCharacter2D : MonoBehaviour 
{ 
    bool facingRight = true;       // For determining which way the player is currently facing. 

    [SerializeField] float maxSpeed = 10f;    // The fastest the player can travel in the x axis. 
    [SerializeField] float jumpForce = 400f;   // Amount of force added when the player jumps. 

    [Range(0, 1)] 
    [SerializeField] float crouchSpeed = .36f;   // Amount of maxSpeed applied to crouching movement. 1 = 100% 

    [SerializeField] bool airControl = false;   // Whether or not a player can steer while jumping; 
    [SerializeField] LayerMask whatIsGround;   // A mask determining what is ground to the character 

    Transform groundCheck;        // A position marking where to check if the player is grounded. 
    float groundedRadius = .2f;       // Radius of the overlap circle to determine if grounded 
    bool grounded = false;        // Whether or not the player is grounded. 
    Transform ceilingCheck;        // A position marking where to check for ceilings 
    float ceilingRadius = .01f;       // Radius of the overlap circle to determine if the player can stand up 
    Animator anim;          // Reference to the player's animator component. 

    int maxNumberOfAirJumps = 1;      // Number of times the player can jump in the air 
    int numberOfAirJumpsLeft = 0; 


    void Awake() 
    { 
     // Setting up references. 
     groundCheck = transform.Find("GroundCheck"); 
     ceilingCheck = transform.Find("CeilingCheck"); 
     anim = GetComponent<Animator>(); 
    } 


    void FixedUpdate() 
    { 
     // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground 
     grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround); 
     anim.SetBool("Ground", grounded); 

     // Set the vertical animation 
     anim.SetFloat("vSpeed", rigidbody2D.velocity.y); 
    } 


    public void Move(float move, bool crouch, bool jump) 
    {  
     // If crouching, check to see if the character can stand up 
     if(!crouch && anim.GetBool("Crouch")) 
     { 
      // If the character has a ceiling preventing them from standing up, keep them crouching 
      if(Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround)) 
       crouch = true; 
     } 

     // Set whether or not the character is crouching in the animator 
     anim.SetBool("Crouch", crouch); 

     //only control the player if grounded or airControl is turned on 
     if(grounded || airControl) 
     { 
      // Reduce the speed if crouching by the crouchSpeed multiplier 
      move = (crouch ? move * crouchSpeed : move); 

      // The Speed animator parameter is set to the absolute value of the horizontal input. 
      anim.SetFloat("Speed", Mathf.Abs(move)); 

      // Move the character 
      rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y); 

      // If the input is moving the player right and the player is facing left... 
      if(move > 0 && !facingRight) 
       // ... flip the player. 
       Flip(); 
      // Otherwise if the input is moving the player left and the player is facing right... 
      else if(move < 0 && facingRight) 
       // ... flip the player. 
       Flip(); 
     } 

     // If the player should jump... 
     if (grounded && jump) { 
      // Add a vertical force to the player. 
      anim.SetBool ("Ground", false); 
      rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
      numberOfAirJumpsLeft = maxNumberOfAirJumps; //Reset the air jumps when the player jumps 
     } 
     else if (!grounded && jump && numberOfAirJumpsLeft > 0) 
     { 
      rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
      numberOfAirJumpsLeft--; //One less jump 
     } 
    } 


    void Flip() 
    { 
     // Switch the way the player is labelled as facing. 
     facingRight = !facingRight; 

     // Multiply the player's x local scale by -1. 
     Vector3 theScale = transform.localScale; 
     theScale.x *= -1; 
     transform.localScale = theScale; 
    } 
} 

또한 모든 [SerializeField]가 작동

+0

덕분에 아마 unnessacery 있습니다! 그러나 나는 두 번째 점프를하기 위해 1 초를 기다리는 것보다 두 배나 빠른 속도로 내 캐릭터가 거의 4 배나 뛰게 될 것이라고 또 다른 문제가 있습니다. 이 문제를 어떻게 해결할 수 있습니까? – Uchihaperi