FC2ブログ
    07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】コルーチンのお話。Aコルーチン中にAコルーチンを止めてBコルーチンを動かす方法。 

    おはようございます。坂内です。

    さっそくUnityのお話。

    コルーチン使ってますか?

    Cor1が終わってからCor2を動かしたいとき。


    using System.Collections;
    using UnityEngine;

    public class Test20191028 : MonoBehaviour
    {
    IEnumerator Start()
    {
    StartCoroutine(Cor1());
    yield return new WaitForSeconds(2f);
    StartCoroutine(Cor2());
    }

    private IEnumerator Cor1() {
    yield return new WaitForSeconds(2f);
    Debug.Log("1");
    yield return new WaitForSeconds(2f);
    }

    private IEnumerator Cor2() {
    yield return new WaitForSeconds(2f);
    Debug.Log("2");
    yield return new WaitForSeconds(2f);
    }

    }



    もちろんこんな結果




    こういう書き方しちゃってます?

    ちゃんとCor1が終わってからCor2を動かすなら、こう書くのがいいのかな?


    using System.Collections;
    using UnityEngine;

    public class Test20191028 : MonoBehaviour
    {
    IEnumerator Start()
    {
    yield return StartCoroutine(Cor1());
    yield return StartCoroutine(Cor2());
    }

    private IEnumerator Cor1() {
    yield return new WaitForSeconds(2f);
    Debug.Log("1");
    yield return new WaitForSeconds(2f);
    }

    private IEnumerator Cor2() {
    yield return new WaitForSeconds(2f);
    Debug.Log("2");
    yield return new WaitForSeconds(2f);
    }

    }



    もちろん結果は同じですけどね。



    さて、それではCor1をやっている途中(Cor1が開始されてから1秒後)で処理をCor2に移したい場合はどうでしょうか。


    using System.Collections;
    using UnityEngine;

    public class Test20191028 : MonoBehaviour
    {
    private IEnumerator coroutine;
    IEnumerator Start()
    {
    coroutine = Cor1();
    StartCoroutine(coroutine);
    yield return new WaitForSeconds(1f);
    StopCoroutine(coroutine);
    coroutine = Cor2();
    StartCoroutine(coroutine);
    }

    private IEnumerator Cor1() {
    yield return new WaitForSeconds(2f);
    Debug.Log("1");
    yield return new WaitForSeconds(2f);
    }

    private IEnumerator Cor2() {
    yield return new WaitForSeconds(2f);
    Debug.Log("2");
    yield return new WaitForSeconds(2f);
    }
    }



    IEnumeratorの変数を作って、そいつでCor1を動かします。
    Cor2に移るタイミングでStopCoroutineでCor1を止めてからCor2を行います。

    結果は




    Cor1のはじめの待ち時間2秒のうち、1秒経ったところで、Cor2が開始され、ログとしては2のみが出力されました。

    こんな感じでIEnumratorにコルーチンを突っ込んで実行してあげることで、Aコルーチン処理中にBコルーチン処理を強制的に実行することができます。

    ということで、本日は簡単なコルーチンのお話でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/646-b4b76bd5
    この記事にトラックバックする(FC2ブログユーザー)