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

     

    【ハルシオンブログ】Unityのコルーチンで値を返す方法。いくつか方法あるぽいけど、その一つを紹介。 

    こんにちは。坂内っす。

    本日のお題は「コルーチンで結果を返したい」について。

    コルーチンってIEnumratorが戻り値だから、何も返せないっすよね。

    そんな時、以下のようにやると値を返せます。



    こんな感じの画面。
    ボタンを押すと、2秒後にテキストに「10」という文字を出す。

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class Script_20190225 : MonoBehaviour
    {
    [SerializeField]
    private Text txtView;

    void Start()
    {
    txtView.text = "";
    }

    public void OnClickButton() {
    StartCoroutine(Coroutine());
    }

    private IEnumerator Coroutine() {
    IEnumerator corutine = CoroutineCount();
    yield return StartCoroutine(corutine);
    txtView.text = "「" + (int)corutine.Current + "」";
    }

    private IEnumerator CoroutineCount() {
    int retNum = 10;
    yield return new WaitForSeconds(2f);
    yield return retNum;
    }
    }


    ボタンを押した2秒後に以下の画面になります。


    実際に10という数値を持っているのが「CoroutineCount」のメソッド内。
    CoroutineメソッドでCoroutineCountから10を返してもらうのに、coroutine.Currentを使ってます。

    OnClickButtonの中から
            IEnumerator corutine = CoroutineCount();
    StartCoroutine(corutine);
    txtView.text = "「" + (int)corutine.Current + "」";


    これをやろうとすると、StartCoroutineで2秒待たないため、coroutine.Currentが取れなくてエラーになります。
    yield return StartCoroutineでちゃんと待たないといけないため、コルーチンの中でやるのがええかと思います。

    では、実際に以下のコードの場合は何が返ってくるのか。

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class Script_20190225 : MonoBehaviour
    {
    [SerializeField]
    private Text txtView;

    void Start()
    {
    txtView.text = "";
    }

    public void OnClickButton() {
    IEnumerator corutine = CoroutineCountSec();
    StartCoroutine(corutine);
    txtView.text = corutine.Current.ToString();
    }

    private IEnumerator CoroutineCountSec() {
    yield return new WaitForSeconds(2f);
    }
    }


    ボタンを押した瞬間にテキストに出力。



    UnityEngine.WaitforSecondsが返ってきました。

    coroutine.Currentは「yield return で戻ってきてる何か」を持ってる感じなんですね。

    って感じで、返そうと思えばコルーチン内のモノはなんでも返せそうですね!
    今後使っていきます!


    ということで、今日はここまで!あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

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