MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens2でホロモンアプリを作る その37(UniRxを使って1つの関数でモーションを組み合わせた時系列の処理を記述する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
f:id:bluebirdofoz:20210503224757j:plain

今回はUniRxを使って1つの関数でモーションを組み合わせた時系列の処理を記述するメモです。

1つの関数でモーションを組み合わせた時系列の処理を記述する

今回はじゃんけんのアクションの初めに、プレイヤーの方向を向く処理を追加します。
ホロモンがこちらを向く処理は既に実装済みなので、これを活用します。
bluebirdofoz.hatenablog.com

このためには本処理が完了した後に、じゃんけんのモーションを開始する必要があります。
今回は UniRx を使って時系列の処理を1つの関数に以下のように記述してみました。

        /// <summary>
        /// 継続実行用トリガー
        /// </summary>
        IDisposable p_ContinueActionTrigger;

        /// <summary>
        /// ターゲットの方を向くアクションの要求(1モーション例)
        /// </summary>
        public void ActTurnLookPlayer(GameObject a_TargetObject, HoloMonActionOption a_ActionOption)
        {
            // プレイヤーの方向を向くモーション
            HoloMonModeStatusSingleton.Instance.ChangeModeTargetTurn(a_TargetObject.transform);

            // トリガーを設定済みの場合は一旦破棄する
            p_ContinueActionTrigger?.Dispose();

            // 完了判定のトリガーを登録する
            p_ContinueActionTrigger = HoloMonModeStatusSingleton.Instance
                .IObservableHoloMonModeEveryValueChanged
                .ObserveOnMainThread()
                .Subscribe(holoMonMode => {
                    // モード変更を検知すればアクションは終了
                    CheckHoloMonMode(holoMonMode);
                })
                .AddTo(this);
        }

        /// <summary>
        /// じゃんけんで遊ぶアクションの要求(2モーション例)
        /// </summary>
        public void ActPlayJanken(GameObject a_TargetObject, HoloMonActionOption a_ActionOption)
        {
            // プレイヤーの方向を向く
            HoloMonModeStatusSingleton.Instance.ChangeModeTargetTurn(a_TargetObject.transform);


            // トリガーを設定済みの場合は一旦破棄する
            p_ContinueActionTrigger?.Dispose();

            // スタンバイになったタイミングで次のイベントを発生させる
            p_ContinueActionTrigger = HoloMonModeStatusSingleton.Instance.IObservableHoloMonModeEveryValueChanged
                .First(mode => mode == HoloMonMode.Standby)
                .ObserveOnMainThread()
                .Subscribe(mode => {
                    // じゃんけんモードに切り替える
                    HoloMonModeStatusSingleton.Instance.ChangeModeRockPaperScissors();

                    // トリガーを設定済みの場合は一旦破棄する
                    p_ContinueActionTrigger?.Dispose();

                    // 完了判定のトリガーを登録する
                    p_ContinueActionTrigger = HoloMonModeStatusSingleton.Instance
                        .IObservableHoloMonModeEveryValueChanged
                        .ObserveOnMainThread()
                        .Subscribe(holoMonMode => {
                            // モード変更を検知すればアクションは終了
                            CheckHoloMonMode(holoMonMode);
                        })
                        .AddTo(this);
                })
                .AddTo(this);
        }

f:id:bluebirdofoz:20210503224821j:plain

UniRx を利用して、任意のタイミングで次のアクションを実行させるトリガーを入れ子に記述しています。
これにより、1つの関数で次のアクションが起こる条件と順序を全て記載しておくことができ、処理の流れがわかりやすくなります。
また、別のアクションが割込みで呼ばれた場合はトリガーが破棄されます。

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20210503224856j:plain

「ジャンケン」と言うとホロモンが最初にこちらを向くモーションを行い、それが完了してからジャンケンを行うようになりました。
f:id:bluebirdofoz:20210503224916j:plain