Menu
CoddyTech

レベルを再スタートする

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 18/60。

レベルをリセットする最も手早い方法は、もう一度読み込むことです。SceneManager.GetActiveScene()は現在開いているシーンを返し、そのname(またはbuildIndex)をLoadSceneに渡します。ゲームオーバーパネルにあるこの「再スタート」ボタンは、次のコードを呼び出します。

public void Restart()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

Unityは開いているシーンを破棄し、シーンファイルから再び構築します。倒された木箱も含め、すべてのオブジェクトがシーン内で元々置かれていた場所に戻り、各フィールドにはInspectorの値が再設定され、AwakeとStartも再び実行されます。ひとつずつ元に戻すコードを書く必要はありません。ボタンは"Level3"のような名前ではなく、アクティブなシーンを指定するため、同じスクリプトを配置したどのレベルでも再スタートできます。

staticフィールドはシーンの一部ではありません。クラスに属するため、再読み込みしてもそのまま残ります。private static float bestTime;は再スタート後も最速タイムを保持しますが、通常のprivate float time;は新しいシーンで0から再び始まります。GameManager.Instanceもstaticです。再読み込み後は、新しいGameManagerのAwakeが設定するまで、破棄されたGameManagerを指しています。

challenge icon

チャレンジ

簡単

落下したら、プレイヤーがいるレベルを再開し、落下回数を数えます。

  1. using UnityEngine.SceneManagement;を追加し、カウントをprivate static int falls;に変更して、再読み込みしても値が保持されるようにします。
  2. Update()で、player.position.y < fallYのとき、falls++;を実行し、SceneManager.GetActiveScene().nameを読み込みます。

「プレイ」を押して、両方のレベルで端から歩いて落下します。Falls: 1、続いてFalls: 2と表示されます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;
using TMPro;

public class LevelRestart : MonoBehaviour
{
    public Transform player;
    public TMP_Text fallsText;
    public float fallY = -3f;
    private int falls;

    void Start()
    {
        fallsText.text = "Falls: " + falls;
    }

    void Update()
    {
        // fallY より下に落ちた場合:落下回数を増やし、プレイヤーがいるレベルをやり直す
    }
}

本格的なゲームを作るのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド