レベルを再スタートする
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 18/56。
レベルをリセットする最も手早い方法は、もう一度読み込むことです。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を指しています。
チャレンジ
簡単2つのレベル、Level1とLevel2があり、それぞれにLevelRestartスクリプトを持つLevelオブジェクトがあります。矢印キーでPlayerを歩かせ、Level1の金色のブロックでLevel2を読み込みます(どちらも準備済みです)。LevelRestart.csを完成させましょう:
- プレイヤーが
fallY(-3)より下に落ちたら、fallsに1を加え、プレイヤーがいるレベルを再起動します。Level2で落ちた場合は、Level2が再起動します。 fallsはゲーム中のすべての落下を数えるため、再読み込み後も値が保持されなければなりません。StartではすでにFalls: 1のように表示されています。
Playを押し、両方のレベルで端から落ちてから、Checkを押してください。
自分で試してみよう
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 より下に落ちたら、落下回数を増やし、プレイヤーがいるレベルを再開する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。