imog

主にUnityとかの事を書いています

出稼ぎダンジョン進捗報告 2

割と時間開けてしまった。

今回は見た目の変更はほぼなし。その代わり、急ピッチで作った部分を色々とリファクタリングなどしていた。

Zenjectの導入

戦闘システム周りなど、敵と味方が相互に依存しあったりして割とつらいコードになっていた。そのあたりのリソースの参照を一か所に集中させるためにシーンごとにDataStore的なクラスを用意してそこから参照するようにしていたが、毎度用意するのがやや面倒だった。

また、Storeがシングルトンという役割を持つので、シングルトンにしたいPureClassなどもここに追いやられていた。

namespace Game.Store
{
    /// <summary>
    /// Battleシーンのデータを全て保持しているやつ
    /// </summary>
    public class BattleStore
    {
        public BattlePartyView Party { get; private set; }
        public BattleEnemyView Enemy { get; private set; }
        public ActionResult InBattleResult { get; set; }
        public ActionDisplayView ActionDisplay { get; private set; }
        public View.MoneyView MoneyDisplay { get; private set; }
        public Model.Money Money { get; private set; }
        public void Initialize(){
            // それぞれfindしたりなど
            // PureClassはここで生成したりなど
            Money = new Money();
        }
    }

    public class Hoge {
        private BattleStore store;
        private Model.Money money;
        void Start(){
            var party = store.Party;
            money = store.Money;
            // ほげほげ
        }
    }
}

こういうのを用意して、全部Store経由で取ってたりした。 流石に将来的にしんどくなる気がしたので、ここにZenjectを導入して、データは極力直接injectする方針に変更した

github.com

namespace Game.DI
{
    public class BattleInstaller : MonoInstaller<BattleInstaller>
    {
        public override void InstallBindings()
        {            
            Container.Bind<Model.Money>().FromNew().AsSingle();
        }
    }
}

public class Hoge {
    [Inject]
    private BattlePartyView party;
    [Inject]
    private Model.Money money;
    void Start(){
        // ほげほげ
    }
}
  • Storeが不要になった
  • PureClassの生成はInstallerに移行できたので置き場所がわかりやすくなった

コード量がだいぶ減って見やすくなったのだった。 まだ使いこなせたとは言い難いけど、現状でも十分便利。

BehaviorDesignerを導入

敵キャラの行動パターンは、完全なランダムで技を繰り出すだけだったので細かい思考を調整できるようにしたかった。

なので、昔に買ったけど放置していたBehaviorDesignerを導入することにした。

https://www.assetstore.unity3d.com/jp/#!/content/15277

BehaviorTreeを作ること自体はじめてだったけど、その辺はググりながらでサッと解決した。

上記のTreeは以下の思考パターンになってる

  • HPが30%より大きかったら、「たいあたり」「れんぞくたいあたり」のどちらかを繰り出す
  • HPが30%以下だったら、「すごいいちげき」「あばれる」のどちらかを繰り出す

いわゆる、ピンチになると発狂する挙動だけど、これくらいなら数分で書けるので非常に便利。そして楽しい

自前の戦闘システムに組み込むため、攻撃を行うActionとHPをチェックするConditionalは自分で実装した。 この辺りは仕組みが簡単なので割と量産しやすそう。

今のところ敵キャラだけに実装してるけど、味方もBehavior Treeで動けるような仕組みにはするので、HPが低かったら回復とかいい感じに思考してくれるやつをこれから作る予定。

裏側はだいぶよくなったので、そろそろ見えるとこも直していこう・・。