【Unity】ArborとuGUIの連携について
先日紹介したビジュアルFSMアセットのArborですが、今回はuGUIと連携してみました。
uGUIとの連携のキモとなるのはUnityEventとの連携ですが、UnityEventにArborFSMを持つオブジェクトをuGUIのイベントに登録すると、そこからイベントを受け取れます。
例えばスライダーの場合、ステートのスクリプトがfloatの引数を持つメソッドやfloatのプロパティを持つ場合、ふつうにイベント登録出来ました。下のGifアニメは、数字を見てステートの切りかえを行っています。
実際の手順はこんな感じです。
まず、ProjectビューのCreate > Arbor > C# Script でステートのスクリプトを作成します。こっちの方法で作成すると、Arborを動かすのに必要な幾つかのコールバックが最初から定義されていて便利です。名前はUIButtonTransitionとかにしておきます。
コードは、イベントを受け取ったら他のステートへ切り替えるイメージです。
FSMステートを作成し、作ったコードをドラッグ&ドロップでステートに登録します。
まずはオブジェクト(今回はCanvas)にArborFSMコンポーネントを追加し、OpenEditorをクリックします。すると、FSM編集画面に飛びます。
FSMにステートを追加するには、右クリックして「ステート作成」です。で、作成したステートに、先ほど作成したスクリプトをドラッグ&ドロップして登録します。「挙動を追加」でも設定できるのですが、多分ステートが増えてくるとこっちの方が楽と言えば楽になるかもしれません。AddComponentみたいなコードの検索無いですし。
あとはCanvasをボタンのOnClickイベントに登録すると、コンポーネントの中からOnClickのイベントを確認できます。
ただ実際にイベントを制御する場合、この方法は良くないです。というのも、Arborはオブジェクトに同名のコンポーネントが複数設定される可能性があるので、この最終的に文字列アクセスになる方法は避けた方が良いです。そのため、実行時にOnClickリスナーに登録するアプローチの方が良いです。
ArborはSerializeFieldでオブジェクトをシリアライズ可能にするとステートに入力欄を表示してくれます。上記のコードは、そこにイベントを登録したいボタンを設定すると、実行時(ステートが有効になった時)にボタンが反応するように設定しています。
後はもう一つステートを作成し、トランジション(今回の場合はNextStateを次のステートへドラッグ&ドロップ)を設定すると、ボタンが押されたタイミングでステートが切り替わるようになります。
文章にすると長くなりますが、実際に操作するとサクっと理解できるかなと思います。さらにステートを足すことで「ボタンを押したら指定秒後に何かする」や「切り替え時に音・アニメーションを設定する」といった事も可能みたいです。
実際この粒度で使うとステートマシン地獄で死ぬと思うので、もっと処理をまとめたりする必要があるとは思います。ステートやトランジションの検索があれば、もう少し細かくしても良いかもしれませんが、限度がありますし。
(でもuGUIのボタンぐらいはあっても良い気もしなくも)
Arborにステートリストと検索を実装してみた pic.twitter.com/94tTG1vUDl
— ケットシーウェア (@CaitSithWare) 2015, 8月 8
もう実装したのか!早い!来た!メイン検索機能来た!これで多分かつる!
「ボタンをクリックしてゲームを開始→ボタンをクリックすると玉が補充される→しばらくすると底が抜ける」のステート切り替え。 pic.twitter.com/7lHT7vL9iP
— 椿 (@tsubaki_t1) 2015, 8月 8