6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

unityでreduxアーキテクチャを使った堅牢なシーケンス制御の実装

Last updated at Posted at 2017-09-30

#はじめに
リアクティブスパゲッティ好きですか?僕は苦手です!
Reduxアーキテクチャをゲーム用にアレンジしてバグのないゲーム制作を楽しみましょう!

Reduxアーキテクチャって何?という人はこちらをどうぞ
https://qiita.com/kiita312/items/49a1f03445b19cf407b7

「ゲームプログラマになる前に読む本」を読んだ人はstoreってstatemachineのことなんじゃ…と思うでしょう
はい、僕はstatemachineと捉えました!

#sample code
https://github.com/masak2/redux_custom
state_info.jpg

#動かしてみよう
2017-09-30_23h30_16.png

実行してみればわかりますが
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はゲーム用途ではないためやはり使いづらい…

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?