MRが楽しい

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

HoloLens2でホロモンアプリを作る その107(ホロモンのクライアントモードの実装)

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

ホロモンのクライアントモードの実装

シェアリング時の動作用にホロモンのクライアントモードを実装しました。
ホスト側で空間認識との判定等も管理するため、クライアント側ではアタリ判定を含むすべてのコントロールを無効化します。

行動ロジックに以下のような None ロジックを新たに追加し、アプリがクライアント接続で起動した場合は本ロジックを有効化するようにしました。
・HoloMonModeLogicNone.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Cysharp.Threading.Tasks;
using UniRx;

using HoloMonApp.Content.Character.Interrupt;

namespace HoloMonApp.Content.Character.Behave.ModeLogic.None
{
    public class HoloMonModeLogicNone : MonoBehaviour, HoloMonActionModeLogicIF
    {
        /// <summary>
        /// モードロジック共通参照
        /// </summary>
        private ModeLogicReference p_ModeLogicReference;

        /// <summary>
        /// モードロジック共通情報
        /// </summary>
        [SerializeField, Tooltip("モードロジック共通情報")]
        private HoloMonModeLogicCommon p_ModeLogicCommon = new HoloMonModeLogicCommon();

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="reference"></param>
        public void AwakeInit(HoloMonBehaveReference reference)
        {
            p_ModeLogicReference = new ModeLogicReference(reference);
        }

        /// <summary>
        /// 現在の実行待機中フラグ
        /// </summary>
        /// <returns></returns>
        public bool CurrentRunAwaitFlg()
        {
            return p_ModeLogicCommon.RunAwaitFlg;
        }

        /// <summary>
        /// ホロモンアクションモード種別
        /// </summary>
        /// <returns></returns>
        public HoloMonActionMode GetHoloMonActionMode()
        {
            return HoloMonActionMode.None;
        }

        /// <summary>
        /// モード実行(async/await制御)
        /// </summary>
        public async UniTask<ModeLogicResult> RunModeAsync(ModeLogicSetting a_ModeLogicSetting)
        {
            // 設定アクションデータを保持する
            p_ModeLogicCommon.SaveCommonSetting(a_ModeLogicSetting);

            // 開始処理を行う
            EnableSetting();

            // モードを開始して完了を待機する
            ModeLogicResult result = await p_ModeLogicCommon.RunModeAsync();

            // 終了状態を返却する
            return result;
        }

        /// <summary>
        /// モードキャンセル
        /// </summary>
        public void CancelMode()
        {
            // 停止処理を行う
            DisableSetting();

            // キャンセル処理を行う
            p_ModeLogicCommon.CancelMode();
        }

        /// <summary>
        /// モード内部停止
        /// </summary>
        private void StopMode(ModeLogicResult a_StopModeLogicResult)
        {
            // 停止処理を行う
            DisableSetting();

            // 停止状態を設定する
            p_ModeLogicCommon.StopMode(a_StopModeLogicResult);
        }

        /// <summary>
        /// 割込み通知
        /// </summary>
        public bool TransmissionInterrupt(InterruptInformation a_InterruptInfo)
        {
            bool isProcessed = false;

            // 処理なし

            return isProcessed;
        }


        /// <summary>
        /// 固有アクションデータの参照
        /// </summary>
        private ModeLogicNoneData p_Data =>
            (ModeLogicNoneData)p_ModeLogicCommon.ModeLogicSetting.ModeLogicData;


        void Update()
        {
            // 処理なし
        }

        /// <summary>
        /// モードの設定を有効化する
        /// </summary>
        private bool EnableSetting()
        {
            // アニメーションを待機モードにする
            p_ModeLogicReference.Control.AnimationsBodyAPI.ReturnStandbyMode();

            // 無行動中はアタリ判定を切る
            p_ModeLogicReference.Control.BodyComponentsToColliderAPI.SetEnabled(false);

            // 無行動中は重力を切る
            p_ModeLogicReference.Control.BodyComponentsToRigidbodyAPI.SetUseGravity(false);

            return true;
        }

        /// <summary>
        /// モードの設定を無効化する
        /// </summary>
        private bool DisableSetting()
        {
            // アニメーションを待機モードにする
            p_ModeLogicReference.Control.AnimationsBodyAPI.ReturnStandbyMode();

            // 無行動終了時はアタリ判定を戻す
            p_ModeLogicReference.Control.BodyComponentsToColliderAPI.SetEnabled(true);

            // 無行動終了時は重力を元に戻す
            p_ModeLogicReference.Control.BodyComponentsToRigidbodyAPI.SetUseGravity(true);

            return true;
        }
    }
}

次はクライアント時にホスト側のステータス変化を反映するネットワークモジュールを作成中です。