Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ コルーチンの活用例 コルーチンの途中停止

以前から作っているパチンコアプリについては、なかなか各部の制御で手こずっており、進捗がすこぶる悪い

 

理由は、パチンコアプリならではの図柄の制御やアタッカーといわれる大当りした時に

開放する扉やらの制御がかなり面倒

シーケンス制御的な要素が多く、動作のバリエーションや調整も必要になるので、最終的にはデータの調整のみで、ゲーム仕様の調整をしたいし・・・

 

てなかんじで、一つ何とか乗り越えた部分の大当りした時のアタッカーの扉の制御において、やや複雑なコルーチンの制御にて解決させたので、書き残しておくことにする

 

実際の動作サンプル

 右下の赤いシャッターが開閉する動作を見てほしい

f:id:Harukichi:20210923181339g:plain

 

〇シャッターの動作シーケンス

①開放前に一定時間待つ

②時間が来たら一定時間開放

➂②の開放時間中に玉が10個入ったら、開放時間が残っていても閉じる

➃次の開放までの待ち時間

 

〇具体的な実装方法

IEnumerator CountDownRoutine;

    IEnumerator DoOnOffSequence(OnOffData[] onOffDatas)
    {
  //セットするデータの構造は、開放前時間、開放時間、次の開放までの時間

  //となっていて、このセットが配列になっている 

        for (int i = 0; i < onOffDatas.Length; i++ ) {

            //開放前時間 一定時間待つ
            yield return new WaitForSeconds(onOffDatas[i].preopen);

 

   //シャッター開放 専用の別のコルーチンを呼び出す

            CountDownRoutine= TimerCountDown(onOffDatas[i].open);

   //下記のようにすると上記の処理の終了を待ってくれる

            yield return StartCoroutine(CountDownRoutine); 

 

   //開放時間が過ぎるか途中で終了となったら閉じる

            Close();
            yield return new WaitForSeconds(onOffDatas[i].close);

        }


    }

 

//シャッター開放中の別のコルーチン

    IEnumerator TimerCountDown(float duration)
    {
  //実行時間のセット
        CountDownTimer = duration;

  //ループ開始
        while (true) {

   //時間を減算
            CountDownTimer -= 0.1f;

   //一定時間待つ

            yield return new WaitForSecondsRealtime(0.1f);

   //タイマーが0になったら終了

            if (CountDownTimer <= 0f)
            {
                yield break;

            }

        }

   }

 

//玉が一定数入ったことにより開放を途中終了する場合の処理

//別のスクリプトから呼び出される

    public void ActionStop()
    {

  //カウントダウン用のタイマーを0にして、コルーチンを外部から終了させる
        CountDownTimer = 0f;

    }

 

〇考察

 一見コルーチンの中で時間をカウントダウンするというのはナンセンスな気もするし、ならコルーチンを使わずに実装もできそうな気もする

 最初の目論見としては、一定数玉が入ったらStopCorutioneにて止めて、そのあとから制御が再び始まってくれればよいと考えていたが、そうはいかず元のコルーチンも中途半端なところで止まってしまったため、致し方なく上記のような方法を採用した

 

 他のサイトでもいろいろ探したが、結果上記と同じような感じだった

 

今回は以上