実装の答え合わせがしたい

要約

  • DDDで実装してみたけど、あってる?

  • MonoBehaviourをどう捉えるか。それが問題だ。

構造の理解

コントローラ層

早い話がMonoBehaviourそのもの。UnityMessage(StartとかUpdateとか)が発火したらユースケースのメソッドを走らせる。結果が返ってきたらtransformを更新するだけ。

ロジック層

ユースケース層ともいう。Interfaceで実装を強制していて、RunとかExecuteとか、そんな感じの名前のメソッドが1つあるだけのクラスがいっぱいある。

データ層

ありとあらゆるデータとやり取りする。ここの中のオブジェクトに「この音を鳴らして」ってやれば音がなるし「セーブしたい」ってやればプレイデータが保存される。

ちいさい丸

ロジック層から出てる矢印が指している丸。これはコントローラやデータとやり取りするためのオブジェクト。各層とのやり取りはすべてこのオブジェクトでデータを受け渡す必要がある。

具体的な実装

コピっても動かないと思うので、コピペしないように。

コントローラ

    public class WraithController : MonoBehaviour, IController
    {
        [Range(0,10)]
        public float MoveSpeed;

        private Move moveUseCase;

        protected void Awake()
        {
            this.moveUseCase = new Move();
        }

        protected override void Update()
        {
            var input = new WraithInput()
            {
                Animator = this.animator,
                Transform = this.transform,
                MoveSpeed = this.MoveSpeed,
                Collision = this.collider2D,
                ColliderTargets = this.ColliderTargets,
                Renderer = this.renderer,
            };
            var output = this.moveUseCase.Execute(input);

            // outputをなにかに反映
        }
    }

これは敵キャラの「おばけ」の実装の抜粋。Awakeでユースケース(おばけができることを実装したクラス)を初期化する。UpdateではそのユースケースのExecuteを呼ぶだけ。やり取りはInputPackというクラスで行う。

ロジック層

まずユースケースはこういうインターフェースを持つ。

    public interface IUseCase<T1, T2> where T1 : IInput where T2 : IOutput
    {
        public T2 Execute(T1 input);
    }

これを使って……

    public class Move : IUseCase<WraithInput, WraithOutput>
    {
        public WraithOutput Execute(WraithInput input)
        {
            // なんらかの動く処理

            var output = new WraithOutput();
            output.hogehoge = vector2のなんか移動に関する値

            return output;
        }
    }

こうじゃ!
で、こんなんを「ダメージを受けたときの処理」とか「ジャンプした」とかそういうヤツの分用意する。

データ層

めんどくさくなってきたので割愛。考え方はこれまでの実装とほぼ同じ。

MonoBehaviourって何なんだろう

MonoBehaviourをコントローラだって思えばロジック層から返ってきた値を反映させればいいよね、って感じなんだけどPrefabとして管理されているデータのEntityなんだよって思えばデータ層から更新してやればいいよね、って感じだし。MonoBehaviourってわりとできることが多くて掴みどころがないなーって改めて思いましたとさ。

この記事が気に入ったらサポートをしてみませんか?