私の目標は、それが上陸した場合、プラットフォームが破壊することです。プラットホームに着陸すると、私を跳ね返す(それは無限のジャンパーである)。私はプラットフォームを一気に跳ね返すとどのようにプラットフォームを消滅させるのですか?
問題は、層の破壊が一貫していないです。時にはバウンス、時にはプラットフォームが破壊され得ることはありません、意図したとおりに(私は再びそれを破壊することにバウンス場合)の仕事を破壊するが、他の回は、プラットフォームが破壊されますとバウンスが開始しません。私はそれが毎回動作するようにする方法と、それが正しく動作しない理由がわかりません。
これは私がバウンスのために使用していますコードです:ここでは
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
}
私は強くあなたが 'プレイヤー= GameObject.FindGameObjectWithTag( "プレーヤー")を動かす示唆GetComponent();' '無効スタート()'へ。この背後にある理由は単純です:FingGameObjectWithTag/GameObject.FindとGetComponentは非常に高価な関数です。今はすべてのフレームでそれをやっていますが、より良い解決策は、開始時に一度キャッシュして再利用することです。質問にについて :あなたは 'OnCollisionEnter2D'代わりに' OnTriggerEnter2D'のを試したことがありますか? –
あなたのプレイヤーの速度は、動きや平滑さに応じてゼロに達しないことがあります。 0.1fまたは0.5fで試してみてください! – FLX
Rigibidbodyコードを移動しました。ありがとうございます。 OnCollisionEnterが機能しませんでした。彼らが衝突していることを認識していないようです。私はそれがトリガーする方法と、トリガーメカニズムとしてRigidbodyを使用しない方法とが関係していると思います。 –