こちらはArbor 3.2.4以前のドキュメントです。
最新ドキュメントはArbor Documentationをご覧ください。
「Arbor 3: FSM & BT Graph Editor」について
- Unityで有限ステートマシンやビヘイビアツリーを使ってゲーム作りたい!
- だけど、ゲームロジックに依存する挙動は自分でコーディングしたい!
- そんな時に使えそうな有限ステートマシンとビヘイビアツリーのグラフ編集ウィンドウと、
作りたい挙動にあわせてスクリプトを書けるシンプルなグラフエディタアセットです。
有限ステートマシン(FSM)とは?
- 有限ステートマシンとは、ある状態での挙動と、その状態から別の状態へ遷移する仕組みです。
- たとえば、スイッチと電灯。
- スイッチと電灯にはONとOFFという状態があり、スイッチをONにすれば電灯もONになります。
- スイッチは押せばONに切り替わり、再度押すとOFFに切り替わる挙動です。
- 電灯はONであれば明かりを灯す挙動になります。
詳しくは「ステートマシン」を参照してください。
ビヘイビアツリー(BT)とは?
- 行動の優先度と行動を行う条件をセットで扱えるようにした挙動の木構造です。
- たとえば、敵AIを考えてみましょう。
- プレイヤーに近づく挙動はプレイヤーとの距離が近ければ行う。
- それ以外の時は決まった経路を巡回する。
- プレイヤーに近づく挙動は決まった経路を移動する挙動に比べて優先度が高いと言えます。
詳しくは「ビヘイビアツリー」を参照してください。
Arborを入手する
Arborを使用するための準備
プロジェクト作成
Arborを使用するプロジェクトがまだない場合は新規に作成する必要があります。
プロジェクトの作成方法についての詳細はUnity ManualのGetting startedを参照してください。
「Asset packages」ボタンからArborを選択することで後で行うインポート作業を省略できます。
リストにArborパッケージが見つからない場合は後述の「Arborのインポート」を参照してください。
最後に「Create Project」ボタンを押してプロジェクトを作成します。
Arborのインポート
「プロジェクト作成」にてArborパッケージを入れなかった場合や、すでにあるプロジェクトにArborをインポートする際にこの作業が必要になります。
Arborをインポートするために、まずAssetStoreウィンドウを表示します。
メニューから、「Window > Asset Store」を選択するか、ショートカットのCtrl + 9を押してください。
AssetStoreウィンドウが表示されたらツールバーの「My Downloads」ボタンをクリックしダウンロード一覧に切り替えます。
「購入済み」をクリックし、リストからArborパッケージを見つけてください。
「ダウンロード」ボタンが表示されている場合はクリックしてダウンロードを開始します。
「インポート」ボタンをクリックするとImport Unity Packageウィンドウが表示されます。
ウィンドウ右下のImportボタンをクリックすることでインポート完了です。
使い方
ステートマシン
ArborFSMはステートマシンを制御するコンポーネントです。
GameObjectにArborFSMを追加し、ArborEditorウィンドウでStateなどのノードを設定することでゲーム内ロジックを組めるようになります。
ビヘイビアツリー
BehaviourTreeはビヘイビアツリーを制御するコンポーネントです。
GameObjectにBehaviourTreeを追加し、ArborEditorウィンドウでActionNodeなどのノードを設定することでゲーム内ロジックを組めるようになります。
グラフ共通の使い方
ノードの名前変更
- ノード枠内上部にあるヘッダ部分をダブルクリック、あるいは右クリックか設定アイコンから「リネーム」を選択。
表示されたテキストボックスに入力。
ノードの削除
- 削除したいノードを選択。
- 何もない箇所を右クリックし「削除」を選択、もしくはDeleteキーを押す。
マニュアルを開く
組み込みスクリプトやBehaviourHelp属性をつけたスクリプトは、マニュアルを開くヘルプアイコンが表示されます。
値の指定方法を選択する
- 各プロパティのフィールド横にマークがついている場合、クリックすることで値の指定方法を選択できる。
- 値の種類によって選択項目は異なりますが、主にあるのは以下の通り。
- Constant
固定値を指定する - Parameter
パラメータを参照する。
パラメータについては後述の「ParameterContainerについて」を参照してください。 - Random
指定範囲の中からランダムに取得する。 - Calculator
演算ノードからの入力を受け付ける。
演算ノードについては後述の「演算ノードについて」を参照してください。
- Constant
データフロー
Arborにはノード間のデータを受け渡す機能が備わっています。
また、簡単な演算を行うための演算ノードも使用できます。
詳しくは「データフロー」のページを参照してください。
ParameterContainerについて
ParameterContainerはグラフ間でのデータの共有などを行うために使用するコンポーネントです。
詳しくは「ParameterContainer」ページを参照してください。
コーディング
C#、JavaScript、一応Booのスクリプトを作成して自作の挙動や演算処理を用意できます。
StateBehaviourスクリプトファイルの作成
- Projectウィンドウから作成したい場所で右クリック。
- 右クリックメニューから、「Create > Arbor > StateBehaviour C# Script」を選択。
- ファイル名を入力して決定
ステートの接続
- 作成したスクリプトにpublicもしくはSerializeField属性をつけたStateLinkを宣言する。
宣言すれば自動的にArbor Editorで編集可能になる。using UnityEngine; using Arbor; public class TestBehaviour : StateBehaviour { public StateLink nextState; // 略 }
-
遷移したいタイミングでTransitionを呼ぶ。
Transition( nextState );
演算ノードからの入力
- 作成したスクリプトにpublicもしくはSerializeField属性をつけたInputSlotIntやInputSlotFloatなどを宣言する。
(ジェネリッククラスのInputSlot<T>はUnityの仕様上シリアライズされないため、かならず継承したクラスを使用してください)
宣言すれば自動的にArbor Editorで編集可能になる。using UnityEngine; using Arbor; public class TestBehaviour : StateBehaviour { public InputSlotInt slotInt; // 略 }
- 値を取得するにはGetValueメソッドを使用する。
int data = 0; slotInt.GetValue(ref data); if (data == 10) { Debug.Log("Test"); }
演算ノードからの入力(Flexible)
- 作成したスクリプトにpublicもしくはSerializeField属性をつけたFlexibleIntやFlexibleFloatなどを宣言する。
using UnityEngine; using Arbor; public class TestBehaviour : StateBehaviour { public FlexibleInt flexible; // 以下略 }
- 値を取得するにはvalueプロパティを使用する。
if (flexible.value == 10) { Debug.Log("Test"); }
演算ノードへの出力
- 作成したスクリプトにpublicもしくはSerializeField属性をつけたOutputSlotIntやOutputSlotFloatなどを宣言する。
(ジェネリッククラスのOutputSlot<T>はUnityの仕様上シリアライズされないため、かならず継承したクラスを使用してください)
宣言すれば自動的にArbor Editorで編集可能になる。using UnityEngine; using Arbor; public class TestBehaviour : StateBehaviour { public OutputSlotInt slotInt; // 以下略 }
- 値を設定するにはSetValueメソッドを使用する。
slotInt.SetValue(10);
エディタ拡張
- Unityで使用可能なインスペクタ拡張やPropertyDrawerなどがStateBehaviourにも使用できる
注意点
- MonoBehaviourのenabledは実行制御のために内部で使用しているため、代替となるbehaviourEnabledを使用してください。
次のステップへ
- チュートリアル
Arborの基本的な使い方を紹介しているチュートリアルです。 - Componentリファレンス
主なComponentについてのリファレンス - Behaviourリファレンス
組み込み済みの挙動についてのリファレンス - スクリプトリファレンス
スクリプトに関するリファレンス