MRが楽しい

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

Unityに設計おけるクラス設計を考える その3(GameUI)

本日はおいかけっこアプリの修正枠です。
f:id:bluebirdofoz:20170520230002j:plain

設計について、ハンドジェスチャーと視線ジェスチャーを統合しました。
現状、そこまで細かく分ける必要はないので。
bluebirdofoz.hatenablog.com


本日は以下を参考にGameUIを担当するViewの実装を実施中です。
developers.cyberagent.co.jp

Interfaceを利用し、UI操作の判定方法やキー入力を差し替え可能にしました。
インタフェースを利用しているオブジェクトをUnityの画面操作から差し替えるだけで切り替え可能となります。
・GameUI.cs

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

namespace CatchAndRun.GameUI
{
    public class GameUI : MonoBehaviour
    {
        // 利用キーボード操作クラス
        public GameObject targetKeyboard;
        private IGameUI p_Keybord;

        // 利用音声認識操作クラス
        public GameObject targetSpeech;
        private IGameUI p_Speech;

        // 利用ジェスチャー操作クラス
        public GameObject targetGesture;
        private IGameUI p_Gesture;

        // スティック入力が行われた時のイベントリスナー
        public Action<float, float> OnStickInputClickedListener;

        // ゲーム開始操作が行われた時のイベントリスナー
        public Action OnGameStartClickedListener;

        // ゲーム終了操作が行われた時のイベントリスナー
        public Action OnGameEndClickedListener;

        // モード選択操作が行われた時のイベントリスナー
        public Action<GameMode> OnModeSelectClickedListener;

        // オブジェクト選択操作が行われた時のイベントリスナー
        public Action<GameObject> OnObjectSelectClickedListener;

        // ゲームアクション操作が行われた時のイベントリスナー
        public Action<GameAction> OnGameActionClickedListener;

        // 設定変更操作が行われた時のイベントリスナー
        public Action<SettingChange> OnSettingChangeClickedListener;
(略)

GameUIはアタッチされている全ての各種操作クラスと双方向にやりとりを行います。
・Keyboard.cs

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

namespace CatchAndRun.GameUI
{
    public class Keyboard : MonoBehaviour, IGameUI
    {
        // GameUIアクセス
        private GameUI p_GameUI;

        // Use this for initialization
        public void init(GameUI gameUi)
        {
            p_GameUI = gameUi;
        }
(略)

・Speech.cs

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

namespace CatchAndRun.GameUI
{
    public class Speech : MonoBehaviour, IGameUI
    {
        // GameUIアクセス
        private GameUI p_GameUI;

        // Use this for initialization
        public void init(GameUI gameUi)
        {
            p_GameUI = gameUi;
        }
(略)

・Gesture.cs

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

namespace CatchAndRun.GameUI
{
    public class Gesture : MonoBehaviour, IGameUI
    {
        // GameUIアクセス
        private GameUI p_GameUI;

        // Use this for initialization
        public void init(GameUI gameUi)
        {
            p_GameUI = gameUi;
        }
(略)

今回、Keyboard入力についてリファクタリングする際、一点悩んだことがありました。
入力判定でUpdate関数を利用すべきか、FixedUpdate関数を利用すべきかということです。

これまでキーボード入力を受け付けていたXboxOneController.csではFixedUpdate関数が利用されていました。
Rigidbodyを扱う場合は実行間隔が変わらないFixedUpdate関数を使えとのことです。
docs.unity3d.com
unity3d.com


しかし今回の場合、キーボード入力はその先の処理で行われることを知りません。
設計の理屈で言えばGameUI側はUpdate関数を用いて、Rigidbodyを扱う場所で何らかの考慮を行うべきでしょう。
という訳で現在はUpdate関数を用いています。
何か剛体に関する問題が発生した場合、ここを疑う必要があるため、備忘録として残しておきます。