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やらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】コルーチン使っててちょっと嵌ったのでメモ 

    こんにちは。
    大坂です。

    急に寒くなってきましたね。
    知り合いでも風邪をひいてる人がちらほら…。
    僕も鼻水と咳が止まりませんが…まぁ気にしないでおきます。
    皆様体調にはお気を付けを。

    さて、コルーチンを呼び出しまくってて動かないなーってなってちょっと嵌ったのでメモ的なヤツ。
    結論から言うと呼び出し元のオブジェクト消したら処理が途中で止まったってだけですが…

    こんな感じで書いたらダメだったよってやつ。
    public class BlogTestPopup : MonoBehaviour {

    public void CallBlogTestCorutine() {
    StartCoroutine(GameObject.Find("BlogTest").GetComponent().BlogTestCoroutine());
    Destroy(gameObject);
    }
    }

    ポップアップで他のオブジェクトのコルーチンを呼び出してそのままポップアップオブジェクトを削除した。

    呼び出された方。
    public class BlogTest : MonoBehaviour {
    public IEnumerator BlogTestCoroutine() {
    Debug.Log("BlogTestCoroutine開始");
    yield return StartCoroutine(BlogTestCoroutine_2());
    Debug.Log("BlogTestCoroutine終了");
    }

    public IEnumerator BlogTestCoroutine_2() {
    Debug.Log("BlogTestCoroutine_2開始");
    yield return null;
    Debug.Log("BlogTestCoroutine_2終了");
    }

    コルーチンからさらにコールチンを呼び出して2個目のコルーチンが終わってさらに処理をしたい。

    実行ログ


    最初に呼ばれたコルーチンの終了が出てませんね。
    対策は一応こんな感じ。
    ポップアップからは呼び出す先のコルーチンを実行するメソッドを呼ぶようにして、メソッドからコルーチンを呼ぶように変更。
    動いたのでまぁこれでいいんでしょうかね…。

    たいして変わりませんが、ポップアップのコード
    public class BlogTestPopup : MonoBehaviour {
    public void CallBlogTestMethod() {
    GameObject.Find("BlogTest").GetComponent().BlogTestMethod();
    Destroy(gameObject);
    }
    }


    呼び出された方
    public class BlogTest : MonoBehaviour {
    public void BlogTestMethod() {
    StartCoroutine(BlogTestCoroutine());
    }

    public IEnumerator BlogTestCoroutine() {
    Debug.Log("BlogTestCoroutine開始");
    yield return StartCoroutine(BlogTestCoroutine_2());
    Debug.Log("BlogTestCoroutine終了");
    }

    public IEnumerator BlogTestCoroutine_2() {
    Debug.Log("BlogTestCoroutine_2開始");
    yield return null;
    Debug.Log("BlogTestCoroutine_2終了");
    }


    こちらも実行ログ


    これで1個目のコルーチンの終了までログがちゃんと出てますね。
    ということで、こんなことをする人がいるのかはよくわかりませんが、想定通り動くようになったのでメモです。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 2   

    コメント

    そういう時は、適当なマネージャークラス(Singletonとかで)からコルーチン呼ぶようにしとくと楽です。
    よくミスるのが、StartCoroutineをしたけど、そのObjectがActiveになっていないのでエラー出るやつ。

    しろくろ #- | URL | 2017/10/05 16:53 [edit]

    Re: タイトルなし

    しろくろさん

    コメントありがとうございます!
    確かにそういった工夫をすると楽そうですね!
    Objectが非アクティブ状態で呼び出すのは僕もよくやります…orz

    株式会社ハルシオンシステム #- | URL | 2017/10/06 10:35 [edit]

    コメントの投稿

    Secret

    トラックバック

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