データフロー


こちらはArbor 3.2.4以前のドキュメントです。

最新ドキュメントはArbor Documentationをご覧ください。

Arborにはグラフのノード間でデータを受け渡すための機能が備わっています。

データの流れ

データの入出力スロットを接続するとデータフローを活用できます。

組み込みスクリプトを使用した例では以下のようなデータフローが簡単に組めるようになっています。

  1. InstantiateGameObjectでプレハブをインスタンス化。
  2. インスタンス化したGameObjectを出力。
  3. Rigidbody.GetでRigidbodyコンポーネントを取り出し。
  4. AddForceRigidbodyで受け取ったRigidbodyに力を加える。

また、例ではArborFSMを使用していますが、BehaviourTreeでも同様にデータの受け渡しができます。

参考リンク

データスロットの使い方

接続

  • データスロットのフィールドをドラッグ。
  • 同じ型の対となるスロットにドロップ。
GIF

切断

  • 接続ラインを右クリック。
  • 「切断」を選択
GIF

FlexibleField

FlexibleField関連クラスのフィールドでは、複数の参照方法を選択できますので柔軟に値が設定できます。

指定方法の選択

  • フィールド横のボタンをクリック。
  • タイプを選択。
GIF

タイプ

項目 内容
Constant 定数値。
Parameter パラメータを参照する。
パラメータについては マニュアル : ParameterContainer を参照してください。
Random(数値型のみ) 指定範囲の中からランダムに取得する。
DataSlot データの入力スロット。

リルートノード

リルートノードを使用すると、データフローのラインを整理しやすくなります。

リルートノードを作成して接続

  • データスロットのフィールドをドラッグ。
  • リルートノードを作成したいグラフ内の位置でドロップ
  • メニューの”リルート”を選択
GIF

リルートノード挿入

  • 接続ライン上のリルートノードを作成したい位置を右クリック。
  • メニューの”リルート”を選択。
GIF

リルートノードの方向変更

  • 方向を変更するリルートノードを選択
  • 表示される方向アイコンをドラッグして方向を変更。
GIF

接続ラインについて

値表示

プレイ中に接続ラインをマウスオーバーすると、現在値が表示されます。

GIF

また、接続ラインの右クリックメニューから「データ値を常に表示」を選択すると、マウスオーバーしなくても表示されるようになります。

全ての接続ラインの値を表示したい場合は、ツールバーの「デバッグ」メニューから「すべてのデータ値を表示」を選択すると切り替わります。

右クリックメニュー

接続ライン上を右クリックすると、メニューが表示されます。

項目 内容
データ値を常に表示 プレイ時にデータ値を常に表示します。
リルート リルートノードを挿入します。
切断 切断します。

演算ノードについて

演算ノードはデータの入出力を持った演算用ノードです。

数値計算を行ったりフィールドにアクセスして出力したりできます。

演算ノードの作成

  • Arbor Editorの適当な位置を右クリック。
  • 「演算ノード作成」をクリック。
    作成したい演算ノードをリストから選択
    GIF

組み込みCalculator

よく使用する演算ノードは初めから用意されています。

Arborリファレンス : Calculator リファレンス

スクリプティング

出力スロット

OutpotSlotIntなどの出力スロットを宣言することでデータ出力ができます。

スクリプト例

TestOutputSlotBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

using UnityEngine;
using Arbor;

[AddComponentMenu("")]
public class TestOutputSlotBehaviour : StateBehaviour
{
	public OutputSlotInt outputSlot;

	public override void OnStateBegin()
	{
		outputSlot.SetValue(Random.Range(100, 200));
	}
}

このスクリプトをArborFSMのステートに追加すると以下のようになります。

出力スロットクラス

入力スロット

InputSlotIntなどの入力スロットを宣言することでデータ出力ができます。

スクリプト例

TestInputSlotBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

using UnityEngine;
using Arbor;

[AddComponentMenu("")]
public class TestInputSlotBehaviour : StateBehaviour
{
	public InputSlotInt inputSlot;

	public override void OnStateBegin()
	{
		int intValue = 0;
		if (inputSlot.GetValue(ref intValue))
		{
			Debug.Log("inputSlot : " + intValue);
		}
		else
		{
			Debug.LogWarning("inputSlot : not connected.");
		}
	}
}

このスクリプトをArborFSMのステートに追加すると以下のようになります。

入力スロットクラス

FlexibleField

入力スロットだけでなく、固定値やパラメータも扱いたい場合はFlexibleFieldが便利です。

スクリプト例

TestFlexibleFieldBehaviourスクリプトファイルを作成し、以下のコードを記述してください。

using UnityEngine;
using Arbor;

[AddComponentMenu("")]
public class TestFlexibleFieldBehaviour : StateBehaviour
{
	public FlexibleInt flexibleInt;

	public override void OnStateBegin()
	{
		Debug.Log("flexibleInt : " + flexibleInt.value);
	}
}

このスクリプトをArborFSMのステートに追加し、参照タイプをCalculatorにすると以下のようになります。

FlexibleField関連クラス

スロットの型制約

InputSlotAnyInputSlotComponentなどでは型制約を属性で指定できます。

スクリプト例

using UnityEngine;
using Arbor;

[AddComponentMenu("")]
public class TestConstraintSlotBehaviour : StateBehaviour
{
	[ClassExtends(typeof(AudioSource))]
	public InputSlotComponent audioSource = new InputSlotComponent();

	[ClassExtends(typeof(AudioClip))]
	public InputSlotUnityObject audioClip = new InputSlotUnityObject();

	[ClassExtends(typeof(AudioSourceCurveType))]
	public InputSlotAny audioSourceCurveType = new InputSlotAny();

	public FlexibleAnimationCurve curve = new FlexibleAnimationCurve(AnimationCurve.Linear(0, 0, 1, 1));

	public override void OnStateBegin() {
		AudioSource source_ = audioSource.GetValue<AudioSource>();
		AudioClip clip_ = audioClip.GetValue<AudioClip>();
		AudioSourceCurveType curveType_ = AudioSourceCurveType.CustomRolloff;
		audioSourceCurveType.GetValue<AudioSourceCurveType>(ref curveType_);

		AnimationCurve curve_ = curve.value;

		if (source_ == null || clip_ == null)
		{
			return;
		}

		source_.clip = clip_;
		source_.SetCustomCurve(curveType_, curve_);
	}
}

使用できる属性

クラス 属性
OutputSlotAny
InputSlotAny
InputSlotComponent

指定の他、Componentクラスに制約される。

InputSlotUnityObject

指定の他、UnityEngine.Objectクラスに制約される。

FlexibleComponent

指定の他、Componentクラスに制約される。

カスタマイズ

データスロットの作成

自作したクラスのデータスロットも作成できます。

詳しくは、「データスロットのカスタマイズ」を参照してください。

マニュアル : データスロットのカスタマイズ

Variable

パラメータも作成する場合は、Variable Generatorを使用すると楽に作成できます。

詳しくは、「Variableによるパラメータのカスタマイズ」を参照してください。

マニュアル : Variableによるパラメータのカスタマイズ

演算ノード

演算ノードに使用するスクリプトも作成できます。

詳しくは、「演算ノードのカスタマイズ」を参照してください。

マニュアル : 演算ノードのカスタマイズ