🕌

Unityで結果終わり待ち状態を実装する

2022/12/21に公開

結果を待ってから、次のスクリプトを実行

したい時って結構あります。

関数の結果を待ってからとか、変数の状態を監視しながらとか

監視の方が意味合い強いのかもしれません。

ネットから拾ってきた情報のコピペみたいなものですが残しておきます。

UniRxを使う

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;

public class Test : MonoBehaviour
{

    int _cnt = 0;

    private void Start()
    {
      // _cnt が3を越えたらDebugを実行する
        this.ObserveEveryValueChanged(x => x._cnt)
        .Where(x => _cnt > 3)
        .Subscribe(_ => Debug.Log("Completed"));
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            _cnt++;
        }
    }

}

上の例は、_cnt を監視対象として

クリックする毎に、_cntを増やして3を越えたら、Debugメッセージを出すものです。

コルーチンを使う

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

public class TestCoroutine : MonoBehaviour
{
    IEnumerator Start()
    {
        IEnumerator enumerator = TestCor();
        // TestCorが終わるまで待つ
        yield return enumerator;

        Debug.Log("Main END");

    }

    // 2f待つ
    IEnumerator TestCor()
    {
        Debug.Log("TestCor START");
        yield return new WaitForSeconds(2f);
        Debug.Log("TestCor END");
    }

実行結果は、このようになります。

TestCorのメッセージが全て出力されてから、Startの最終メッセージが表示されていて

関数の終了を待っていることがわかります。

UniTaskを使う

    async void Start()
    {
        // シーン開始時の演出(以降の処理はこれが終わるまで動かない)
        await sceneController.StartScene();

        Debug.Log("Start");
    }
    
    public async UniTask StartScene()
    {
        // シーン演出オブジェクト
        sceneSgtaging.SetActive(true);

        // フェードアウトする
        image.DOFade(0f, 1f);

        await UniTask.Delay(TimeSpan.FromSeconds(1f));

        Debug.Log("StartScene End");

    }

以上のように、Start()の中で呼んだ、StartScene()が終わるのを待つ事ができます。

Discussion