週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

Arbor3について雑に解説してみる

みなさん、こんにちは。ぽうひろです。

この記事は アセット真夏のアドカレ2019 8/5 の記事になります。

先日のUnity1week で作成した「にゃん友ワンだふる」でも使用しました
VisualScriptingアセット「Arbor3」について使用感などふくめて雑に解説していこうと思います。

assetstore.unity.com


unityroom.com

にゃん友ワンだふる
にゃん友ワンだふる

VisualScriptingということで、C#のプログラムを書かずにイマドキの命令ブロックをつなげていくような形で
プログラムを作成していくことができます。

にゃん友ワンだふるでは、障害物となる車の生成、移動処理に使用しました。

f:id:pouhiroshi:20190802190853g:plain
緑の四角アイコンが表示されているのがArborがついているGameObject

やりたかったこととしては、「ランダム間隔で車オブジェクトを作成(Instantiate)し、進行方向を向かせて、そのあとは移動させる」
というものです。

まず最初にArbor3で制御したいGameObjectにArbor FSMコンポーネントをつけます。

f:id:pouhiroshi:20190802191436p:plain
ここではVehicleSpawnという空のGameObjectにArbor FSMコンポーネントをつけています

はい、準備はこれだけ。
Open Editorというボタンが付いていますので、これを押すとArborのビジュアルプログラミングEditorが開きます。

車を作成(スポーン)して進行方向へ向かせる。それをランダム間隔で繰り返す。

f:id:pouhiroshi:20190802191912p:plain

これが「ランダム間隔で車オブジェクトを作成(Instantiate)し、進行方向を向かせる」までのプログラムです。

Initという右上のブロックが初期状態です。
TimeTransitionというブロックをつかっていますが、これはある時間seconds(秒)が経過したらNext Stateでにつながっている状態に遷移してくれます。
secondsに左上のRandom.Range FloatからOutputでつながっていますが、Random.Range Floatは最小(Min)から最大(Max)までのFloat値を返してくれます。
ランダム間隔でというのはこれを使って実現しています。

次の状態は Instantiate(コピーを作成する)ですね。
Instantiate Game Objectは文字通りGameObjectを作成してくれます。
Prefabには作成したいPrefabを指定します。この場合は車を作成したのでバスのPrefabを指定しています。

Instantiateしたあとは、車を進行方向へ向かせます。
ここでつかうのはTransform Set Rotationで回転させるブロックです。
回転対象物のTransformを繋げる必要があるのですが、 Instantiate Game ObjectブロックでOutputされるのは GameObject型です。
そのため、Transform.Get ブロックを通してTransformを得て、つなげています。

そのあとにつけているのは Go To Transitionというブロックで、Next Stateにつなげた状態に状態遷移させます。
ここではずっと繰り返し処理させたいのでInitへ戻しています。

一定速度で移動させる

さて、これだけだと車は移動してくれません。
次は車を勝手に動かすようなArborプログラミングをつけてみます。
f:id:pouhiroshi:20190802194535p:plain
さきほどInstantiateする対象にした車のPrefabにArbor FSMをつけます。

f:id:pouhiroshi:20190802194318p:plain
たったこれだけ

はい、たったこれだけです。
Transform Translateは、Velocityに指定した移動量で移動しつづけてくれます。
動かす対象はTransformで指定します。

UnityEditorで動作しながら状態遷移が確認できる

f:id:pouhiroshi:20190802195525g:plain

UnityEditorで動作しながらArborの状態遷移が確認できます。
黄色くなっているところがいまの状態です。Instantiateは一瞬で終わるので、パッと見黄色く見えませんね^^;
その代わり、ブロックの右上にその状態になった回数が出ていますので、その数字が増えているので
ちゃんと状態遷移しているのがわかると思います。
ブロックにブレイクポイントをいれて処理を止めることもできますし、とてもデバッグがしやすいです。

まとめ

ランダム時間間隔で何か処理をさせる、みたいな処理をプログラムで書く場合、
タイマー変数を用意して、Time.deltaTimeで増やして〜、みたいな意外な面倒な手順を踏むことになりますが、
Arborをつかえば簡単に作ることができます。
それに加えて、状態遷移になっていて後から見返したときに何をしているのか、わかりやすいです。
自分でつくったロジックをいつもすっかり忘れてしまうというアナタにとてもおすすめなアセットです!w
作者さんが頻繁にアップデートしているようなので、今後もとても安心です。
ぜひ、使ってみてください!