Unity C# コルーチンを使った信号機システムの実装方法

C言語関連

Unity C#でコルーチンを使用して信号機システムを作成する方法について解説します。この記事では、青信号→黄色信号→赤信号のパターンを繰り返し、歩行者専用信号ボタンが押されたときに一時的に信号を変更する方法を紹介します。

1. 基本的な信号機システムの作成

まず、基本的な信号機の動作を作成します。以下のように、青信号→黄色信号→赤信号のサイクルを繰り返すコルーチンを作成します。

using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    private Coroutine trafficCoroutine;

    void Start()
    {
        trafficCoroutine = StartCoroutine(TrafficCycle());
    }

    IEnumerator TrafficCycle()
    {
        while(true)
        {
            // 青信号
            Debug.Log("青信号");
            yield return new WaitForSeconds(60);

            // 黄色信号
            Debug.Log("黄色信号");
            yield return new WaitForSeconds(5);

            // 赤信号
            Debug.Log("赤信号");
            yield return new WaitForSeconds(15);
        }
    }
}

このコードでは、青信号が60秒間表示され、その後5秒間黄色信号、15秒間赤信号が表示されるサイクルを繰り返します。

2. 歩行者信号の追加

次に、歩行者専用信号ボタンが押されたときに信号が変更される機能を追加します。ボタンが押されると、10秒待機してから黄色信号→赤信号のサイクルに切り替わります。その後、元の青信号→黄色信号→赤信号サイクルに戻ります。

using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    private Coroutine trafficCoroutine;
    private bool pedestrianSignalActive = false;

    void Start()
    {
        trafficCoroutine = StartCoroutine(TrafficCycle());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 歩行者専用信号ボタンが押された
            StopCoroutine(trafficCoroutine);
            StartCoroutine(PedestrianSignal());
        }
    }

    IEnumerator TrafficCycle()
    {
        while(true)
        {
            Debug.Log("青信号");
            yield return new WaitForSeconds(60);

            Debug.Log("黄色信号");
            yield return new WaitForSeconds(5);

            Debug.Log("赤信号");
            yield return new WaitForSeconds(15);
        }
    }

    IEnumerator PedestrianSignal()
    {
        // 歩行者専用信号モード
        yield return new WaitForSeconds(10); // 10秒待機

        Debug.Log("黄色信号");
        yield return new WaitForSeconds(5);

        Debug.Log("赤信号");
        yield return new WaitForSeconds(15);

        // 元の信号サイクルに戻す
        trafficCoroutine = StartCoroutine(TrafficCycle());
    }
}

このコードでは、スペースキー(歩行者信号ボタン)を押すことで、黄色→赤信号のサイクルが実行された後、元の信号サイクルに戻るようになります。

3. コルーチンの制御と動作確認

コルーチンは、信号サイクルを管理するために非常に便利ですが、複数のコルーチンが同時に実行されることを避けるために、既存のコルーチンを停止させて新しいコルーチンを開始することが重要です。このコードでは、ボタンが押されるたびに`StopCoroutine`を使用して現在のコルーチンを停止し、次のサイクルを開始しています。

4. まとめ

この記事では、UnityのC#を使って、青信号→黄色信号→赤信号を繰り返す基本的な信号機システムを作成し、歩行者専用信号ボタンが押されたときに信号を変更する方法を紹介しました。コルーチンを使ってシステムを管理し、ボタン入力を検出して信号サイクルを制御する方法が理解できたかと思います。

コメント

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