Unityで実装された30秒監視コルーチンのコード解説とリファクタリング資料

この資料では、Unityで作成されたオブジェクトの生存時間を監視するコルーチンのコードを例に、元の実装とリファクタリング後の実装を紹介し、その各部分の詳細な解説を行います。


1. はじめに

  • 目的:
    ゲームオブジェクトの生存時間を毎秒ログ出力し、30秒を超えた時点で処理を停止する仕組みを実装する。
  • ポイント:
    • コルーチンを利用したタイマー機能の実装方法
    • 可読性と保守性を高めるためのリファクタリング手法

前提知識


2. 元のコード

以下は、最初の実装例です。

using System.Collections;
using UnityEngine;

public class Check30Sec : MonoBehaviour
{
    float startAt;
    IEnumerator testLoop;

    void Start()
    {
        startAt = Time.realtimeSinceStartup;
        testLoop = TestLoop();
        StartCoroutine(testLoop);
    }

    private IEnumerator TestLoop()
    {
        while (true)
        {
            var lifeTime = Time.realtimeSinceStartup - startAt;
            Debug.Log("オブジェクトの生存時間(秒) " + lifeTime);

            if (lifeTime > 30)
            {
                Debug.Log("テストループを停止します" + lifeTime);
                yield break;
            }
            yield return new WaitForSeconds(1f);
        }
    }
}

3. リファクタリング後のコード

次に、可読性と保守性を向上させたリファクタリング例を示します。

using System.Collections;
using UnityEngine;

public class Check30Sec : MonoBehaviour
{
    private float startTime;
    private const float MaxLifetime = 30f;

    private void Start()
    {
        startTime = Time.realtimeSinceStartup;
        StartCoroutine(TrackLifetime());
    }

    private IEnumerator TrackLifetime()
    {
        while (true)
        {
            float lifetime = Time.realtimeSinceStartup - startTime;
            Debug.Log($"オブジェクトの生存時間(秒): {lifetime:F2}");

            if (lifetime > MaxLifetime)
            {
                Debug.Log($"テストループを停止します。生存時間: {lifetime:F2}");
                yield break;
            }

            yield return new WaitForSeconds(1f);
        }
    }
}

4. 詳細な解説

4.1 変数名の明確化

  • startTime
    • もともとの startAt から変更し、処理開始時刻を直感的に示す名前になっています。
  • lifetime
    • オブジェクトの生存時間を表す変数名。何を表しているかが明確です。

4.2 定数の導入

  • MaxLifetime
    • 30秒という閾値を定数化。これにより、今後閾値を変更する際の影響範囲が明確になり、保守性が向上します。

4.3 コルーチンの呼び出し方法

  • 直接のコルーチン起動:
    • フィールド変数としてコルーチンを保持せず、StartCoroutine(TrackLifetime()) を直接呼び出すことで、コードがシンプルになっています。

4.4 ログ出力の改善

  • 文字列補間とフォーマット:
    • Debug.Log に文字列補間($"...")を利用し、ログ出力を簡潔かつ読みやすくしています。
    • {lifetime:F2} を使い、小数点以下2桁まで表示することで、ログの精度が向上しています。

4.5 ループ処理と終了条件

  • 無限ループ (while (true))
    • 毎秒、現在の生存時間を計算してログ出力するためのループ処理です。
  • 終了条件と yield break:
    • 生存時間が MaxLifetime(30秒)を超えると、ログ出力後に yield break を呼び出してループを終了します。
  • 待機処理 (yield return new WaitForSeconds(1f)):
    • 1秒ごとにループを一時停止させ、毎秒の更新を実現しています。これにより、処理負荷を低減しています。

5. まとめ

この資料では、Unityにおけるコルーチンを利用したタイマー機能の実装例を紹介しました。

  • 元の実装 では、基本的なタイマー機能と生存時間のログ出力が行われていました。
  • リファクタリング後 のコードでは、変数名の明確化、定数の導入、直接的なコルーチン呼び出し、そしてログ出力のフォーマット改善により、可読性と保守性が大幅に向上しています。

このような改善は、今後の機能追加やデバッグ作業において非常に有用です。開発現場でコードの品質を保つためにも、リファクタリングの手法を積極的に取り入れていくことが推奨されます。

C#,Unity

Posted by hidepon