2016-08-03 8 views
0

地面に足を置いているときにだけキャラクターを飛びたい。私は彼が「空気ジャンプ」にできるようにしたくないので、私はこのソリューションに付属している:地面に触れるとキャラクターだけが飛ぶことができる

if (JumpButtonPressed()) { 
    if (GetComponent<BoxCollider2D>().IsTouchingLayers(LayerMask.NameToLayer("Ground"))) { 
     velocity.y = jumpForce; 
    } 
} 

アイデアは、「アース」層と接触して、それがジャンプすることができた場合にのみということです。しかし、これは何が起こるかです:

enter image description here

それはちょうど彼の足の仕事をdoesntの。彼が側面でプラットフォームに触れている場合、それは同様にジャンプすることができます。私は何ができますか?

+0

おそらく複数のコライダーが必要です。キャラクター全体を囲む1つのボックスと、フィートのすぐ下の別のコライダー(ジャンプ用)を想像してください。だから体の側が壁に衝突し、あなたがそれに入るのを止めます。そして、 "ジャンプ"コライダーは、ボディーコライダーよりも幅が狭いので、壁に出会うことはありません。しかし、上から衝突すると、ジャンプコライダーは衝突する衝突コライダーになります。 – SimpleVar

+2

別のアプローチは、レイキャストを文字の下に下向きに使用して、彼が接地されているかどうかを判断することです。単一のレイキャストが狭すぎる場合は、代わりに 'Physics2D.BoxCast()'を試して、キャラクターのコライダーの幅と同じ幅にして、キャラクターの隣のコライダーにヒットしないようにしてください。 – Serlite

+0

ええ、それは良いです:) – SimpleVar

答えて

0

circle overlapには、プレーヤーの下部に配置された位置ベクトルを使用します。そこからレイヤーを検出します。

ledge grab、jumpのような機能を書きたい場合は、プラットフォームごとに異なるレイヤーを使用する必要があります。

0

bool isJumpingを作成し、空中でtrueに設定します。それが地面に達したら、それを偽に設定します。あなたのスニペットがUpdate()にある場合のようなSmth:

bool isJumping = false; 
if (JumpButtonPressed() && !isJumping) { 
if (GetComponent<BoxCollider2D>().IsTouchingLayers(LayerMask.NameToLayer("Ground"))) { 
    velocity.y = jumpForce; 
    isJumping = true; 
} 
} 
if (GetComponent<BoxCollider2D>().IsTouchingLayers(LayerMask.NameToLayer("Ground"))) { 
    isJumping = false; 
} 
関連する問題