【Unity】Bool値が変更されたタイミングで処理を実行する【C#】

この記事は約3分で読めます。
  1. UniRxを使ってbool値の変更待ちを実現します
  2. async await を使って時間差を表現しています(使わなくても実装できます)

この記事では UniRx の基本的な使い方の説明はしません。

この記事では async await の基本的な使い方の説明はしません。

async await は時間差を表現するために使用していますので、bool値の変更待ちには関係ありません。async await を使用しなくても変更待ちは実装できます。

Bool値が変更されたタイミングで処理を行う仕組み

UniRxというアセットを使用すると処理待ちを実現できます。

今回使用するのはUniRxの「ObserveEveryValueChanged」という機能です。

ObserveEveryValueChanged は変数を毎フレーム監視し、前のフレームと差分が発生したタイミングで発火します。

処理の流れ

  1. bool値が変更されたら発火する処理をセット
  2. ステージ画像を表示する処理(1秒かかる)
  3. 敵画像を表示する処理(3秒かかる + 処理後にbool値を変更)
  4. 発火。「コンプリート!」と表示

全体のイメージ

実際のコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;           <-- async await用
using System.Threading.Tasks;  <-- async await用
using UniRx;               <-- UniRx用
using UniRx.Triggers;  <-- UniRx用

public class TestApp : MonoBehaviour
{
    
    bool _IsEnemyImageShow = false;


    private void Start()
    {
        // UniRxを使って bool値 の変化を監視する
        // bool が true になったらメッセージを表示
        this.ObserveEveryValueChanged(x => x._IsEnemyImageShow)
        .Where(x => x)
        .Subscribe(_ => Debug.Log("Completed"));
     

        StageImageShow();
        EnemyImageShow();

    }


    // ステージ画像を表示するメソッド
    async void StageImageShow()
    {
        Debug.Log("ステージ画像表示");
        await Task.Delay(1000);
        Debug.Log("敵の情報取得ができた");
    }


    // 敵画像を表示するメソッド
    async void EnemyImageShow()
    {
        Debug.Log("敵を表示準備");
        await Task.Delay(3000);
        Debug.Log("敵の表示ができた");

        _IsEnemyImageShow = true;
    }

}

コンソールがこちら。

うまくできました!

今回はただのメッセージ表示でしたが、これを応用するとあらゆる処理待ちを実装できると思います。

ではまた!

コメント

タイトルとURLをコピーしました