2015-01-09 3 views
1

Я пытаюсь заставить своего персонажа дважды прыгать в Unity с C#. Это код, который я использую, но он не позволит двойному прыжку персонажа. Кто-нибудь знает решение этой проблемы?Я не могу заставить свою игру charater выполнить «Двойной прыжок»

public class Tito : MonoBehaviour { 

public float speed = 1; //SIDEWAYS SPEED 
public float jump = 1; //JUMP HEIGHT 
public float width = 0.5079113f; //CHARACTER WIDTH 
public float score; //TOTAL AMOUNT OF COLLECTED COINS 
public GUIText scoreText; 
public bool inair = false; // TRUE = TITO IS IN AIR 
public bool grounded = false; // TRUE = TITO IS ON THE GROUND 
public bool doublejump = false; 

void Start() 
{ 
    GameObject Text = GameObject.Find("Text"); 
} 


// COIN PICK UP // 
void OnTriggerEnter2D(Collider2D other) 
{ 
    if(other.tag == "Coin") 
    { 
     Debug.Log ("Coins Collected = " + (score)); 
     (score) += 1; 
     Destroy(other.gameObject); 
    } 
} 

void OnCollisionEnter2D(Collision2D coll) 
{ 

// DEATH HIT // 
    if (coll.gameObject.tag == "Dead") 
    { 
     Debug.Log ("You died! Restarting Game"); 
     Application.LoadLevel (Application.loadedLevel); 
    } 

// CHECK TO SEE IF GROUNDED // 
    if (coll.gameObject.name == "Ground") 
    { 
     Debug.Log ("Grounded"); 
     grounded = true; 
     inair = false; 
     doublejump = false; 
    } 

} 

void Update() 
{ 

// LOCK ROTATION // 
    { 
     transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, 0, 0); 
    } 


// INPUT - MOVEMENT // 
if (Input.GetKey(KeyCode.RightArrow)) 
    { 
     gameObject.transform.Translate(speed, 0, 0); 
     transform.localScale = new Vector3 (width, width, width); 
    } 

if (Input.GetKey(KeyCode.LeftArrow)) 
    { 
     gameObject.transform.Translate(-speed, 0, 0); 
     transform.localScale = new Vector3 (-width, width, width); 
    } 



     if (Input.GetKey(KeyCode.Space)) 
     { 
      if (grounded == true) 
      { 
       rigidbody2D.velocity = new Vector3 (0, jump, 0); 
       Debug.Log ("SingleJump"); 
       grounded = false; 
       doublejump = true; 
      } 
      else if (doublejump == true) 
      { 
       rigidbody2D.velocity = new Vector3 (0, jump, 0); 
       Debug.Log ("DoubleJump"); 
       doublejump = false;    
      } 
     } 
    } 

/* 
if (grounded == true) // IF IN TOUCH WITH GROUND 
    { 
     if (Input.GetKey(KeyCode.Space)) 
     { 
     rigidbody2D.velocity = new Vector3 (0, jump, 0); 
      Debug.Log ("In-Air"); 
      inair = true; 
      grounded = false; 

     } 
    } 
*/ 

}

+0

Так что происходит, когда вы пытаетесь? Что написано в журнале отладки? –

+0

Я думаю, вы не показываете нам все. Я не вижу явной ошибки в этом коде. Может ли 'Update()' вызываться во время прыжка? Являются ли 'singlejump' и' doublejump' объявлены в области метода? –

+0

В журнале отладки говорится: «Заземленный», когда на земле, и «InAir» и «DoubleJump» при ударе пространства один раз. – Nils

ответ

0

Вы первый вызов Input.GetKey(KeyCode.Space) убрали клавишу пробела из входного буфера.

Вы читаете пробел из буфера, но не используете его в своем методе. Вы должны изменить его на:

void Update() 
{ 
    if (Input.GetKey(KeyCode.Space)) 
    { 
     if (grounded == true) 
     { 
      rigidbody2D.velocity = new Vector3 (0, jump, 0); 
      Debug.Log ("SingleJump"); 
      grounded = false; 
      doublejump = true; 
     } 
     else if (doublejump == true) 
     { 
      rigidbody2D.velocity = new Vector3 (0, jump, 0); 
      Debug.Log ("DoubleJump"); 
      doublejump = false;    
     } 
    } 
} 
+0

Извините, это разные фрагменты моего кода. Скачок не находится в событии OnCollisionEnter2d. Сожалею. Сейчас изменится. Спасибо за быстрый ответ tho :) – Nils

+0

По-прежнему та же проблема. Когда вызывается обновление? –

+0

@ Нильс немного глупо менять вопрос, когда уже был дан ответ. –

0

Уловка - проверить, когда находитесь на земле и когда вы находитесь в воздухе.

if (Input.GetKey(KeyCode.Space)) 
{ 
    if(grounded) 
    { 
     rigidbody2D.velocity.y = 0; 
     rigidbody2D.AddForce(new Vector2(0, jumpForce)); 
     canDoubleJump = true; 
    } 

    else if(canDoubleJump) 
    { 
     canDoubleJump = false; 
     rigidbody2D.velocity.y = 0; 
     rigidbody2D.AddForce(new Vector2(0, jumpForce)); 
    } 
} 
1

Я смог исправить это, используя совершенно другой способ. Это проще, меньше кода и работает как шарм.

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

public class Tito : MonoBehaviour { 
    public float jumpspeed = 50; //JUMP HEIGHT 
    public bool grounded = false; // TRUE = TITO IS ON THE GROUND 
    public int jumps = 0; // COUNTER TO CHECK THE AMOUNT OF JUMPS 
    public int maxJumps = 2; // MAX EXTRA JUMPS 

    void OnCollisionEnter2D(Collision2D coll) { 
     // CHECK TO SEE IF GROUNDED // 
     if (coll.gameObject.name == "Ground") { 
      Debug.Log ("Grounded"); 
      grounded = true; 
      jumps = 0; 
     } 
    } 

    void Update() { 
     if (Input.GetKeyDown(KeyCode.Space) && jumps < maxJumps) { 
      Jump(); 
     } 
    } 

    void Jump() { 
     rigidbody2D.velocity = new Vector3 (0, jumpspeed, 0); 
     jumps = jumps +1; 
    } 
} 
Смежные вопросы