本日も追いかけっこアプリの修正枠です。今回はアプリのリファクタリングを行います。
修正を誤らないよう現状、自身で追加したコンポーネントを洗いなおしてみました。
・MainCamera
- メインカメラオブジェクト
自作の追加コンポーネントはなし
・OrigamiCollection
- 折り紙オブジェクト
チュートリアル実施時の残り物、無効化しているため利用中のコンポーネントはなし
・Lights
- ライトオブジェクト
自作の追加コンポーネントはなし
・Cursor
- リング(視点位置表示)オブジェクト
チュートリアル実施時の残り物、無効化しているため利用中のコンポーネントはなし
・SpatialMapping
- 空間マッピングオブジェクト
自作の追加コンポーネントはなし
・unitychan_dynamic
- ユニティちゃんオブジェクト
自作の追加コンポーネントは以下の通り
1.XboxOneController
- 操作コンポーネント
キーボード操作の検出からモーションの変更まで役割を多数持つ。
他スクリプトからの操作を受け取るためのパブリック変数も多数持つ。
2.GazeGestureMange
- 視点操作コンポーネント
視点からオブジェクトへのタップ操作を検出し対象のOnSelect関数を呼び出し
3.UnityCommands
- OnSelect関数を受け取ってゲーム開始を行うスクリプト
ゲーム開始に関するトリガーを扱っているため、キーボード操作も検出する
4.SpeechManger
- 音声認識用コンポーネント
音声認識プロセスを用いて単語ごとにXboxOneControllerへの操作を行う
5.SpeechCommands
- チュートリアル実施時の残り物
ポーズ変更を行っているが名前の割りに音声認識はしていない
6.HeadLookController
- 視線追従コンポーネント
LookHeadSphereのスクリプトから有効化されたとき、視線追従を行う
・ColliderSetting
- アタリ判定オブジェクト
以下の4つのアタリ判定が存在する
1.LookHeadSphere
- 視点移動のアタリ判定
判定にカメラが侵入した場合、HeadLookControllerを有効化する
2.MoveToCameraSphere
- 追いかけっこ完了判定
判定にカメラが侵入した場合、XboxOneControllerに停止を命令する
3.JumpCube
- 障害物アタリ判定その1
判定にカメラ以外が侵入した場合、XboxOneControllerにジャンプを命令する
4.StopCube
- 障害物アタリ判定その2
判定にカメラ以外が侵入した場合、XboxOneControllerに停止を命令する
・EggSphere
- 開始時に弾ける球体オブジェクト
自作の追加コンポーネントはなし
球体が弾けるモーションはUnityCommandsで操作される。
・TestStopCube
・TestJumpCube
・Plane
- hololensを使わないデバッグ用に追加した仮想空間の床と障害物。
ビルド時は必ず無効化している。
洗いなおして見るとよくもまぁここまでと思うほど酷い。。
まずXboxOneControllerが役割が多すぎます。操作の検出、アクション、状態の保持などユニティちゃん操作のほぼ全てをここで担っています。
GazeGestureManger,SpeechMangerもゲーム入力なのに何故、ユニティちゃんオブジェクトに追加したんだろう。
さて再設計を考えるに辺り、Unityでのゲーム設計のあるべき論を調べてみました。
MVP設計という考え方があるらしいです。今回はこの考え方を採用してみることにしました。
・Web出身のUnityエンジニアによる大規模ゲームの基盤設計
https://developers.cyberagent.co.jp/blog/archives/4262/
・昨今のUnity開発におけるMVP設計思想についてと、それの適用可否の話
http://yutakaseda3216.hatenablog.com/entry/2017/02/22/151204
・UniRxでMV(R)Pパターン をやってみた
https://www.slideshare.net/torisoup/unirxmvrp
一つのModelとPresenterの下にViewが沢山あり、キャラクターをViewとしてまとめて見る。この考え方を使います。
現状をMVP設計の考え方で捉えると、XboxOneControllerなどはMVP全ての役割を持っており、全く分担できていない状態ですね。
今度は最初にしっかり設計を行わねば。まずはゲームオブジェクトの配置について再検討です。
現状の改善だけでなく、画面UIなど更なる機能追加が行いやすい設計を考えていきたいと思います。