2016-12-09 11 views
1

私は、ボールプロジェクトのチュートリアルをロールページのように動かすユニティプロジェクトに取り組んでいます。基本的に、ボールは一度だけジャンプして、私はすでにロジックを実装しています。しかし何かが失敗し、私は理解できません。ここでボールを一度だけ飛ばす

は私のコードが再開

public bool inAir = false; 


void OnCollisionEnter(Collision other){ 
    if (other.gameObject.tag=="Terrain") 
     inAir = false; 
     else 
     inAir = true; 
    } 

void FixedUpdate() { 
    float moveHorizontal = Input.GetAxis ("Horizontal"); 
    float moveVertical = Input.GetAxis ("Vertical"); 

    Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical); 

    rb.AddForce (movement * speed); 
    Debug.Log (inAir); 

    if (Input.GetKeyDown ("space") && !inAir){ 
     rb.AddForce(new Vector3(0,jump,0)); 
    } 

} 

です:を私はちょうど、私は場合colisionを入力して確認し、ボールが床から始まるためでfalseに設定されているinAir変数が始まる追加しましたオブジェクトが他のオブジェクトと衝突して、地形inAirにタグを変更した場合はfalse、そうでない場合はTrue、次にFixedUpdateチェックの最後にキーがスペースであるかどうか、ボールが空気中にない場合ボールはジャンプすることができる

何が起きているのですか:変数inAirは常に偽です。常にそうであれば最初に入り、常に偽になります。他に入力しないので、何が間違っていますか?

+0

これは決して他のものと衝突しませんか? – TheLethalCoder

+0

プレイヤーがジャンプした後(その2回目の 'AddForce'呼び出しの直後)、' inAir'を真に設定したいかもしれません。 – rutter

答えて

1

代わりOnCollisionEnter機能にtrueまたはfalseinAirを設定するのでは、あまりにも、その後OnCollisionExit実装の両方の機能でそれを設定します。これはより信頼できます。

public bool inAir = false; 

void OnCollisionEnter(Collision other) 
{ 
    if (other.gameObject.tag == "Terrain") 
     inAir = false; 
} 

void OnCollisionExit(Collision other) 
{ 
    if (other.gameObject.tag == "Terrain") 
     inAir = true; 
} 
+0

偉大な働きました、ありがとう、あなたは値を変更しましたが、私は答えを得ました:D –

+0

ええ、ただ気づいた。それを修正し、あなたは歓迎です! – Programmer