読者です 読者をやめる 読者になる 読者になる

MRが楽しい

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

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

本日は追いかけっこアプリの修正枠です。
設計を以前検討したものから適宜修正中です。修正内容は前回の記事に適宜反映していきます。
bluebirdofoz.hatenablog.com

本日はModel部分の実装です。
f:id:bluebirdofoz:20170512011032j:plain

以前紹介した記事に従い、Modelの通知の仕組みにUniRxを用いてみることにしました。
developers.cyberagent.co.jp

UniRxはAssetStoreから入手可能です。
qiita.com

データベースを以下のように実装できました。Model側はPresenterの存在を知らずに済むことが分かります。
・GameInformation.cs

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

using UniRx;

namespace CatchAndRun.GameInformation
{
    public class GameInformation : MonoBehaviour
    {
        // 利用データベース
        public GameObject targetDatabase;
        private Database p_Database;

        // Use this for initialization
        void Start()
        {
            p_Database = targetDatabase.GetComponent<Database>();
            p_Database.init();
        }

        // ゲームモードの取得
        public IReadOnlyReactiveProperty<GameMode> GameMode
        {
            get { return p_Database.getGameMode(); }
        }

        // ゲームモードの設定
        public void setGameMode(GameMode gameMode)
        {
            p_Database.setGameMode(gameMode);
        }
    }
}

現在の悩みどころは追いかけっこロジックを何処に持つかということです。
メインカメラの位置を追跡したり、障害物をジャンプしたり。
最初はゲームロジックであると考えていましたが、キャラクターが持つ思考ロジックとして閉じた方が良いと思い直しました。
これならばModelにはキャラクターの位置などの冗長な通知が必要な情報は保持しないで済みます。

ただ気を付けないと、キャラクターが様々な役割を持ってしまい、再び煩雑なコードになることに繋がります。
こちらも以前紹介した記事で書かれていた「ゲームはViewの役割がブレやすい」の問題ですね。
yutakaseda3216.hatenablog.com