UnityのアセットのArbor: State Diagram Editorを少し使ってみた

Arbor: State Diagram Editor – Asset Store

2015夏のアセットレビューキャンペーンの為少し触ってみた後、8月はコミケもYAPCもあったり仕事も忙しくて、なかなか書けずにいました。
途中までは書いてたんですが、結局ギリギリになってしまいました。

ArborはFSMベースのビジュアルスクリプティングエディタらしいです。
FSMはfinite state machineで、有限オートマトンとかステートマシンとかとも呼ばれるやつの事みたいだけど、FSMと聞いてあれかと分かるほどは知りません。
数が多すぎたり複雑になるGameObjectの状態の管理を、ステートマシンに任せるようにして、その状態と遷移をGUIで書いて編集できるのがArborという感じだと思います。

Arborで検索すると、軽く使ってみた記事より、ちょっと高度な使い方をしてる記事ばかりなのもあって、最初がとっつきにくい感じはしたけど、慣れれば便利そうな印象です。
後にも書いてるけど、既存のMonoBehaviourを継承して作ったスクリプトも、ちょっと変えれば使えそう。

構成要素

Behaviourリファレンス | Arbor: State Diagram Editor

構成要素としては、3つのComponentと、沢山のBehaviourから成るようです。

Component

ArborFSMをアタッチしたGameObjectが、どうやらArborのステートマシンに状態管理を任せる事になるみたい。
AgentControllerParameterContainerは、よく分かってないけど、少し応用的な使い方をする際に使うものっぽい感じがします。

Behaviour

ArborのBehaviourはStateBehaviourを継承して作られてるもので、Arborを使ってゲームを作るなら、自分でもStateBehaviourを継承して作成します。
GameObjectにアタッチするMonoBehaviourに対し、状態にアタッチするもので、その状態での、GameObjectの振る舞いを決めるものと、考えていいんじゃないかと思います。

StateBehaviourはMonoBehaviourを継承しており、GameObjectにアタッチする感覚でステートにアタッチして使えるようになっています。
ベースがMonoBehaviourであるため、Unityでのスクリプト作法やゲームオブジェクトとの連動、プレハブ化対応などは従来どおりの手法で問題ありません。
また、何らかのパラメータを用意したいときも、publicか[SerializeField]で宣言すればArbor Editor上で編集可能になります。
コーディング編 | Arbor: State Diagram Editor

とあるように、MonoBehaviourを継承して作っていた自作のスクリプトを、ArborのStateBehaviourを継承したものに作り変えるのは、そんなに難しくは無さそうです。

Get started

基礎編 | Arbor: State Diagram Editor

公式にチュートリアルがあるけど、なぜか基礎編は動画な上に音がないので、ちょっと分かりにくかったです。

ArborFSMをアタッチ

まず、Arborのステートマシンに、状態の管理を任せたいGameObjectに、ArborFSMをアタッチします。
あとは、Arbor Editorウィンドウを開いて、ステートを作ったり、遷移を設定したり出来ます。

Arbor Editor

Arbor Editorを開いたら右クリックからステート作成をし、出て来たステートの右にある歯車アイコンから挙動追加で、ステートにBehaviourをアタッチする流れです。
状態を遷移させるTransision系のBehaviourからは、遷移先のステートを、ドラッグで矢印付きの線をつなぐ操作で、指定出来ます。

20150831233105-231

例えば、初期状態ステートから1秒経過すると、2倍になるステートに遷移し、2秒かけてScaleを1から2にするという感じです。

あとは、組み込みのBehaviourでどんな事が出来るのか把握し、組み合わせていったり、欲しい振る舞いが全部揃ってるなんて事はないので、StateBehaviourを継承して自作したりして、ゲームを作っていく。まだ、Agentとか、気になる要素も残ってるけど。

他、気になった所をいくつか

Transisionとそれ以外

この辺が、特に把握するのに時間がかかったんですが、Arbor組み込みのBehaviourは、Transision系とそれ以外に大きく分ける事が出来ると思います。

わざわざステートマシンを使うからには、いくつかの状態があるはずで、状態があればプレイに応じて遷移しないと意味がないはずです。
組み込みBehaviourの中で、この状態を遷移を担当してるのがTransision系のBehaviourみたいです。

他のBehaviourは、音を鳴らしたり、GameObjectをActivateしたり壊したり生成したり、シーンをロードしたり、Tweenで色を変えたり動かしたりと、GameObjectの活動的な振る舞いになってます。

別の状態に遷移するのも振る舞いの一つといえばそうなので、分かってしまえば納得ではあるけど、Transision系だけが状態を遷移するというのは、最初はポイントとして知りたい所だと想いました。

振る舞いが終わったら遷移

まだ軽く触っただけですが、どうやら振る舞いが終わったら遷移という機能は無さそうです。
TweenScaleBehaviourで、2秒かけて2倍の大きさになる振る舞いをステートにアタッチし、終わったら次のステートに遷移したい場合は、TimeTransitionBehaviourで2秒後に遷移させる感じになるっぽい。
ちなみにTimeTransitionBehaviourを1秒後にしてみたら、TweenScaleBehaviourが2秒であっても、1秒後に次の状態に遷移しました。
拡大も、大体1.5倍の所で止まってます。

他のGameObjectの状態を遷移

SendTriggerBehaviourとTriggerTransisionBehaviourを使います。
GameObject Aが2倍のサイズになったら、次はBを2倍にしたい様な時、Aが2倍になった後の状態をトリガーとして、Bの状態を遷移させる事が出来ます。

  1. まずは2つのGameObjectにArborFSMをアタッチ。
  2. Arbor Editorで、Aが2倍になった後のステートにSendTriggerBehaviourをアタッチ。
  3. BのステートにTriggerTransisionBehaviourをアタッチ。
  4. SendTriggerBehaviourとTriggerTransisionBehaviourのMessageを同じものに設定。

こんな感じで出来ました。

20150831233021-228

orcguardtowerというGameObjectのステート図です。
2倍になったステートでは、orcguardtower_2というTargetにfooというメッセージを送ってます。
fooとか的当すぎるし、TargetのGameObject名が入りきってないので、わかりにく画像だけど・・・

20150831233042-229

orcguardtower_2のステート図です。
こっちでは、初期状態ステートでfooというメッセージを受け取ったら、2倍になるステートに遷移します。

環境

環境 バージョン
Unity 5.1.2f1
Arbor 1.7.4

書いた日

2015年8月31日頃

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>