Unityで、ゲーム終了時に経過時間を表示する

経過時間をリアルタイムに表示させるものしか検索結果に出てこないため、書き残した

参考にしたもの

Canvasを作成する

public class TimerText : MonoBehaviour
{
private TextMeshProUGUI timerText;
private float timer;

void Start()
{
    timerText = GetComponent<TextMeshProUGUI>();
    timerText.text = $"Claer Time: {Time.time:0.00}"; 
}

// Update is called once per frame
void Update()
{

} }
- 画面下部のプロジェクトタブ上にあるコードファイルを、画面左横のヒエラルキータブ上のtimerオブジェクトにドロップし、TimerText.csをTimerにアタッチする。これでCanvasが呼ばれたとき、Time.timeから経過時間を取得し、timerにそれを流し込む。

## ゲーム終了時にキャンバスを呼ぶ
![](Pasted%20image%2020260330050927.png)

- 画面左横のヒエラルキータブの「<」ボタンをクリックし、キャンバス編集モードを離脱する。
- 画面下のプロジェクトタブ上で左クリックするなどしてCreate>C# ScriptでC#コードを作成する。名前はGameManagerにする。
- コードの中身を以下のように書き換える
```c
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public void GameClear()
    {
        Time.timeScale = 0f; // 時間を停止する
        GameObject ClearCanvas = Resources.Load<GameObject>("ClearCanvas");
        GameObject clearCanvas = Instantiate(ClearCanvas);
    }
}

これでgameManager.GameClear();を呼ぶとClearCanvasが呼ばれる

ゲームの終了条件を決める

public class SatScript : MonoBehaviour
{
Rigidbody satelliteRig = null;
public GameObject Trash;

// Start is called before the first frame update
void Start()
{
    satelliteRig = this.GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update() { }

bool AreSatObjectsDestroyed()
{
    // Satタグがついたすべてのオブジェクトを取得
    GameObject[] satObjects = GameObject.FindGameObjectsWithTag("Sat");
    // Satタグがついたオブジェクトが1つもない場合はtrueを返す
    return satObjects.Length == 1;
}

void OnCollisionEnter(Collision collision) //何らかの物体collisionという物体とCollisionイベントが発生したときに呼ばれる
{
    // 衝突相手が"Planet"か"bullet"タグを持つオブジェクトであるかをチェック
    if (collision.gameObject.CompareTag("Planet") | collision.gameObject.CompareTag("Bullet"))
    {
        if (AreSatObjectsDestroyed())
        {
            Debug.Log("All Sat objects are destroyed!");
            GameManager gameManager = new GameManager();
            gameManager.GameClear();
        }
        // 衝突したので、GameManagerのstatusをGameOverに変更
        // GameManager gameManager = new GameManager();
        // gameManager.GameClear();
        Destroy(collision.gameObject); //あたった弾を消す

        //破片
        int randomCount = Random.Range(1, 11);
        // 指定した処理をランダムな回数繰り返す
        for (int i = 0; i < randomCount; i++)
        {
            ExecuteRandomProcess();
        }

        void ExecuteRandomProcess()
        {
  
            // 実行したい処理をここに記述
            Debug.Log("Executing process...");
            GameObject trash = Instantiate(
                Trash,
                this.transform.position + Random.onUnitSphere*0.01f,
                Random.rotation
            );

            Gravity trashGrav = trash.GetComponent<Gravity>();
            GameObject planetObject = GameObject.Find("Planet");
            trashGrav.earth = planetObject;
            Rigidbody trashRig = trash.GetComponent<Rigidbody>();
            trashRig.velocity = satelliteRig.velocity;
            trashRig.AddForce(Random.onUnitSphere * Random.Range(0f, 1f)*10f);
            trashRig.AddTorque(Random.onUnitSphere * Random.Range(0f, 1f)*5f);
            Destroy(trash, 5);
        }

        Destroy(gameObject);

        // GameObject tama = Instantiate(Tama,
        // this.transform.position + (this.transform.rotation * Vector3.up) *0.1f,
        // this.transform.rotation * Quaternion.Euler(0f, 0f, 0f));

        // Gravity tamaGrav = tama.GetComponent<Gravity>();
        // GameObject planetObject = GameObject.Find("Planet");
        // tamaGrav.earth = planetObject;
        // Rigidbody tamaRig = tama.GetComponent<Rigidbody>();
        // tamaRig.velocity = satelliteRig.velocity;
        // tamaRig.AddForce(transform.forward * 2);
        // Destroy(tama, 2);
    }
} }

```
この場合、敵キャラにはすべてSatというタグが付けられており、敵キャラが倒されるたびに、残っている敵キャラの数を数え、それが0ならgameManager.GameClear();を呼んでいる。