- UniRxを使ってbool値の変更待ちを実現します
- async await を使って時間差を表現しています(使わなくても実装できます)
この記事では UniRx の基本的な使い方の説明はしません。
この記事では async await の基本的な使い方の説明はしません。
async await は時間差を表現するために使用していますので、bool値の変更待ちには関係ありません。async await を使用しなくても変更待ちは実装できます。
Bool値が変更されたタイミングで処理を行う仕組み
UniRxというアセットを使用すると処理待ちを実現できます。
今回使用するのはUniRxの「ObserveEveryValueChanged」という機能です。
ObserveEveryValueChanged は変数を毎フレーム監視し、前のフレームと差分が発生したタイミングで発火します。
処理の流れ
- bool値が変更されたら発火する処理をセット
- ステージ画像を表示する処理(1秒かかる)
- 敵画像を表示する処理(3秒かかる + 処理後にbool値を変更)
- 発火。「コンプリート!」と表示
全体のイメージ
実際のコード
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;
}
}
コンソールがこちら。
うまくできました!
今回はただのメッセージ表示でしたが、これを応用するとあらゆる処理待ちを実装できると思います。
ではまた!
コメント