衝突して再スタート
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 31/56。
チャレンジ
中級クラッシュするとプレイが終了し、ボタンを押すと次のプレイが始まります。これまでのレッスンの内容はすべて残しておきます。キャンバスには非表示のGameOverPanelがあり、RestartButtonには「もう一度実行」と表示されています。また、シーンによってGameManagerの新しい2つのフィールド、gameOverPanelとrestartButtonが設定されます。RunnerにはキネマティックRigidbodyがあるため、障害物からトリガーメッセージを受け取ります。
GameManagerでは:
- クラスの上に
public enum GameState { Playing, GameOver }を宣言し、初期値がPlayingとなるpublic GameState stateフィールドをクラスに追加します。 using UnityEngine.UI;、using UnityEngine.SceneManagement;、public GameObject gameOverPanel;、およびpublic Button restartButton;を追加します。- パブリックメソッド
GameOver()は、stateをGameOverに設定し、speedを0にしてすべての障害物を停止させ、パネルを表示します。 Update()は、状態がPlayingでない限り何もしないため、速度と距離が停止します。Start()で、restartButtonを押すと、再生中のシーンが再読み込みされるようにします。
Runnerでは、Obstacleタグが付いたトリガーに入ったとき、GameManager.Instance.GameOver()を呼び出します。状態がPlayingでない間は、矢印キーを押しても何も起こりません。
Spawnerでは、状態がPlayingでない間は何も生成しないようにします。
再生を押してクラッシュし、もう一度実行してから、確認を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public float speed = 10f;
public float speedUp = 0.5f;
public float maxSpeed = 20f;
public TMP_Text distanceText;
private float distance;
void Awake()
{
Instance = this;
}
void Update()
{
speed = Mathf.Min(speed + speedUp * Time.deltaTime, maxSpeed);
distance += speed * Time.deltaTime;
distanceText.text = "Distance: " + Mathf.FloorToInt(distance) + " m";
}
}