Menu
CoddyTech

衝突して再スタート

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

challenge icon

チャレンジ

中級

クラッシュするとプレイが終了し、ボタンを押すと次のプレイが始まります。これまでのレッスンの内容はすべて残しておきます。キャンバスには非表示の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";
    }
}

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