レベルを再スタートする
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を指しています。
チャレンジ
簡単落下したら、プレイヤーがいるレベルを再開し、落下回数を数えます。
using UnityEngine.SceneManagement;を追加し、カウントをprivate static int falls;に変更して、再読み込みしても値が保持されるようにします。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プレイグラウンド