2016-04-02 2 views
2

私の目標は、それが上陸した場合、プラットフォームが破壊することです。プラットホームに着陸すると、私を跳ね返す(それは無限のジャンパーである)。私はプラットフォームを一気に跳ね返すとどのようにプラットフォームを消滅させるのですか?

問題は、層の破壊が一貫していないです。時にはバウンス、時にはプラットフォームが破壊され得ることはありません、意図したとおりに(私は再びそれを破壊することにバウンス場合)の仕事を破壊するが、他の回は、プラットフォームが破壊されますとバウンスが開始しません。私はそれが毎回動作するようにする方法と、それが正しく動作しない理由がわかりません。

これは私がバウンスのために使用していますコードです:ここでは

public bool platformTouch; //true or false if you are grounded 
public Transform groundCheck; //Object which will check if we are grounded 

public bool groundedTouch; 
public LayerMask ground; //Decide which layers count as grounded. 


float groundRadius = .2f; //Radius around ground check object will check if grounded 
public LayerMask platform; //Decide which layers count as grounded. 

public Rigidbody2D Player; 

void FixedUpdate() 
{ 
     platformTouch = Physics2D.OverlapCircle(groundCheck.position, groundRadius, platform); 

     groundedTouch = Physics2D.OverlapCircle(groundCheck.position, groundRadius, ground); 
} 

は、私が使用しています破壊するコードです。プレイヤーの速度が0(落ち込み)未満の場合、破壊を引き起こすはずです。破壊にも遅延があり、バウンストリガが発生します。

public Rigidbody2D Player; 

void Update() 
{ 
    Player = GameObject.FindGameObjectWithTag("Player").GetComponent<Rigidbody2D>(); 
} 

void OnTriggerEnter2D(Collider2D collider) 
{ 
    if (collider.gameObject.tag == "Destroyer") 
    { 
     if (Player.velocity.y <= 0) 
     { 
      StartCoroutine(DestroyPlatforms()); 
     } 
    } 
} 

IEnumerator DestroyPlatforms() 
{ 
    yield return new WaitForSeconds(.1f); //waits .1 seconds 
    Destroy(gameObject); //this will work after .1 seconds. 
    //play sound 

} 
+3

私は強くあなたが 'プレイヤー= GameObject.FindGameObjectWithTag( "プレーヤー")を動かす示唆GetComponent ();' '無効スタート()'へ。この背後にある理由は単純です:FingGameObjectWithTag/GameObject.FindとGetComponentは非常に高価な関数です。今はすべてのフレームでそれをやっていますが、より良い解決策は、開始時に一度キャッシュして再利用することです。質問にについて :あなたは 'OnCollisionEnter2D'代わりに' OnTriggerEnter2D'のを試したことがありますか? –

+2

あなたのプレイヤーの速度は、動きや平滑さに応じてゼロに達しないことがあります。 0.1fまたは0.5fで試してみてください! – FLX

+0

Rigibidbodyコードを移動しました。ありがとうございます。 OnCollisionEnterが機能しませんでした。彼らが衝突していることを認識していないようです。私はそれがトリガーする方法と、トリガーメカニズムとしてRigidbodyを使用しない方法とが関係していると思います。 –

答えて

2

私は再び私が間違っている可能性があり、(これ、0.1)は、プラットフォーム上で、あなたのコライダーを向上させ、破壊してOnTriggerExit使用することをお勧めします。しかし、助けてくれるでしょう

+0

私はそれを試みます。 –

+0

@TimCooleyこれがうまくいくのはどんな運がありますか? Destroy(this.gameObject、0.1f)も試してみてください。 – Anil

1

物理エンジンは決定的ではなく、2つのオブジェクトが同じ衝突をチェックするのは良い習慣ではありません。ここに。

衝突はプラットフォームによってのみ処理され、StartCoroutine(DestroyPlatforms())を呼び出す前にOnTriggerEnter2Dのプレーヤーでバウンスメソッドを呼び出す必要があります。

+0

合意。これは良い実装です。 –

関連する問題