『【初心者向け】Unityで連打ゲームを作る全手順まとめ』7.スクリプトの記述③

7.スクリプトの記述③

スクリプトの記述③

次に「GameFlow」のScriptに以下のコードをコピーして、今のコードの上から上書きしてください。

using UnityEngine;
using TMPro;

public class GameFlow : MonoBehaviour
{
    public GameObject startPanel;
    public GameObject gamePanel;
    public GameObject resultPanel;

    public TextMeshProUGUI scoreText;
    public TextMeshProUGUI timerText; // タイマー用テキスト

    private int score = 0;
    private float timeRemaining = 10.0f; // 制限時間
    private bool isPlaying = false;      // ゲーム中かどうか

   void Start()
  {
    // ゲーム起動時はスタート画面から
    ShowStart();
  }

    void Update()
    {
        // ゲーム中ならタイマーを減らす
        if (isPlaying)
        {
            timeRemaining -= Time.deltaTime;
            timerText.text = "Time: " + Mathf.Ceil(timeRemaining).ToString();

            if (timeRemaining <= 0)
            {
                ShowResult();
            }
        }
    }

    public void ShowStart()
    {
        isPlaying = false;
        startPanel.SetActive(true);
        gamePanel.SetActive(false);
        resultPanel.SetActive(false);
    }

    public void ShowGame()
    {
        score = 0;
        timeRemaining = 10.0f; // 10秒にリセット
        isPlaying = true;      // ゲームスタート!
        
        startPanel.SetActive(false);
        gamePanel.SetActive(true);
        resultPanel.SetActive(false);
        
        UpdateScoreText();
    }

    public void AddScore()
    {
        if (isPlaying) // ゲーム中だけスコア加算
        {
            score++;
            UpdateScoreText();
        }
    }

    void UpdateScoreText()
    {
        scoreText.text = "Score: " + score;
    }

    public void ShowResult()
    {
        isPlaying = false;
        startPanel.SetActive(false);
        gamePanel.SetActive(false);
        resultPanel.SetActive(true);
    }
}

GameManagerを選択し、Inspectorを見ると「Timer Text」という空の枠が追加されています。

Hierarchy の GamePanel にある 「TimerText」(もし作っていなければ新しく作成してください)を、その枠にドラッグ&ドロップしてください。

これで、ゲーム開始時に「Time: 10」と表示され、自動的にカウントダウンが始まります!

ざっくりコード解説3

private bool isPlaying = false; // ゲーム中かどうか

役割: ゲームが「プレイ中」なのか「メニュー画面(スタート・リザルト)中」なのかを記録するスイッチです。

メリット: このスイッチが true の時だけタイマーを動かしたり、スコアを加算したりすることで、スタート画面で勝手に時間が減るなどのバグを防ぎます。

void Update()
{
    if (isPlaying) // ゲーム中なら
    {
        timeRemaining -= Time.deltaTime; // 毎フレーム時間を減らす
        timerText.text = "Time: " + Mathf.Ceil(timeRemaining).ToString(); // 画面に表示

        if (timeRemaining <= 0) // 時間切れになったら
        {
            ShowResult(); // リザルト画面へ
        }
    }
}

Time.deltaTime: 「前回のフレームからの経過時間」を指します。これを使うことで、PCの処理速度に関わらず、どんな環境でも正確に「1秒=1秒」としてカウントできます。

Mathf.Ceil: 小数点以下を切り上げる関数です。これにより、残り時間が「9.8秒、9.7秒…」と表示さ

コメント

タイトルとURLをコピーしました