#はじめに
リアクティブスパゲッティ好きですか?僕は苦手です!
Reduxアーキテクチャをゲーム用にアレンジしてバグのないゲーム制作を楽しみましょう!
Reduxアーキテクチャって何?という人はこちらをどうぞ
https://qiita.com/kiita312/items/49a1f03445b19cf407b7
「ゲームプログラマになる前に読む本」を読んだ人はstoreってstatemachineのことなんじゃ…と思うでしょう
はい、僕はstatemachineと捉えました!
#sample code
https://github.com/masak2/redux_custom
実行してみればわかりますが
wait3secボタンを押してから httpボタンを押しても何も起きません
3秒経過してidle stateに戻ってからでないと遷移が起きないのです!
statemachineだから当然ですね
そしてこれがいいんです!
ボタン押されたコールバックに直接ロジックを書くとどうなるでしょう?
wait3secボタンを押してからhttpボタン押すと通信始まってしまいます!
httpボタン押してからwait3secボタン押すと待ち処理始まってしまいます!
よくある同時押しバグ、通信中に別の処理できちゃったバグのオンパレードです
#本家reduxとの違い
生成されたactionをdispatchせずactionBlackboardに登録しておくことです
そして各stateがactionBlackboardに登録されたactionを評価するのです
間髪入れずactionをdispatchしてしまうと同一フレームにおいて発生したactionが順番に評価されてしまうためバグの温床になってしまいます
#メリット、デメリット
メリットはなんといっても堅牢さ
シーケンス制御にからむ進行不能バグは発生しません
コルーチンと違いブレークポイントで簡単に止められるためデバッグも容易です
デメリットは冗長さと可読性の悪さ
1秒待つのにもstateを用意しなくてはいけないのは退屈です
コルーチンならyield return new WaitForSecond(1f)一行です
またコルーチンやunirxに比べて可読性も悪くなりがちです
この辺はクラスベースのstatemachineにするとか
arbor2使ってみるとかで対応するのはどうでしょうか?
#まとめ
やっぱりstatemachine最高ですね!!!
現実のプロジェクトでは階層型statemachineを使うことになります
未だイケてる実装を見たことがありません
Artifical Intelligencs for gamesのHSM c++実装が一番近いけど使いづらかった…
nugetにあるHSMはゲーム用途ではないためやはり使いづらい…