2016-10-27 2 views
0

J'essaye d'implémenter le saut de caractère en C# Mais je veux qu'il saute à une hauteur différente, cela dépend de la façon dont vous logez un bouton Jump.
Par exemple si vous frappez l'espace instantanément - vous ne sautez pas si haut Au contraire - le personnage va sauter plus haut, mais à un niveau élevé.
Voici mon code:Unity5: 2D Plate-forme: Saut avec à hauteur différente

private Rigidbody2D rb; 
private Transform lowerPoint; 
private new SpriteRenderer renderer; 
private Animator anim; 
private Transform spawPosition; 

[SerializeField] 
float speed = 3f; 
[SerializeField] 
float jumpForce = 3f; 
[SerializeField] 
Image backgroundImage; 
[SerializeField] 
LayeredSpikes script; 

float secondJumpForce; 
[SerializeField] 
float additionalVelocity; 
const float ADDITION_VELOCITY_LIMIT = 0.9f; 

bool isGrounded; 
bool isAlive; 
bool hasSecondJump; 

void Awake() 
{ 
    rb = GetComponent<Rigidbody2D>(); 
    renderer = GetComponent<SpriteRenderer>(); 
    lowerPoint = GetComponentInChildren<Transform>(); 
    anim = GetComponent<Animator>(); 
    spawPosition = GameObject.FindGameObjectsWithTag ("Respawn")[0].GetComponent<Transform>(); 
} 
void Start() 
{ 
    ResetVelocity(); 
    isGrounded = false; 
    isAlive = true; 
    hasSecondJump = true; 
    Spawn(); 
    secondJumpForce = jumpForce * 0.75f; 
} 

void Update() 
{ 
    if (isAlive) 
    { 
     if (isGrounded) 
     { 
      AnimState = AnimationState.Idle; 
      hasSecondJump = true; 
      additionalVelocity = 0f; 
     } 

     if (Input.GetButtonDown ("Jump")) 
     { 
      Jump(); 
     } 

     if (Input.GetButton ("Jump") 
      && additionalVelocity <= ADDITION_VELOCITY_LIMIT) 
     { 
      additionalVelocity += ADDITION_VELOCITY_LIMIT/3; 
      rb.AddForce(Vector2.up * additionalVelocity); 
     } 

     if (Input.GetButton ("Horizontal")) 
     { 
      Run(); 
     } 
    } 
} 

private void Jump() 
{ 
    AnimState = AnimationState.Jump; 
    float force; 

    if (isGrounded) 
    { 
     force = jumpForce; 
    } 
    else 
    { 
     if (hasSecondJump) 
     { 
      ResetVelocity(); 
      force = secondJumpForce; 
      hasSecondJump = false; 
     } 
     else 
     { 
      force = 0f; 
     } 
    } 
    rb.AddForce (Vector2.up * force, ForceMode2D.Impulse); 
    if (force != 0f) 
    { 
     //script.Trigger(); 
    } 
} 

void ResetVelocity() 
{ 
    rb.velocity = Vector2.zero; 
    additionalVelocity = 0f; 
} 

Je suis en train d'ajouter la force au milieu du saut, mais aucun résultat.

Répondre

4

À première vue, je peux observer votre variable bool isGrounded est toujours faux. Ce problème était délicat, car c'est votre deuxième saut qui fonctionne, mais pas votre premier saut, c'est pourquoi vous avez du mal à le détecter!

Définissez votre variable isGrounded = vrai par défaut sur Démarrer(), puis lorsque vous effectuez votre premier saut, définissez isGrounded = faux.

Vous pouvez ensuite utiliser collisionneurs pour détecter lorsque votre personnage est de retour sur le sol, et le cas échéant, vous devrez faire votre isGrounded variables publique isGrounded.

J'espère que j'étais en mesure d'aider!

  • Noe
+0

Eh bien, le joueur peut sauter, j'ai vérifié. Au tout début de la position de spawn du joueur de niveau est dans l'air, et il n'y a aucun problème avec cela. Peut-être que je ne peux pas décrire mon problème, alors vous pouvez comprendre. Le personnage peut sauter, mais seulement sur une hauteur fixe. La même situation avec le deuxième saut. J'aimerais pouvoir appuyer légèrement sur le bouton de saut et le joueur saute un peu, mais chaque fois que j'appuie sur l'espace, le personnage monte dans les airs avec la même force, et c'est ce que je veux améliorer. Mais merci (: –

+0

Je l'ai peut-être oublié, mais il existe une méthode FixedUpdate, où je vérifie si le personnage est mis à la terre, en utilisant Physics2D class Je ne sais pas pourquoi n'est pas mentionné ici. –