今回は、ヴァンサバ系ゲームで良くある、タイマーとカウントダウンバー、そして時間切れでゲーム終了の機能を実装していきます。
【関連記事】
時間制限機能の実装
手順:
1. UIの作成
- タイマー用テキスト:
- Hierarchy ウィンドウで
Canvasを右クリック -> 「UI」-> 「Text – TextMeshPro」を選択します。 - 作成されたオブジェクトの名前を
TimerTextに変更します。 Rect TransformとTextMeshPro - Text (UI)コンポーネントを、見やすい位置、フォントサイズ、色などに調整します。
- Hierarchy ウィンドウで
- カウントダウンバー用イメージ:
- Hierarchy ウィンドウで
Canvasを右クリック -> 「UI」-> 「Image」を選択します。 - 作成されたオブジェクトの名前を
TimeBarBackgroundに変更します。 Rect TransformとImageコンポーネントを、見やすい位置、サイズ、色などに調整します。- 必要に応じて、Projectウィンドウから画像を
Source Imageに関連付け、色を調整します。 - Hierarchy ウィンドウで
TimeBarBackgroundを右クリック -> 「UI」-> 「Image」を選択します。 - 作成されたオブジェクトの名前を
TimeBarFillに変更します。 TimeBarFillを選択し、Inspector ウィンドウで以下のように設定します。Rect Transformコンポーネント:Anchors: 左右に広げる (Min: X=0, Y=0, Max: X=1, Y=1)Pivot: 左に設定 (X=0, Y=0.5)Pos X,Pos Y:0に設定Left,Right:0に設定Top,Bottom:0に設定Width:TimeBarBackgroundと同じ幅に設定Height:TimeBarBackgroundと同じ高さに設定
Imageコンポーネント:Source Image: 無し(デフォルトのままでOK)もしくは、ProjectウィンドウのAssetsを右クリック、CreateからSpritesからSquareを選択。Source Imageにドラッグ&ドロップColor: バーの色を調整 (例: 緑色)
TimeBarFillを右クリックして、UIからText-TextMeshProを選択し、名前をTimeTextに変更します。以下の設定とします。Anchors: 中央に設定 (Min: X=0.5, Y=0.5, Max: X=0.5, Y=0.5)Pivot: 中央に設定 (X=0.5, Y=0.5)Pos X,Pos Y:0に設定 (背景画像の中心に配置)Width,Height: テキストを表示するのに十分なサイズに設定 (例: Width=200, Height=50)TextMeshPro - Text (UI)コンポーネント:Text: 初期値を入力 (例: “60”)Font Size: 適切なサイズに調整 (例: 24)Alignment: 中央揃えColor: 見やすい色に設定 (例: 黒)
- Hierarchy ウィンドウで
2. タイマー制御スクリプトの作成
Scriptsフォルダ内に、TimerController.csという名前の新しい C# スクリプトを作成します。- 以下のコードを
TimerController.csに記述します。
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.SceneManagement;
public class TimerController : MonoBehaviour
{
public float timeLimit = 60f; // 制限時間(秒)
public TextMeshProUGUI timerText; // タイマー表示用テキスト
public Image timeBarFill; // カウントダウンバーのゲージ部分
public TextMeshProUGUI timeBarText;
private float currentTime;
private float startingWidth;
void Start()
{
currentTime = timeLimit;
startingWidth = timeBarFill.rectTransform.sizeDelta.x;
UpdateTimeDisplay();
}
void Update()
{
if (currentTime > 0)
{
currentTime -= Time.deltaTime;
UpdateTimeDisplay();
// カウントダウンバーを更新
float timePercentage = currentTime / timeLimit;
timeBarFill.rectTransform.sizeDelta = new Vector2(startingWidth * timePercentage, timeBarFill.rectTransform.sizeDelta.y);
}
else
{
// ゲーム終了処理
GameOver();
}
}
void UpdateTimeDisplay()
{
int minutes = Mathf.FloorToInt(currentTime / 60);
int seconds = Mathf.FloorToInt(currentTime % 60);
timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
timeBarText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
}
void GameOver()
{
// ここにゲーム終了時の処理を記述(例:リザルト画面の表示など)
Debug.Log("Time's up! Game Over!");
SceneManager.LoadScene("GameOver"); // 仮に、GameOverというシーンに遷移
}
}
コード解説:
timeLimit: 制限時間を設定します (秒単位)。Inspector ウィンドウで調整できます。timerText: タイマーの残り時間を表示するTextMeshProUGUIオブジェクトを格納します。timeBarFill: カウントダウンバーのゲージ部分のImageオブジェクトを格納します。currentTime: 現在の残り時間を格納します。startingWidth: カウントダウンバーの開始時の幅を格納します。Start():currentTimeをtimeLimitで初期化します。startingWidthにtimeBarFillの初期の幅を記録します。UpdateTimeDisplay()を呼び出して、タイマー表示を更新します。
Update():currentTimeが 0 より大きい間、毎フレームTime.deltaTime(前回のフレームからの経過時間) を引いて残り時間を減らします。UpdateTimeDisplay()を呼び出して、タイマー表示を更新します。timePercentageで残り時間の割合を計算します。timeBarFill.rectTransform.sizeDeltaを更新して、カウントダウンバーの幅を変更します。currentTimeが 0 以下になったら、GameOver()を呼び出します。
UpdateTimeDisplay():currentTimeを分と秒に分けて、timerText.textに表示します。
GameOver():- ゲーム終了時の処理を記述します。ここではとりあえず、コンソールに “Time’s up! Game Over!” と表示し、”GameOver”という名前のシーンに移動しています。
3. スクリプトのアタッチと設定
Canvasオブジェクト (または別のオブジェクト) にTimerControllerスクリプトをアタッチします。- Inspector ウィンドウで、
TimerControllerコンポーネントの以下の変数を設定します。Time Limit: 制限時間を秒単位で設定 (例: 60)。Timer Text: Hierarchy ウィンドウからTimerTextオブジェクトをドラッグ&ドロップします。Time Bar Fill: Hierarchy ウィンドウからTimeBarFillオブジェクトをドラッグ&ドロップします。Time Bar Text: Hierarchy ウィンドウからTimeTextオブジェクトをドラッグ&ドロップします。
4. ゲームオーバー処理の準備
- 現状、
GameOver()関数ではコンソールにメッセージを表示し、”GameOver” シーンに遷移するようになっています。 - 必要に応じて、ゲームオーバー時の処理 (リザルト画面の表示、スコアの保存など) を
GameOver()関数に追加してください。 - また、
GameOverシーンを作成し、UIなどを配置してください。
5. 実行と確認
- ゲームを実行して、タイマーとカウントダウンバーが表示され、時間が減少していくことを確認します。
- 制限時間になると、コンソールに “Time’s up! Game Over!” と表示され、”GameOver”シーンに遷移することを確認します。


