Respawnコルーチンの何が問題になっていますか?


19

プレイヤーがベース/グラウンドから落ちた場合、プレイヤーを最も近いチェックポイントでリスポーンさせる2Dプラットホーマーゲームを作成しています。ただし、プレイヤーが地面から落ちてからリスポーンするまでに遅延が必要です。これは、この目標を達成するための私のコードのセクションです。

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log(collision.tag);
    if (collision.tag.Equals("Kill")) 
    {
        StartCoroutine("Respawn");
    }
    else if(collision.tag.Equals("Checkpoint"))
    {

        Animator flag = collision.GetComponent<Animator>();
        if (!flag.GetBool("hasCrossed"))
        {
            flagCounter++;
            flag.SetBool("hasCrossed", true);
            checkpoint = collision.gameObject.transform.position;
        }
    }
}

IEnumerator Respawn()
{
    yield return new WaitForSeconds(respawnDelay);
    transform.position = checkpoint;

}

これは、1秒または2秒のような小さなリスポーン遅延に対して正常に機能します。しかし、遅延を5秒に増やすと、最も近いチェックポイントに現れたプレーヤーはすぐに消えてしまい、かなりの数の繰り返しの後、プレーヤーが再び現れます。

これは2秒の遅延です これは2秒の遅延です

これは5秒の遅延です これは5秒の遅延です

どうすれば修正できますか?


3
アニメーションのスクリーンショットが大好き!
コネラック

回答:


49

これは、コルーチンの設定方法とは何の関係もないようです。おそらく起こっているのは、プレイヤーが地面とフォールアウトコライダーを通り過ぎてグリッチに落ちる間、十分に高い加速を得るということです。リスポーン中にポジションを移動しても、同じ速度で落下します。Respawnメソッドで、待機ラインの後、速度をゼロに戻しますGetComponent<Rigidbody2D>().velocity = Vector2.zero


2
ゲームバグはすごいxD
トム

11
より一般的には、位置以外に必要なだけプレイヤーキャラクターの状態をリセットする必要があります。健康、MP、弾薬など。それがその種のゲームなら、敵の敵もリセットすることを忘れないでください。
ラチェットフリーク

@ジョーですが、狂気はどうですか?
デビッドスターキー

8
関連:ゲームが物理ベースでない限り、多くのプラットフォーマーは「最大落下速度」を持ち、より制御された落下を可能にします(そしてこのようなバグを回避します)。
無視
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.